面向对象编程(OOP)的四大基本特性,分别是封装、继承、多态、抽象
1. 封装:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装方法:先让属性私有,然后提供了两个公有的set和get方法
封装作用: 只能通过规定方法访问数据
2. 继承:
一个类通过 extends 继承另一个类的 属性和方法(私有属性不可继承,但可通过封装访问)
3. 多态: 就是同一个方法调用在不同的对象上可以表现出不同的行为
多态允许你使用一个统一的接口来处理不同类型的对象,从而提高代码的灵活性和可扩展性。简单来说,多态意味着“多种形态”,即同一个方法调用在不同的对象上可以表现出不同的行为。
多态的两种主要形式
编译时多态(静态多态): 编译时多态主要是通过方法重载(Method Overloading)实现的。方法重载允许在一个类中定义多个同名但参数列表不同的方法。编译器根据传递的参数类型和数量来决定调用哪个方法。
class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
// Calculator 中 的 add 方法在 calc 对象中不同参数返回的结果不同 即 同一个 add 方法在不同对象上的表现不同 即为多态
public class StaticPolymorphismExample {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(5, 3)); // 调用 int add(int a, int b)
System.out.println(calc.add(5.5, 3.3)); // 调用 double add(double a, double b)
}
}
运行时多态(动态多态): 运行时多态主要是通过方法重写(Method Overriding)和向上转型(Upcasting)实现的。它允许子类提供父类已有方法的新实现,并且在运行时根据对象的实际类型调用相应的方法。
class Animal {
public void makeSound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal { // 1.重写 父类的 makeSound 方法
@Override
public void makeSound() {
System.out.println("Bark");
}
}
class Cat extends Animal { // 1.重写 父类的 makeSound 方法
@Override
public void makeSound() {
System.out.println("Meow");
}
}
public class DynamicPolymorphismExample {
public static void main(String[] args) {
Animal animal1 = new Dog(); // 2.向上转型
Animal animal2 = new Cat(); // 2.向上转型
animal1.makeSound(); // 输出 "Bark"
animal2.makeSound(); // 输出 "Meow"
// 父类 makeSound 方法在 子类 animal1 对象上返回不同结果 即为 多态
}
}
多态的好处
代码复用:通过继承和多态,可以编写更通用的代码,减少重复代码。
扩展性:可以在不修改现有代码的情况下添加新功能。例如,添加新的子类而不改变父类或使用这些类的代码。
灵活性:可以使用统一的接口处理不同类型的对象,使代码更加灵活和易于维护。
实现多态的关键要素
继承:子类继承父类,从而可以重写父类的方法。
方法重写:子类提供父类已有方法的新实现。
向上转型:将子类对象赋值给父类引用,利用父类引用调用子类的方法。
动态绑定:在运行时根据对象的实际类型选择调用的方法。
4. 抽象: 是一中概念
抽象是面向对象编程中的一个重要概念,它通过抽象类和接口隐藏实现细节,提供统一的接口,使代码更加简洁、灵活和易于维护
抽象的两种主要形式: 抽象类(Abstract Class)、接口(Interface)