Java类与对象 #

一、面向对象概述 #

1.1 什么是面向对象 #

面向对象编程(OOP)是一种编程范式,它使用"对象"来设计程序。对象包含数据(属性)和代码(方法)。

1.2 面向对象三大特性 #

  • 封装:隐藏内部实现细节
  • 继承:复用和扩展已有类
  • 多态:同一接口不同实现

二、类的定义 #

2.1 类的基本结构 #

java
public class Person {
    // 成员变量(属性)
    private String name;
    private int age;
    
    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 成员方法
    public void sayHello() {
        System.out.println("你好,我是" + name);
    }
    
    // getter和setter
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
}

2.2 类的组成 #

java
public class ClassName {
    // 1. 成员变量(字段)
    private String field1;
    public int field2;
    
    // 2. 静态变量(类变量)
    private static int count;
    
    // 3. 构造方法
    public ClassName() {
    }
    
    // 4. 成员方法
    public void method1() {
    }
    
    // 5. 静态方法
    public static void method2() {
    }
    
    // 6. 代码块
    {
        // 实例代码块
    }
    
    // 7. 静态代码块
    static {
        // 静态代码块
    }
}

三、对象的创建 #

3.1 使用new关键字 #

java
// 创建对象
Person person = new Person("张三", 25);

// 调用方法
person.sayHello();

// 访问属性(通过getter)
String name = person.getName();

3.2 对象内存分析 #

java
Person p1 = new Person("张三", 25);
Person p2 = new Person("李四", 30);

// 栈内存:存储p1、p2引用变量
// 堆内存:存储两个Person对象
// p1和p2指向不同的对象

3.3 对象比较 #

java
Person p1 = new Person("张三", 25);
Person p2 = new Person("张三", 25);

// == 比较引用地址
System.out.println(p1 == p2);  // false

// equals比较内容(需要重写)
System.out.println(p1.equals(p2));  // 取决于equals实现

四、成员变量 #

4.1 实例变量 #

java
public class Student {
    // 实例变量:属于对象
    private String name;
    private int age;
    
    // 每个对象有独立的实例变量
}

4.2 静态变量 #

java
public class Student {
    // 静态变量:属于类,所有对象共享
    private static int totalCount = 0;
    
    public Student() {
        totalCount++;
    }
    
    public static int getTotalCount() {
        return totalCount;
    }
}

4.3 变量初始化 #

java
public class Demo {
    // 实例变量有默认值
    private int num;        // 0
    private double price;   // 0.0
    private boolean flag;   // false
    private String name;    // null
    
    // 显式初始化
    private int count = 10;
    
    // 静态变量
    private static int total = 0;
}

五、成员方法 #

5.1 实例方法 #

java
public class Calculator {
    // 实例方法:需要通过对象调用
    public int add(int a, int b) {
        return a + b;
    }
    
    public int subtract(int a, int b) {
        return a - b;
    }
}

// 调用
Calculator calc = new Calculator();
int result = calc.add(10, 20);

5.2 静态方法 #

java
public class MathUtils {
    // 静态方法:通过类名调用
    public static int max(int a, int b) {
        return a > b ? a : b;
    }
    
    public static int min(int a, int b) {
        return a < b ? a : b;
    }
}

// 调用
int max = MathUtils.max(10, 20);

5.3 方法参数 #

java
public class Demo {
    // 基本类型参数:值传递
    public void changeValue(int num) {
        num = 100;  // 不影响原变量
    }
    
    // 引用类型参数:引用传递
    public void changeArray(int[] arr) {
        arr[0] = 100;  // 会修改原数组
    }
    
    // 可变参数
    public int sum(int... nums) {
        int total = 0;
        for (int num : nums) {
            total += num;
        }
        return total;
    }
}

5.4 方法重载 #

java
public class Calculator {
    // 方法重载:方法名相同,参数列表不同
    public int add(int a, int b) {
        return a + b;
    }
    
    public double add(double a, double b) {
        return a + b;
    }
    
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

六、this关键字 #

6.1 引用当前对象 #

java
public class Person {
    private String name;
    
    public Person(String name) {
        // this区分成员变量和参数
        this.name = name;
    }
    
    public void introduce() {
        System.out.println("我是" + this.name);
    }
}

6.2 调用其他构造方法 #

java
public class Person {
    private String name;
    private int age;
    
    public Person(String name) {
        this(name, 0);  // 调用另一个构造方法
    }
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

6.3 调用当前对象的方法 #

java
public class Demo {
    public void method1() {
        System.out.println("method1");
    }
    
    public void method2() {
        this.method1();  // 调用当前对象的方法
        System.out.println("method2");
    }
}

七、访问控制 #

7.1 访问修饰符 #

修饰符 同一类 同一包 子类 其他
public
protected
默认
private

7.2 使用示例 #

java
public class Person {
    // private:只能在本类访问
    private String name;
    
    // protected:子类和同包可访问
    protected int age;
    
    // 默认:同包可访问
    String address;
    
    // public:任何地方可访问
    public String phone;
    
    // 通过getter/setter访问私有属性
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

八、代码块 #

8.1 实例代码块 #

java
public class Demo {
    private int num;
    
    // 实例代码块:每次创建对象时执行
    {
        num = 10;
        System.out.println("实例代码块执行");
    }
    
    public Demo() {
        System.out.println("构造方法执行");
    }
}

8.2 静态代码块 #

java
public class Demo {
    private static int count;
    
    // 静态代码块:类加载时执行一次
    static {
        count = 0;
        System.out.println("静态代码块执行");
    }
}

8.3 执行顺序 #

java
public class Demo {
    static {
        System.out.println("1. 静态代码块");
    }
    
    {
        System.out.println("2. 实例代码块");
    }
    
    public Demo() {
        System.out.println("3. 构造方法");
    }
    
    public static void main(String[] args) {
        new Demo();
        // 输出:
        // 1. 静态代码块
        // 2. 实例代码块
        // 3. 构造方法
    }
}

九、总结 #

概念 说明
对象的模板,定义属性和方法
对象 类的实例,通过new创建
成员变量 对象的属性
成员方法 对象的行为
构造方法 创建对象时初始化
this 引用当前对象

类与对象要点:

  • 类是模板,对象是实例
  • 成员变量属于对象,静态变量属于类
  • 使用访问修饰符控制访问权限
  • this关键字引用当前对象
最后更新:2026-03-26