日期:2014-05-20  浏览次数:20651 次

小段代码 诱惑,求解释..
Java code

public class abc {
    public static void main(String[] args) {
         A b = new B();
         b.Set();
         System.out.println(b.aa);
    }
    
}
class A{
    public A(){
        System.out.println("父类构造方法");
    }
    
    public String aa = "我是父类属性";
    
    public void Set(){
        System.out.println("我是父类方法" );
    }
}

class B extends A{
    public B(){
        System.out.println("子类构造方法");
    }    
    
    public String aa = "我是子类属性";
    
    public void Set(){
        System.out.println("我是子类方法" );
    }
}

   /**输出是:父类构造方法
        子类构造方法
        我是子类方法
        我是父类属性 **/
  //b不是子类的对象吗?为什么不输出子类属性。那个set方法都是调用子类的。为什么属性不是。男理解啊



求解求解。最后一个输出 为什么 不是子类的属性。那个对象是子类的对象啊。 继承中 难道 属性 与 方法有区别的吗

------解决方案--------------------
A b = new B();
对象是却是子类对象,但是你声明的是A b是父类,所以会aa还是A类中的aa,如果想要B类的属性aa,那么你就声名改成B b。父类和子类的属性是没重写override这种说法的。你的aa对于子类来说只是一个新的属性,区别于继承父类的aa,只是名字相同罢了。
------解决方案--------------------
继承的类,在new一个对象时,初始化是先调用父类的无参构造方法
即A b = new B();
先调用了
 public A(){
System.out.println("父类构造方法");
}
再调用了
 public B(){
System.out.println("子类构造方法");
}
完成new B()动作,初始化完成。。



b.Set();
因为b 是B类的一个实例,所以调用的是B类的Set()方法
public void Set(){
System.out.println("我是子类方法" );
}


至于这个。。

System.out.println(b.aa);

不是很懂。。待LS来解释