当前位置:编程学习 > JAVA >>

关于子类继承父类时转型和静态变量引用的问题

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也没有构造函数,系统会增加一个构造函数!

--------------------编程问答--------------------
引用 2 楼  的回复:
方法可以重写,属性不能重写。

所以父类引用指向子类对象时,调用方法,如果子类重写了父类方法,那调用的是子类方法;但如果是属性,那还是调用的父类属性。

谢谢你的回答

可不可以从虚拟机原理上解释一下?比如从常量池,堆,栈的角度,字符串存放在常量池中,而对象存放在堆中,对象的引用存放在栈中 --------------------编程问答--------------------
引用 2 楼  的回复:
方法可以重写,属性不能重写。

所以父类引用指向子类对象时,调用方法,如果子类重写了父类方法,那调用的是子类方法;但如果是属性,那还是调用的父类属性。

谢谢你的回复

可不可以从虚拟机原理的角度解释一下?比如常量池,堆,栈 --------------------编程问答-------------------- 这是多态问题,父类的引用指向子类的对象,并且子类重写了父类的方法;因此父类的引用指向了子类的对象,必然会调用子类的方法,而引用是父类的,因此,会调用父类的成员变量 --------------------编程问答--------------------
引用 3 楼  的回复:
子类对象Sub会自动的调用super构造函数!

也就是说你没有构造函数时,会自动调用super的构造函数。

super也没有构造函数,系统会增加一个构造函数!


这个问题与构造函数没什么关系吧 --------------------编程问答-------------------- 多态问题,父类的引用指向子类的对象,子类重写了父类的方法,因此调用方法时,既然指向子类的的对象就调用子类的方法,而对象是成员变量,生成引用自然会是成员变量 --------------------编程问答-------------------- 可不可以从虚拟机原理上解释一下?比如从常量池,堆,栈的角度,字符串存放在常量池中,而对象存放在堆中,对象的引用存放在栈中

没人回答啊 --------------------编程问答-------------------- 建议你看一下 String 这个类,还有就是final
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,