黑马程序员技术交流社区

标题: 关于对象的上转型对象的问题 [打印本页]

作者: wy_heima    时间: 2014-5-22 10:21
标题: 关于对象的上转型对象的问题
本帖最后由 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
为什么啊?
书上不是说对象的上转型对象操作子类继承或隐藏的成员变量吗?
作者: のソ夏末    时间: 2014-5-22 11:21
这是多态方面的知识点。
父类引用指向子类的实例对象,此时只能调用父类中的属性、方法。
所以不难理解你程序中f.x实际访问的是父类中的属性。
多态可以提高代码的扩展性,同时由于只能调用父类中的内容,恰恰也是多态的局限性。
作者: pancl    时间: 2014-5-22 11:42
要把f强转成子类 就会输出5
作者: jsjchenlong    时间: 2014-5-22 13:02
注意:多态里的一个关键点你要搞清楚,父类引用指向子类对象,这个对象调用的方法,是父类和子类共有的,这个要搞清楚,这个是关键,如果是调用方法,那么这个时候就是调用的子类里重写父类的方法,如果是属性,那么就是取得父类里的属性值。
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);
        }
}
作者: shi980088    时间: 2014-5-22 19:27
:P多态中的成员变量的特点,编绎看左边的父类,运行也看左边的父类,多态中成员方法的特点,编绎看左边的父类,运行看右边的子类,这是一个小规律,你可以记一下,方便你灵活运用多态。我给你说一个例子。比如这个Fu f=new Zi();是一个多态的形式吧,你这里想输出打印的是成员变量,按我说的那个特点,你看这个多态的new操作,左边是父类的类型,所以成员变量就按父类的算,如果是方法,就按右边的子类型算。这是一个小技巧,希望采纳。有不懂的可以回复我。
作者: wy_heima    时间: 2014-5-22 23:54
略懂了!!谢了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2