三大特征
封装:封装就是把过程和数据包围起来,对数据的访问只能通过已定义的界面。如私有变量,用set,get方法获取
继承 :对象的一个新类可以从现有的类中派生,这个过程称为类继承
多态:多态是指允许不同类的对象对同一消息做出响应
“多态”的概念是---相同的行为,不同的实现
静态多态是在编译期就确定了对象以及对象行为的绑定关系,所以运行起来以后就固定为编译期确定的效果;
静态多态包含了重载和重写两种方法
动态多态是在编译期未知绑定关系,运行进行以后才进行绑定,所以具有更大的灵活性;
要求传入父类的时候,可以传入子类来执行
静态多态
重载的例子,同名但是方法不同参数
public class Student{
public void study(){
System.out.println("自习");
}
public void study(String subject){
System.out.println("完成当天课程:" + subject + "的课后作业。");
}
}
public class Teacher{
private Student stu;
public void teach(){
System.out.println("现在布置任务:");
//stu.study();
stu.study("数学");
}
}
编译期间决定结果,属于静态多态
重写:继承父类的共同的方法,但是实现不同
public abstract class Gun{
public abstract void fire();
}
public class Rifle extends Gun{
public void fire(){
System.out.println("砰~~~");
}
}
public class MachineGun extends Gun{
public void fire(){
System.out.println("哒哒哒哒哒");
}
}
public class Soldier{
//private Rifle gun;//绑定步枪对象
private MachineGun gun;//绑定机枪对象
public void fight(){
System.out.println("射击!");
this.gun.fire();
}
编译器决定结果,也是静态多态
动态多态:要求传入父类的时候,传入了一个子类
public abstract class Gun{
public abstract void fire();
}
public class Rifle extends Gun{
public void fire(){
System.out.println("砰~~~");
}
}
public class MachineGun extends Gun{
public void fire(){
System.out.println("哒哒哒哒哒");
}
}
public class Soldier{
private Gun gun;//绑定枪对象
public void fight(){
System.out.println("射击!");
this.gun.fire();
}
}
编译期无法决定结果,当士兵被调用,并传入一把枪才决定结果属于动态多态
这里父类引用传入,但是调用了子类的方法,当父类引用指向子类对象以后
public class TestMain{
public static void main(String[] args){
Soldier rambo = new Soldier();
rambo.setGun(new Rifle());
//rambo.setGun(new MachineGun());
rambo.fight();
}
}
多态的概念是什么?
说人话:对象调用,要求传入一个父类,其实可以传入一个子类
官方定义:允许将子类类型的指针赋值给父类类型的指针, 指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
什么是静态多态?什么是动态多态?
静态多态就是编译期就知道结果,动态多态也叫动态绑定,执行期才知道结果。
动态多态是依赖什么技术实现的?
回答:多态依赖继承,重写,父类引用指向子类引用
核心解释:
内存中,由于Java的对象内存模型采用的是“内存叠加的方式”,即:在子类对象产生的时候,会先调用父类的构造方法产生一个父类对象部分,然后再调用子类自己的构造方法,在该父类对象部分下面叠加上子类特有部分,从而形成一个完整的子类对象!所以,我们可以认为每一个子类对象中都包含了一个完整的父类对象部分。
当用父类引用指向这个子类对象的时候,JVM会发现这个对象确实有父类对象所有的内容,在编译上是没有问题的
动态多态的好处是什么?
好处是
1.可替换:不用修改源代码即可实现多种子类调用切换
2.可扩展:有利于扩展新的子类
3.灵活性:创建新类型的灵活性:你可以选择方法的父实现,或者在子类中重写它
4.通用处理:可以对所有类的对象进行通用处理
参考资料
https://zhuanlan.zhihu.com/p/37655397
https://codegym.cc/zh/groups/posts/java-polymorphism-zh
https://dczzs.com/articles/2021/10/29/1635508115286.html