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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wy_heima 中级黑马   /  2014-5-22 10:21  /  1284 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wy_heima 于 2014-5-22 23:54 编辑

class Fu {
        int x=4;
}
class Zi extends Fu {
        int x =5;

}
class C {
        public static void main(String[] args) {
                Fu f=new Zi();
                System.out.println(f.x);
        }
}
输出结果是4
为什么啊?
书上不是说对象的上转型对象操作子类继承或隐藏的成员变量吗?

5 个回复

倒序浏览
这是多态方面的知识点。
父类引用指向子类的实例对象,此时只能调用父类中的属性、方法。
所以不难理解你程序中f.x实际访问的是父类中的属性。
多态可以提高代码的扩展性,同时由于只能调用父类中的内容,恰恰也是多态的局限性。
回复 使用道具 举报
要把f强转成子类 就会输出5
回复 使用道具 举报
注意:多态里的一个关键点你要搞清楚,父类引用指向子类对象,这个对象调用的方法,是父类和子类共有的,这个要搞清楚,这个是关键,如果是调用方法,那么这个时候就是调用的子类里重写父类的方法,如果是属性,那么就是取得父类里的属性值。
class Fu {
        int x=4;
}
class Zi extends Fu {
        int x =5;

}
class C {
        public static void main(String[] args) {
               //这里是采用多态实现的
                Fu f=new Zi();
                System.out.println(f.x);
        }
}
回复 使用道具 举报
:P多态中的成员变量的特点,编绎看左边的父类,运行也看左边的父类,多态中成员方法的特点,编绎看左边的父类,运行看右边的子类,这是一个小规律,你可以记一下,方便你灵活运用多态。我给你说一个例子。比如这个Fu f=new Zi();是一个多态的形式吧,你这里想输出打印的是成员变量,按我说的那个特点,你看这个多态的new操作,左边是父类的类型,所以成员变量就按父类的算,如果是方法,就按右边的子类型算。这是一个小技巧,希望采纳。有不懂的可以回复我。
回复 使用道具 举报
略懂了!!谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马