目录
面向对象编程(OOP)是一种编程范式,它通过将程序结构化为对象来设计和构建软件。这种方法强调对象的使用和组织,以实现代码的重用、可维护性和灵活性。OOP的主要特征包括:
1. 封装(Encapsulation)
定义: 封装是将数据(属性)和操作这些数据的方法(函数)捆绑在一起,并通过访问修饰符控制对数据的访问。封装的核心目的是隐藏对象的内部实现细节,只暴露必要的接口,从而保护数据的完整性。
特征:
- 数据隐藏:通过将数据设为
private
或protected
,限制外部直接访问,必须通过公共的方法访问和修改这些数据。 - 接口暴露:提供公共的方法(getter 和 setter)来操作和访问数据。这样可以在保证数据安全的同时,让外部使用对象的功能。
示例:
public class Person {
// 私有属性
private String name;
private int age;
// 公共构造函数
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 公共 getter 方法
public String getName() {
return name;
}
// 公共 setter 方法
public void setName(String name) {
this.name = name;
}
// 公共 getter 方法
public int getAge() {
return age;
}
// 公共 setter 方法
public void setAge(int age) {
if (age > 0) { // 检查年龄的有效性
this.age = age;
}
}
}
注意点:
- 选择合适的访问修饰符:使用
private
保护数据,使用public
或protected
方法提供必要的接口。 - 保持接口的简单性:公开的方法应该尽量简洁,避免暴露过多内部实现细节。
- 数据验证:在 setter 方法中进行数据验证,确保数据的有效性和一致性。
2. 继承(Inheritance)
定义: 继承是指一个类(子类)从另一个类(父类)继承属性和方法。子类能够复用父类的代码,同时可以添加新的功能或重写父类的方法以实现自己的特定行为。
特征:
- 代码重用:子类可以重用父类的代码,避免重复编写相同的功能。
- 功能扩展:子类可以增加新的属性和方法,扩展父类的功能。
- 方法重写:子类可以重写父类的方法,以提供更具体的实现。
示例:
// 父类
public class Animal {
public void eat() {
System.out.println("Animal eats food.");
}
}
// 子类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("Dog eats bones.");
}
public void bark() {
System.out.println("Dog barks.");
}
}
注意点:
- 方法重写:确保子类中重写的方法具有与父类方法相同的签名,并使用
@Override
注解来标识重写。 - 调用父类方法:使用
super
关键字在子类中调用父类的方法,确保子类可以利用父类提供的功能。 - 构造函数:子类构造函数通常需要调用父类的构造函数,确保父类部分正确初始化。
3. 多态(Polymorphism)
定义: 多态是指不同对象可以通过相同的接口展现不同的行为。多态主要分为两种类型:编译时多态(方法重载)和运行时多态(方法重写)。
特征:
- 编译时多态:通过方法重载实现,同一个方法名用于不同参数列表的方法调用。
- 运行时多态:通过方法重写实现,父类引用指向子类对象时,通过父类引用调用的方法在运行时决定具体的实现。
示例:
// 父类
public class Animal {
public void makeSound() {
System.out.println("Animal makes a sound.");
}
}
// 子类
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks.");
}
}
// 使用类
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog(); // 父类引用指向子类对象
myAnimal.makeSound(); // 输出: Dog barks. (运行时多态)
}
}
注意点:
- 编译时多态:确保重载的方法具有不同的参数列表,以避免混淆。
- 运行时多态:确保子类正确重写父类的方法,并在程序中使用父类引用来实现运行时多态。
- 接口与抽象类:利用接口和抽象类来定义通用的行为契约,并由具体实现类来实现这些行为。