在 Java 中,封装、继承和多态是面向对象编程(OOP)的三大核心特性。它们共同构成了面向对象编程的基础,帮助开发者编写出模块化、可重用和可扩展的代码。以下是它们的详细讲解:
1. 封装(Encapsulation)
定义
封装是指将对象的属性和行为(方法)包装在一起,并对外隐藏内部实现细节,只暴露必要的接口供外部访问。
目的:为了保证属性取值的合理性
-
隐藏实现细节:外部不需要知道对象内部的具体实现,只需知道如何使用。
-
提高安全性:通过访问控制修饰符(如
private
、protected
、public
),限制对对象属性的直接访问。 -
增强可维护性:修改内部实现时,不会影响外部代码。
实现方式
-
使用
private
修饰属性,限制外部直接访问。 -
提供
public
的getter
和setter
方法,用于访问和修改属性。
示例
public class Student {
// 私有属性
private String name;
private int age;
// 公共的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) {
if (age > 0) { // 数据校验
this.age = age;
}
}
}
-
优点:
-
外部无法直接修改
name
和age
,必须通过setter
方法。 -
可以在
setter
方法中添加数据校验逻辑。
-
2. 继承(Inheritance)
定义
继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,从而实现代码的重用和扩展。
目的
-
代码重用:子类可以直接使用父类的属性和方法,无需重复编写。
-
扩展功能:子类可以在继承的基础上添加新的属性和方法,或重写父类的方法。
实现方式
-
使用
extends
关键字实现继承。 -
子类可以访问父类的
public
和protected
成员,但不能访问private
成员。
示例
// 父类
class Animal {
protected String name;
public void eat() {
System.out.println(name + " is eating.");
}
}
// 子类
class Dog extends Animal {
public void bark() {
System.out.println(name + " is barking.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "Buddy"; // 访问父类的属性
dog.eat(); // 调用父类的方法
dog.bark(); // 调用子类的方法
}
}
-
输出:
-
特点:
-
子类可以重写父类的方法(方法重写)。
-
Java 只支持单继承,即一个子类只能有一个父类。
-
3. 多态(Polymorphism)
定义
多态是指同一个方法在不同对象中有不同的实现方式。多态分为两种:
-
编译时多态:方法重载(Overloading)。
-
运行时多态:方法重写(Overriding)。
目的
-
提高灵活性:同一个方法可以根据对象的不同表现出不同的行为。
-
增强可扩展性:新增子类时,无需修改现有代码。
实现方式
-
方法重写(Override):子类重写父类的方法。
-
向上转型(Upcasting):将子类对象赋值给父类引用。
-
动态绑定:在运行时根据对象的实际类型调用相应的方法。
示例
// 父类
class Animal {
public void makeSound() {
System.out.println("Animal is making a sound.");
}
}
// 子类
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog is barking.");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat is meowing.");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal(); // 父类对象
Animal myDog = new Dog(); // 向上转型
Animal myCat = new Cat(); // 向上转型
myAnimal.makeSound(); // 调用父类的方法
myDog.makeSound(); // 调用子类 Dog 的方法
myCat.makeSound(); // 调用子类 Cat 的方法
}
}
-
输出:
-
特点:
-
运行时多态通过方法重写和向上转型实现。
-
动态绑定确保调用的是子类重写的方法。
-
4. 三者的关系
-
封装:隐藏实现细节,提供清晰的接口。
-
继承:实现代码重用和扩展。
-
多态:提高代码的灵活性和可扩展性。
5. 总结
-
封装:通过访问控制修饰符隐藏内部细节,提供安全的访问方式。
-
继承:通过
extends
实现代码重用和扩展。 -
多态:通过方法重写和向上转型实现同一方法的不同行为。