A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package review;

public class PolyDemo {

        public static void main(String[] args) {
               
                Fu f = new Zi();
               
                System.out.println(f.num);
               
                f.show();
               
               
        }
       
}

class Fu {
       
       
        int num = 3;
       
        public void show() {
               
                System.out.println("Fu run...");
               
        }
       
}

class Zi extends Fu {
       
        int num = 4;
       
        public void show() {
               
                System.out.println("Zi run...");
               
        }
       
}

为什么输出时,属性是父类的,而方法却调用子类的,因为重写而调用的是子类的方法我明白了(自己空间有就调用自己的,没有再到外面找),但属性实在想不通,属性不存在重写,但明明建立的是子类对象,为什么是调用父类的属性呢?望大解惑!

4 个回复

倒序浏览
本帖最后由 来男. 于 2014-5-14 22:15 编辑

有些概念楼主可以看一下:

多态在子父类中的成员上的体现的特点:
1、成员变量:在多态中,子父类成员变量同名。
    在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误
    运行时期:也是参考引用型变量所属的类中是否有调用的成员。
    简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。
    再说的更容易记忆一些:成员变量 --- 编译运行都看 = 左边。
2、成员函数
    编译时期:参考引用型变量所属的类中是否有调用的方法。
    运行事情:参考的是对象所属的类中是否有调用的方法。
    为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖。
    简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。
    更简单:成员函数 --- 编译看 = 左边,运行看= 右边。
3、静态函数
    编译时期:参考的是引用型变量所属的类中是否有调用的成员。
    运行时期:也是参考引用型变量所属的类中是否有调用的成员。
    为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
    调用静态的方法引用是哪个类的引用调用的就是哪个类中的静态方法。
    简单说:静态函数 --- 编译运行都看 = 左边。

明白了吧!!f.num是成员变量,只看左边;而f.show()是成员函数,被复写,运行得右!!


回复 使用道具 举报
建议重新看看毕姥爷的视频,顺序是默认初始化num=0,加载子类构造函数发现有super走父类,调用子类成员函数,显示初始化,最后才是子类构造函数具体初始化
回复 使用道具 举报
来男. 发表于 2014-5-14 22:13
有些概念楼主可以看一下:

多态在子父类中的成员上的体现的特点:1、成员变量:在多态中,子父类成员变量 ...

这我明白,这些我都做了笔记,但我不是想知道是什么,而是想知道为什么?毕老师成员变量没有画图说明了,成员函数图就画的很明白!不过,很谢谢你!
回复 使用道具 举报
张志民 发表于 2014-5-14 22:17
建议重新看看毕姥爷的视频,顺序是默认初始化num=0,加载子类构造函数发现有super走父类,调用子类成员函数 ...

对呀,最后才是子类构造器初始化,如果同名的话那最后的值应该是子类所决定的,不管前面怎么样,都会被最后一次修改来确定的呀!不知道我这样想错了吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马