class Supclass { 
protected String className = "父类属性"; public void print() { 
System.out.println("thisis父类print()方法" + "——此时对象" + this.toString()); 

} // 子类: 
public class fulei_zilei extends Supclass { 
protected String className = "子类属性"; public void print() { 
System.out.println("thisis子类print()方法" + "——此时对象" + this.toString()); 
} public static void main(String[] args) { 
Supclass sup = new fulei_zilei(); 
System.out.println("此时的属性时:" + sup.className); } 

结果却是:此时的属性时:父类属性 那如果我想使用子类的属性,该咋办呢? 
出现这种情况可不可以这么认为:当我们用到它的方法时, 
我便把它看成子类对象;若用到它的属性时,我把它看成父类对象. 
它是一个占用父类属性,而使用子类方法的对象.至于到底是什么对象,它应算是父类对象,但拥有子类方法??? 
望指教,谢谢 

解决方案 »

  1.   

    通常成员变量设为private,然后为其提供get和set方法。这里你可以写一个getClassName()方法。Supclass sup = new fulei_zilei();这是父类引用指向子类对象(多态的思想)调用sup.print()时,因为子类覆写了父类的方法,所以调用子类的方法;而sup.className很明显是父类的属性(属性没有覆写这回事),如果将成员变量设为private,就不会出现这种问题,应为你无法调用sup.className,通过其getClassName()访问是一种很好的编程习惯
      

  2.   

    楼主混淆了基本概念...
    java的多态是基于方法级别的,所以变量不具有重写,不会被覆盖.
    成员变量可以被继承,但不能构成多态。只有方法才构成多态。也就是说,方法可以被动态绑定,而变量永远是静态绑定,只跟当前对应的实例类绑定。
    Supclass sup = new fulei_zilei(); 应用的句柄是Supclass,所以就是引用Supclass的绑定变量...
    就是如此