• 封装:封装是指将对象的属性(数据)和行为(方法)结合在一起,对外隐藏对象的内部细节,仅通过对象提供的接口与外界交互。封装的目的是增强安全性和简化编程,使得对象更加独立。
  • 继承:继承是一种可以使得子类自动共享父类数据结构和方法的机制。它是代码复用的重要手段,通过继承可以建立类与类之间的层次关系,使得结构更加清晰。
  • 多态:多态是指允许不同类的对象对同一消息作出响应。即同一个接口,使用不同的实例而执行不同操作。多态性可以分为编译时多态(重载)和运行时多态(重写)。它使得程序具有良好的灵活性和扩展性。

重载(Overload):

同一个类中,方法名相同,参数列表不同,编译时根据参数匹配方法:

public class Animal {
    // 重载1:无参
    public void shout() {
        System.out.println("动物叫");
    }
    // 重载2:带参数
    public void shout(String name) {
        System.out.println(name + " 在叫");
    }

    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.shout();          // 编译直接锁定:调用无参shout
        animal.shout("小猫");     // 编译直接锁定:调用带参shout
    }
}

重写(Override):

核心的要素:

  • 继承/实现接口
  • 子类重写父类方法
  • 父类引用指向子类对象 父类 引用=new 子类();
// 父类
class Animal {
    public void shout() {
        System.out.println("动物发出声音");
    }
}

// 子类1
class Dog extends Animal {
    // 重写父类方法
    @Override
    public void shout() {
        System.out.println("汪汪汪");
    }
}

// 子类2
class Cat extends Animal {
    // 重写父类方法
    @Override
    public void shout() {
        System.out.println("喵喵喵");
    }
}

public class TestPoly {
    public static void main(String[] args) {
        // 父类引用,指向不同子类对象(多态核心写法)
        Animal a1 = new Dog();
        Animal a2 = new Cat();

        // 同一个消息:调用shout(),不同对象不同响应
        a1.shout(); // 运行时识别:实际对象是Dog → 输出汪汪汪
        a2.shout(); // 运行时识别:实际对象是Cat → 输出喵喵喵
    }
}

重载和重写区别?

重载是指同一个类中定义多个同名方法,而重写是指子类重新定义父类中的方法

Question:多态体现在那几个方面?

  • 方法重载
  • 方法重写
  • 接口与实现:多态也体现在接口的使用上,多个类可以实现同一个接口,并且用接口类型的引用来调用这些类的方法。 (和子类继承父类很像,但是这个是接口的实现!)
  • 向上转型和向下转型:

向上转型:父类/接口 引用=new 子类();

interface IVoucherService {
    void seckill();
}
class VoucherServiceImpl implements IVoucherService{
    @Override
    public void seckill() {
        System.out.println("秒杀业务");
    }
    // 子类自己独有的方法
    public void selfMethod(){
        System.out.println("子类独有方法");
    }
}

public class Test {
    public static void main(String[] args) {
        // 向上转型!接口引用,指向子类对象
        IVoucherService service = new VoucherServiceImpl();
        service.seckill(); // ✅ 多态,执行子类重写的方法

        // service.selfMethod(); // ❌ 编译报错!
        // 向上转型之后,【编译期看引用类型(接口)】,接口没有selfMethod,无法直接调用子类独有的方法
    }
}

向下转型:向上转型之后,如果想调用子类独有的方法,就需要向下转型:把父类引用转回子类类型。

public class Test {
    public static void main(String[] args) {
        //向上转型
        IVoucherService service = new VoucherServiceImpl();

        //向下转型:接口引用 → 子类类型
        VoucherServiceImpl impl = (VoucherServiceImpl) service;
        impl.selfMethod(); // ✅ 现在可以调用子类独有的方法
    }
}

Question:多态解决了什么问题?

多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。多态这种特性也需要编程语言提供特殊的语法机制来实现,比如继承、接口类。

多态可以提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。比如策略模式、基于接口而非实现编程、依赖倒置原则、里氏替换原则、利用多态去掉冗长的 if-else 语句等等
在 Springboot 框架中中,就有很多多态的运用,比如SerciveImpl 继承 Service 重写方法实现多态…