下面两个程序,都是通过在子类的构造方法中调用 super() 传递字符串来改变父类的 String name;
我不太理解,为什么第二个程序把 system out 放在了main函数里,就会导致输出 f.name的值没有发生改变。
第一个程序:
class Father {
private String name;

Father(String name) {
this.name = name;
System.out.println(name);
}
}class Son extends Father {
private String name;

Son(String fname, String sname) {
super(fname);
this.name = sname;
System.out.println(name);
}
}public class AppTest {
public static void main(String[] args) {
Father f = new Father("奇异果");
Son s = new Son("大菠萝", "哈密瓜");
}
}输出结果:
奇异果
大菠萝
哈密瓜
第二个程序:
class Father {
String name;

Father(String name) {
this.name = name;
//System.out.println(name);
}
}class Son extends Father {
String name;

Son(String fname, String sname) {
super(fname);
this.name = sname;
//System.out.println(name);
}
}public class AppTest {
public static void main(String[] args) {
Father f = new Father("奇异果");
                System.out.println(f.name);
Son s = new Son("大菠萝", "哈密瓜");
                System.out.println(f.name);
                System.out.println(s.name);
}
}输出结果:
奇异果
奇异果
哈密瓜

解决方案 »

  1.   

    System.out.println(f.name);你是用了上一個實例的name,不是子類的。。
      

  2.   


    1、 public class AppTest {
    public static void main(String[] args) {
    Father f = new Father("奇异果");
      System.out.println(f.name);
    Son s = new Son("大菠萝", "哈密瓜");
      System.out.println(f.name);   //调用的是Father的name 当然是 "奇异果"啦  System.out.println(s.name);
    }
    }2、你的第一种方式,是在你的类中的构造函数中println的,你传进去的是什么 ,打印出来的当然是什么啦3、你定义的子类的name应该会覆盖掉父类的name ;
      

  3.   

     System.out.println(((Father)s).name);
    这样可以把你赋值的大菠萝找到,
    f已经是一个实例对象了,所以他的值不会改变了,
    s确实对父类传了值,但你想要用实例对象调的话,你传的值就被覆盖了
    你还可以在子类的构造函数或方法里加super.name;打印大菠萝
      

  4.   

     额,我感觉你调用super(String)并不是改变父类对象的name,只是创建一个新的父类对象
      

  5.   

    学了 this super 的用法。好像是个继承问题
      

  6.   

    Son s = new Son("大菠萝", "哈密瓜");
      System.out.println(f.name); //这里的f和s没有任何关系,是不同的对象
      System.out.println(s.name);Lz可以改成Son s = new Son("大菠萝", "哈密瓜");
      System.out.println(((Father)s).name); 
      System.out.println(s.name);
      

  7.   

    都是通过在子类的构造方法中调用 super() 传递字符串来改变父类的 String namesuper()只是继承父类的构造函数内容,哪里能改变呢。
      Father f = new Father("奇异果");
      System.out.println(f.name); // 输出父类的值,注意你的对象是父类的Father f = ~~
      Son s = new Son("大菠萝", "哈密瓜");
      System.out.println(f.name); // 输出父类的值
      System.out.println(s.name); // 输出父类的值
      

  8.   

    super()是创建一个新的父类对象吧,怎么改变父类的对象呢。
      

  9.   

    你输出的是f.name 当然是 f那个object的name值啦.
    9楼说的很对
      

  10.   


    super()是调用父类构造函数,不是建立一个父类对象,最好把调用构造函数与建立一个新对象区分开来,虽然通常代码,无论是通过new还是通过反射,构造函数与新建对象都是一起进行的,但是调用构造函数和新建对象不是一回事,因为可以不通过构造函数来新建对象,而且一个对象也可能再次调用构造函数,当然,这需要绕过java编译期的机制。
      

  11.   

    如果你把父类的 name 定义为静态的,他就会打出你想要的结果了,呵呵~
      

  12.   

    class Father {
    String name;Father(String name) {
    this.name = name;
    //System.out.println(name);
    }
    }class Son extends Father {
    String name;Son(String fname, String sname) {
    super(fname);
    this.name = sname;
    //System.out.println(name);
    }
    }public class AppTest {
    public static void main(String[] args) {
    Father f = new Father("奇异果");
       System.out.println(f.name);
    Son s = new Son("大菠萝", "哈密瓜");
        System.out.println(f.name);//打印出来的是你new的实例对象f的name
       System.out.println(s.name);
    }
    }
      

  13.   

    楼主看清调用啊你f.name是调用父类的 而且你父类的name赋了初值又没改变所以当然不会变..
      

  14.   

    super()是用来调用父类的构造方法的