关于多态的一些思考

0 阅读1分钟

1. 关于多态中类型的问题

Worker manager = new Manager(); 
System.out.println(manager instanceof Manager); 
Manager a = (Manager)manager;

这段代码演示了 Java 中的 向上转型(upcasting)向下转型(downcasting) ,以及 instanceof 的用法。

我听到一种说法是,在编译时,manager的类型是看左边,也就是Worker,为什么这里又manager instanceof Manager判断为真?instanceof内部原理是什么样的?

"编译时类型" vs "运行时类型"

在编译时,class文件会把manager的类型声明为Worker,但实际在做instanceof时,代码正在运行,instanceof会去内存中查询对应堆的头,其存在一个指向class文件的指针,然后判断指针指向的类型是否与instanceof前的实例类型相同,而这里的指针的指向是在new时决定的

2. 如果创建实例时,传入了子类的独有属性,在不去向下转型时,能拿到吗?

Worker manager = new Manager("属性1","属性2","属性3");
// 假设属性3key为property3,且为Manager独有属性
System.out.println(manager.property3); // 报错

不能拿到,因为代码先编译在运行,编译时,他会根据左边Worker类去查有没有这个属性,没有就报错了