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
略懂了!!谢了