JAVA多态的内存解释/用父对象初始化子对象/子对象初始化父对象

1.Java的对象模型相较于C++简单很多,C++对象模型可以参考:https://blog.csdn.net/HeXiQuan123/article/details/100534110

2.希望能理解Java中引用即指针的含义。

 

父子对象模型如下所示:

主要考虑新增变量/函数/重写函数

 

1)   父亲指针指向子类对象

Father F=new Son();

        F是什么呢,F会认为自己是,父类指针,那么F可以访问的相对地址范围,就是父类大小的范围,此时F无法调用子类新建的变量和函数。 

       F想想,自己是父类指针,自己偏移量n的位置,有一个Func2指针,F就去找这个Func2,沿着Func2,结果指到了被重写的Func2函数,因为赋值这个操作,只是用F指针指向了Son对象,并不会修改Son对象里指针的指向。

      自此,实现多态1: 父类引用子类对象,父类调用的方法是子类重写的方法;

2)  子类指针    指向    父类对象     

Son S=new Father();

      肯定会报错,毕竟儿子比爸爸nb,我想要100,你只给我50,这肯定不行

3)强制类型转换

Son S=(Son)new Father()

     强行用S指向new的Father对象,貌似Idea会编译报错。这种写法是危险的,如果编译器不检查,S可能会去访问未分配的内存,从途中可以看到,S访问new Func的时候,但是 Father对象中没有这部分代码,会抛出错误。   

Father F=new Son();

Son S=(Son) F;

    这个可以编译通过,最终结果就是还是Son引用指向了Son对象。在使用强制类型转换后,应利用instanceof检查类型是否对应,这一部分信息(C++中是在对象头部添加Type_Info信息),Java应该也差不多,我们主要关注多态的地方,这部分暂时可以不考虑。

 

如何利用多态呢?

公司希望拿一个数组存储所有员工的工资,员工氛围Manager和Employee,Manager和Employee的工资计算方式不同

令Employee(父)派生Manager(子),Empoyee有一个getSalary() 返回Salary, Manager重写getSalary返回 Salary+bonus; 

就可以写如下Employee数组来存放两种类型,而不需要两个数组。

 

 

        Employee x=new Manager("hexiquan",20);
        Employee y=new Employee("nauqixeh",200);
        List<Employee> arr=new ArrayList<>(5);
        arr.add(x);
        arr.add(y);

        for(Employee i:arr){
            i.getSalary(5);
        }

最后输出:先调用Manager的getSalary,再调用Employee的getSalary
Manager
Employee
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章