关于子类继承父类时转型和静态变量引用的问题
public class Main {public String FOO = "foo";
public void pp() {
System.out.print("main class pp");
}
public static void main(String[] args) {
Main m = new Main ();
Sub s = new Sub();
m = s;
System.out.println(m.FOO);
m.pp();
}
}
class Sub extends Main {
public String FOO = "bar";
public void pp() {
System.out.print("sub class pp");
}
}
----------------------------------------
代码运行结果:
foo
sub class pp
----------------------------------------
我的问题是:父类引用指向子类对像,为什么方法引用的是子类重写的方法,而属性的引用却是父类的? --------------------编程问答-------------------- 多态! --------------------编程问答-------------------- 方法可以重写,属性不能重写。
所以父类引用指向子类对象时,调用方法,如果子类重写了父类方法,那调用的是子类方法;但如果是属性,那还是调用的父类属性。 --------------------编程问答-------------------- 子类对象Sub会自动的调用super构造函数!
也就是说你没有构造函数时,会自动调用super的构造函数。
super也没有构造函数,系统会增加一个构造函数!
--------------------编程问答--------------------
谢谢你的回答
可不可以从虚拟机原理上解释一下?比如从常量池,堆,栈的角度,字符串存放在常量池中,而对象存放在堆中,对象的引用存放在栈中 --------------------编程问答--------------------
谢谢你的回复
可不可以从虚拟机原理的角度解释一下?比如常量池,堆,栈 --------------------编程问答-------------------- 这是多态问题,父类的引用指向子类的对象,并且子类重写了父类的方法;因此父类的引用指向了子类的对象,必然会调用子类的方法,而引用是父类的,因此,会调用父类的成员变量 --------------------编程问答--------------------
这个问题与构造函数没什么关系吧 --------------------编程问答-------------------- 多态问题,父类的引用指向子类的对象,子类重写了父类的方法,因此调用方法时,既然指向子类的的对象就调用子类的方法,而对象是成员变量,生成引用自然会是成员变量 --------------------编程问答-------------------- 可不可以从虚拟机原理上解释一下?比如从常量池,堆,栈的角度,字符串存放在常量池中,而对象存放在堆中,对象的引用存放在栈中
没人回答啊 --------------------编程问答-------------------- 建议你看一下 String 这个类,还有就是final
补充:Java , Java SE