java多线程    Java入门    vsftp    ftp    linux配置    centos    FRP教程    HBase    Html5缓存    webp    zabbix    分布式    neo4j图数据库    

面向对象的三大特征

三大特征

封装:封装就是把过程和数据包围起来,对数据的访问只能通过已定义的界面。如私有变量,用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();
    }
}
  1. 多态的概念是什么?

    说人话:对象调用,要求传入一个父类,其实可以传入一个子类
    
    官方定义:允许将子类类型的指针赋值给父类类型的指针, 指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
  2. 什么是静态多态?什么是动态多态?

    静态多态就是编译期就知道结果,动态多态也叫动态绑定,执行期才知道结果。
  3. 动态多态是依赖什么技术实现的?

    回答:多态依赖继承,重写,父类引用指向子类引用
    
    核心解释:
    内存中,由于Java的对象内存模型采用的是“内存叠加的方式”,即:在子类对象产生的时候,会先调用父类的构造方法产生一个父类对象部分,然后再调用子类自己的构造方法,在该父类对象部分下面叠加上子类特有部分,从而形成一个完整的子类对象!所以,我们可以认为每一个子类对象中都包含了一个完整的父类对象部分。
    当用父类引用指向这个子类对象的时候,JVM会发现这个对象确实有父类对象所有的内容,在编译上是没有问题的
    
  4. 动态多态的好处是什么?

    好处是

    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


This entry was posted in JAVA and tagged . Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/3-point-object-coding/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.

Leave a Reply