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