面向对象编程(OOP)有三大核心特性,分别是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。下面我将详细解释这三大特性,并通过编程示例来帮助理解。
1. 封装(Encapsulation)
概念解释:
封装是将数据(属性)和操作数据的方法(行为)绑定在一起,并隐藏内部实现细节,只暴露必要的接口。封装的目的是保护数据不被外部随意访问和修改,提高代码的安全性和可维护性。
编程示例:
public class Person {
// 私有属性
private String name;
private int age;
// 公共方法来访问和修改私有属性
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 && age <= 120) { // 简单的数据验证
this.age = age;
} else {
System.out.println("年龄不合法");
}
}
}
解释:
name
和age
属性是私有的,只能在Person
类内部访问。- 通过公共的
getName
和setName
方法来访问和修改name
属性。 - 通过公共的
getAge
和setAge
方法来访问和修改age
属性,并在setAge
方法中进行了简单的数据验证,确保年龄在合理范围内。
2. 继承(Inheritance)
概念解释:
继承是面向对象编程中实现代码重用的一种机制。一个类(子类)可以继承另一个类(父类)的属性和方法,从而避免重复编写相同的代码。继承还支持多层次的继承关系。
编程示例:
// 父类
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating.");
}
}
// 子类
public class Dog extends Animal {
public Dog(String name) {
super(name); // 调用父类的构造方法
}
public void bark() {
System.out.println(name + " is barking.");
}
}
解释:
Animal
类是父类,定义了name
属性和eat
方法。Dog
类是子类,继承了Animal
类的name
属性和eat
方法,并新增了bark
方法。- 在
Dog
类的构造方法中,通过super(name)
调用了父类的构造方法来初始化name
属性。
3. 多态(Polymorphism)
概念解释:
多态是指同一个接口或方法在不同的对象中有不同的实现。多态性使得我们可以编写更通用的代码,提高代码的灵活性和可扩展性。
编程示例:
// 父类
public class Shape {
public void draw() {
System.out.println("Drawing a shape.");
}
}
// 子类
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("Drawing a circle.");
}
}
// 子类
public class Square extends Shape {
@Override
public void draw() {
System.out.println("Drawing a square.");
}
}
// 测试类
public class TestPolymorphism {
public static void main(String[] args) {
Shape shape1 = new Circle();
Shape shape2 = new Square();
shape1.draw(); // 输出: Drawing a circle.
shape2.draw(); // 输出: Drawing a square.
}
}
解释:
Shape
类定义了一个draw
方法。Circle
和Square
类继承了Shape
类,并重写了draw
方法,提供了各自的实现。- 在
TestPolymorphism
类的main
方法中,创建了Shape
类型的引用变量shape1
和shape2
,分别指向Circle
和Square
对象。 - 调用
shape1.draw()
和shape2.draw()
时,根据实际对象的类型,分别执行了Circle
和Square
类的draw
方法,体现了多态性。