Java的三个核心特征
Java面向对象的三个核心特征是 封装、继承和多态
。它们是面向对象编程(OOP)的基石,共同构成了Java语言强大的面向对象特性。在日常的编码过程中,这三个核心特征也能体现一个开发者的基本功。
1、封装(Encapsulation)
封装是指将对象的属性(数据)和行为(方法)结合成一个独立的单位(即类),并通过 访问权限控制(如private、public、protected等)来隐藏对象的内部实现细节,仅通过定义好的接口(方法)与外界交互。
特点:
- 隐藏内部实现:将类的内部数据和实现细节隐藏起来,只暴露必要的接口给外部使用。例如,将类的成员变量设置为
private
,通过public
的getter
和setter
方法来访问和修改这些变量。 - 数据安全:防止外部代码对内部数据的直接访问和修改,避免数据被破坏或误用。例如,通过
setter
方法可以对数据进行合法性校验。 - 简化接口:用户只需要关注类提供的接口,而不需要了解内部的复杂实现,降低了系统的复杂性。
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) { // 数据校验
this.age = age;
} else {
System.out.println("年龄不能为负数!");
}
}
}
2、继承(Inheritance)
继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。子类继承父类后,会自动拥有父类的所有非私有成员变量和方法,并且可以添加新的属性和方法或覆盖父类的方法。
特点:
- 代码复用:子类可以直接使用父类的属性和方法,减少代码冗余,提高开发效率。
- 层次结构:通过继承可以形成类的层次结构,更好地模拟现实世界中的关系。例如,
Animal
类可以作为Dog
和Cat
的父类。 - 扩展性:子类可以在继承的基础上扩展新的功能或修改父类的行为,增强系统的灵活性。
// 父类
class Animal {
public void eat() {
System.out.println("动物会吃东西");
}
}
// 子类
class Dog extends Animal {
public void bark() {
System.out.println("狗会叫");
}
}
// 测试
public class TestInheritance {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 继承自父类Animal的方法
dog.bark(); // 子类Dog自己的方法
}
}
3、多态(Polymorphism)
多态是指同一个接口或父类使用不同的底层实现,调用时可以根据对象的实际类型动态地决定调用哪个方法。多态分为编译时多态(方法重载)和运行时多态(方法覆盖)。
特点:
- 运行时绑定:运行时多态(方法覆盖)是多态的核心。通过父类引用指向子类对象,调用方法时会根据对象的实际类型动态绑定到具体的方法。
- 提高灵活性:允许使用统一的接口调用不同的实现,使得代码更加通用和灵活。
- 增强扩展性:新增子类时,无需修改原有代码,只需继承父类并覆盖方法,即可实现新的功能。
// 父类
class Animal {
public void makeSound() {
System.out.println("动物发出声音");
}
}
// 子类1
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("狗叫:汪汪");
}
}
// 子类2
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("猫叫:喵喵");
}
}
// 测试
public class TestPolymorphism {
public static void main(String[] args) {
Animal animal1 = new Dog();
animal1.makeSound(); // 输出:狗叫:汪汪
Animal animal2 = new Cat();
animal2.makeSound(); // 输出:猫叫:喵喵
}
}
总结:
- 封装:隐藏内部实现,提供接口,保护数据安全。
- 继承:实现代码复用,形成层次结构,增强扩展性。
- 多态:通过运行时绑定实现动态调用,提高灵活性和扩展性。