概要
在Java中,继承、封装和多态是面向对象编程的三大基本特性。本文是对这三个特性的解释和总结,适用于面试场景。
解释
1. 继承(Inheritance)
定义
继承是面向对象编程中,一个类(称为子类或派生类)可以继承另一个类(称为父类或基类)的成员变量和成员方法(包括私有成员,但私有成员在子类中不能直接访问)的机制。通过继承,子类可以重用父类的代码,并实现代码的重用和扩展。
特点
- 子类可以拥有父类的属性和方法(除了构造方法和私有方法)。
- 子类可以重写父类的方法,实现自己的逻辑。
- Java中只支持单继承,即一个类只能继承一个父类。
- 可以通过多层继承来实现类的层次结构。
示例
class Animal {
void eat() {
System.out.println("Animal eats");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Dog barks");
}
@Override
void eat() {
System.out.println("Dog eats dog food");
}
}
2. 封装(Encapsulation)
定义
封装是隐藏对象的属性和实现细节,仅对外提供公共访问方式(如方法)的机制。封装将数据(属性)和操作数据的方法(函数)绑定在一起,形成一个不可分割的整体。
特点
- 通过访问修饰符(如public、private、protected)来控制成员变量的访问权限。
- 提供公共的方法来访问和修改私有成员变量。
- 封装提高了代码的安全性和可维护性。
示例
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
3. 多态(Polymorphism)
定义
多态是指允许不同子类型的对象对同一消息做出不同的响应。简单的说,就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。
特点:
- 编译时多态性:主要通过方法重载(Overloading)实现,即同一个类中有多个同名但参数列表不同的方法。
- 运行时多态性:主要通过方法重写(Overriding)和父类引用指向子类对象实现,即父类引用可以指向子类对象,并调用子类重写后的方法。
示例(运行时多态性)
class Shape {
void draw() {
System.out.println("Shape is being drawn");
}
}
class Circle extends Shape {
@Override
void draw() {
System.out.println("Circle is being drawn");
}
}
class Rectangle extends Shape {
@Override
void draw() {
System.out.println("Rectangle is being drawn");
}
}
public class Main {
public static void main(String[] args) {
Shape[] shapes = new Shape[2];
shapes[0] = new Circle();
shapes[1] = new Rectangle();
for (Shape shape : shapes) {
shape.draw(); // 运行时根据对象的实际类型调用相应的方法
}
}
}
在上面的示例中,Shape是一个父类,Circle和Rectangle是子类。main方法中创建了一个Shape类型的数组,并分别放入了Circle和Rectangle的对象。当调用draw方法时,会根据对象的实际类型调用相应的方法,这就是多态性的体现。