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