内存如何分配以及存储在哪里? :Javainheritance
您好我有一个特定的Javainheritance问题。 以下是我的代码
class Parent{ int x = 5; public void method(){ System.out.println("Parent"+ x); } } public class Child extends Parent{ int x = 4; public void method(){ System.out.println("Child"+ x); } public static void main(String[] args){ Parent p = new Child(); System.out.println(((Child) p).x); System.out.println(px); } }
现在我的问题是在运行此程序时实际发生在幕后的情况。
- 什么得到inheritance?
- 在记忆位置的哪里?
- 为什么第一个syso给出4,第二个给出5?(这个我能在某种程度上理解,但对上面两个的澄清将有助于更清楚地理解它)
请指导
什么得到inheritance?
所有public和protected方法都在子类中inheritance。 字段永远不会被inheritance。
在记忆位置的哪里?
我写了一篇关于Java中的对象创建过程的博客文章 。 我想你会更好地理解它。
为什么第一个syso给出4,第二个给出5?
始终基于声明的引用类型而不是实际的对象类型来解析字段访问。 因此, px
将访问Parent
的字段,因为声明的p
类型是Parent
。 然而, ((Child)p).x
将访问Child
的字段,因为您已将类型的引用p
为Child
,现在所考虑的声明类型为Child
。
在Java中, 没有变量覆盖 ,只有方法覆盖 。
System.out.println(((Child) p).x);
该行告诉Child
一点p
并得到那个x
变量。
这一行, System.out.println(px);
告诉那个打印Parent
的x
这完全是关于Java inheritance
和overriding
。 父类中的method()
将被子方法覆盖。
System.out.println(((Child) p).x);// here you are invoking child
然后你会得到孩子的属性。
接下来就是Java多态性。
((Child) p).x // invoking object type, x=4 (object is child ) px // invoking reference type, x=5 (reference is parent)
请参阅此链接和此 链接 。