下面两个程序,都是通过在子类的构造方法中调用 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);
}
}输出结果:
奇异果
奇异果
哈密瓜
我不太理解,为什么第二个程序把 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、 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 ;
这样可以把你赋值的大菠萝找到,
f已经是一个实例对象了,所以他的值不会改变了,
s确实对父类传了值,但你想要用实例对象调的话,你传的值就被覆盖了
你还可以在子类的构造函数或方法里加super.name;打印大菠萝
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);
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); // 输出父类的值
9楼说的很对
super()是调用父类构造函数,不是建立一个父类对象,最好把调用构造函数与建立一个新对象区分开来,虽然通常代码,无论是通过new还是通过反射,构造函数与新建对象都是一起进行的,但是调用构造函数和新建对象不是一回事,因为可以不通过构造函数来新建对象,而且一个对象也可能再次调用构造函数,当然,这需要绕过java编译期的机制。
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);
}
}