07 Java面向对象基础

100 阅读5分钟

Java面向对象基础

在 Java 中,面向对象编程(OOP)的核心思想是将数据和操作数据的方法封装在 “类” 中,通过 “对象” 实例化类来实现功能。以下从类与对象创建、三大特性(封装、继承、多态)的实现及应用场景展开说明:

一、类与对象的创建

1. 类的定义

类是对象的模板,包含属性(数据)和方法(行为)。语法:

修饰符 class 类名 {
    // 属性(成员变量)
    数据类型 属性名;

    // 方法
    修饰符 返回值类型 方法名(参数列表) {
        // 方法体
    }
}

示例(定义一个 Person 类):

public class Person {
    // 属性(封装数据)
    private String name;
    private int age;

    // 方法(封装行为)
    public void sayHello() {
        System.out.println("Hello, I'm " + name);
    }

    // 构造方法(用于创建对象时初始化属性)
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
2. 对象的创建

通过 new 关键字实例化对象,调用构造方法初始化。示例:

public class Main {
    public static void main(String[] args) {
        // 创建 Person 对象
        Person person = new Person("Alice", 20);
        // 调用对象的方法
        person.sayHello(); // 输出:Hello, I'm Alice
    }
}

二、封装

1. 实现方式
  • 将类的属性设为 private(私有),限制直接访问。
  • 提供 public 的 getter/setter 方法,控制属性的读写逻辑(如校验)。

示例(完善 Person 类的封装):

public class Person {
    private String name;
    private int age;

    // getter 方法:获取属性值
    public String getName() {
        return name;
    }

    // setter 方法:设置属性值(带校验)
    public void setAge(int age) {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("年龄不合法");
        }
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}
2. 应用场景
  • 保护数据安全性(如年龄不能为负数)。
  • 隐藏实现细节(用户只需调用方法,无需关心内部逻辑)。
  • 便于后续修改(如修改校验规则,不影响外部调用)。

三、继承

1. 实现方式

通过 extends 关键字让子类继承父类,子类可复用父类的属性和方法,并扩展新功能。语法:class 子类名 extends 父类名 { ... }

示例(学生类 Student 继承 Person):

// 父类
public class Person {
    protected String name; // 受保护的属性,子类可访问
    public void eat() {
        System.out.println(name + " is eating");
    }
}

// 子类
public class Student extends Person {
    private String school; // 子类新增属性

    // 子类扩展方法
    public void study() {
        System.out.println(name + " is studying at " + school);
    }
}
2. 关键特性
  • 单继承:Java 中类只能继承一个父类(但可通过接口实现多继承效果)。
  • super 关键字:访问父类的属性、方法或构造方法(如 super(name) 调用父类构造)。
  • 方法重写(Override):子类可重写父类方法,实现个性化逻辑(需满足方法签名相同)。

示例(重写父类方法):

public class Student extends Person {
    @Override // 注解标识重写
    public void eat() {
        System.out.println(name + " is eating in the cafeteria");
    }
}
3. 应用场景
  • 代码复用:如多个类(StudentTeacher)共享 Person 的属性(姓名、年龄)。
  • 层级关系建模:如 Animal 作为父类,DogCat 作为子类,体现 “is-a” 关系。

四、多态

1. 实现方式

多态核心思想是 “同一行为,不同实现”,有编译时多态和运行时多态之分。通常所说的多态指的是运行时多态。

编译时多态(方法重载)的示例:

// 编译时多态示例:通过方法重载实现
public class Calculator {
    // 重载:参数个数不同
    public int add(int a, int b) {
        return a + b;
    }

    // 重载:参数个数不同
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // 重载:参数类型不同
    public double add(double a, double b) {
        return a + b;
    }

    // 重载:参数顺序不同(需保证类型有差异)
    public String add(String a, int b) {
        return a + b;
    }

    public String add(int a, String b) {
        return a + b;
    }

    public static void main(String[] args) {
        Calculator calc = new Calculator();

        // 编译时就确定调用哪个重载方法
        System.out.println(calc.add(1, 2));          // 调用 int add(int, int)
        System.out.println(calc.add(1, 2, 3));       // 调用 int add(int, int, int)
        System.out.println(calc.add(1.5, 2.5));      // 调用 double add(double, double)
        System.out.println(calc.add("年龄:", 20));   // 调用 String add(String, int)
        System.out.println(calc.add(20, "岁"));      // 调用 String add(int, String)
    }
}

运行时多态示例:

public class Main {
    public static void main(String[] args) {
        Person person1 = new Student(); // 父类引用指向子类对象
        Person person2 = new Teacher();

        person1.eat(); // 调用 Student 重写的 eat()
        person2.eat(); // 调用 Teacher 重写的 eat()
    }
}

public class Student extends Person {
    @Override // 注解标识重写
    public void eat() {
        System.out.println(name + " is eating in the cafeteria");
    }
}

class Teacher extends Person {
    @Override
    public void eat() {
        System.out.println(name + " is eating in the office");
    }
}
2. 关键特性

编译时多态: 编译期确定调用版本,核心是 "同名方法的不同参数形态",

  • 发生在同一个类中(或父子类中,但通常建议在同一类)
  • 方法名必须相同,参数列表必须不同(参数类型、个数、顺序至少有一个不同)
  • 返回值类型可以不同(但不能仅通过返回值类型区分重载)

运行时多态: 运行期确定调用版本,核心是 "子类对父类方法的重写 + 向上转型"

  • 需同时满足:继承关系、方法重写、父类引用指向子类对象。
  • 不能用于静态方法和属性:静态方法和类属性属于类本身,不具备多态性。
3. 应用场景

多态在实际开发中应用广泛,其核心价值在于降低代码耦合度、提高扩展性和复用性,常见应用场景如下:

  • 统一接口调用(最核心场景):当需要对一组具有继承关系的类进行统一操作时,通过父类引用调用方法,无需关心具体子类类型,即可触发对应子类的实现。
  • 框架与工具类设计:后边学到的 Spring中大量使用多态实现 “通用逻辑” 与 “具体业务” 的分离。
  • 策略模式(Strategy Pattern):通过多态封装不同的算法 / 策略,使算法可动态切换,且不影响使用算法的客户端。

总结

  • 类与对象:类是模板,对象是实例,通过 new 创建。
  • 封装:私有属性 + 公共方法,保护数据并隐藏细节。
  • 继承extends 实现代码复用,子类可扩展或重写父类。
  • 多态:父类引用指向子类对象,实现灵活调用,提升扩展性。

这三大特性共同支撑 Java 面向对象编程的灵活性和可维护性,是构建复杂系统的基础。