public class BaseTest {
   public static void main(String[] args) {
 Child c=new Child();
 c.method();
}
}
class Base{
public String name;
Base(){//创建构造方法
name="base";
}
Base(String pname){//重载构造方法
name=pname;
}
public void method(){
System.out.println(name);
}
}
class Child extends Base{
Child(){
super("Child1");//调用父类中的构造方法、将Child1传给Base(String pname)中的pname、
    name="Child2";
}
}
//当c.method执行时不应该输出的是Child1吗?为什么是Child2?难道Child2又将成员变量name给覆盖了吗?

解决方案 »

  1.   

    name="Child2";
    成员变量name只有一份,你改了他,当然变了
      

  2.   

    楼主说的没错,因为子类的构造方法里把name重新赋值了,这个name与父类的name是同一个,所以打印出来的就是Child2。
      

  3.   

    这样就不变了
    public class BaseTest {
    public static void main(String[] args) {
    Child c = new Child();
    c.method();
    }
    }class Base {
    public String name; Base() {// 创建构造方法
    name = "base";
    } Base(String pname) {// 重载构造方法
    name = pname;
    } public void method() {
    System.out.println(name);
    }
    }class Child extends Base {
    private String name;
    Child() {
    super("Child1");// 调用父类中的构造方法、将Child1传给Base(String pname)中的pname、
    name = "Child2";
    }
    }
      

  4.   

    在Child类中赋值的变量name是超类的。super语句先将name的值赋为Child1然后下条语句将name的值赋为Child2,最终输出时当然就是Child2了。如果想输出为Child1,给Chil类添加自己的name变量。class Child extends Base {
        Child() {
            super("Child1");
            name = "Child2";
        }
        public String name;
    }