猿问

多态中,成员变量的特点

class Super

{

    int i=0;

    public Super(String s)

    {

        i=1;

    }

    public Super()

    {

        i+=2;

    }

}

class Demo extends Super 

{

    public Demo(String s)

    {

        i+=5;

    }

    public static void main(String[] args) 

    {

        int i=4;

        Super d=new Demo("YES");

        System.out.println(d.i);

    }

}

打印的结果是7,就是i等于7。但是,我记得一个多态的引用,父类引用指向子类对象用来调用成员变量,那么调用的应该是父类下的 i 呀,为什么这里输出结果是7呢?那么这里调用的是父类的 i 吗?父类的 i 变为了7?


慕后森
浏览 505回答 4
4回答

SMILET

子类中的int i = 4;因为没有传入参数列表所以没有意义然后子类中的构造函数,并没有super 所以默认super调用为空的构造函数所以i=0+2+5 = 7

撒科打诨

因为子类继承父类,这道题中应该有三个i变量,父类的i、子类的i、子类局部的i,局部的i就不管它了。 主函数中,创建了多态的引用d,d的实质是子类对象,那么在初始化过程中,应该是子类的i在发生变化呀,i=0+2+5=7,是不假,但是多态的引用调用成员变量,不应该是调用父类的吗?这里只是堆内存中子类对象的i在初始化呀。 我觉得调用的结果应该是5呀,因为父类构造函数初始化。但结果是7 始终想不明白。

眼眸繁星

父类运行在子类前,所以先算父类,然后才是子类,这是继承的顺序问题

拉莫斯之舞

是的呀,但关键是多态的情况下,利用父类引用去调用成员变量,此时调用的是父类下的成员变量呀,如果父类没有这个成员变量就报错啦。按照这个道理,那么上面的题目中父类的成员变量,变为了7.这是为什么啊?
随时随地看视频慕课网APP

相关分类

Java
我要回答