3,4主要因为调用get方法public String getName() {
return name;
}其实是public String getName() {
return this.name;
}默认会产生指向自己reference,所有你调用get就会得到父类的属性。
return name;
}其实是public String getName() {
return this.name;
}默认会产生指向自己reference,所有你调用get就会得到父类的属性。
调试欢乐多
所以第一个
System.out.println(n.msg);----------(1)输出null
回打印出null,因为这里输出的是child.msg的值
而这里它的值并没有初始化。
child的构造函数显然只调用parent的构造函数
而这个构造函数只初始化了parent.msg的值
同样的道理,因为child没有重载parent中相应的方法
所以调用的都是parent的方法,而这些方法都返回parent自己的变量值
父类是不可能知道字类会有同名的属性的
你在子类当中重定义了两个变量相当于
parent.name和this.name已经不是同一个变量
msg = name.concat(name);
concat 是String对象的方法
name:是个成员变量
因为Child没有声明构造函数,所以为空,这个只是单纯的声明一个Child类,没做什么实际的东西。因此n.msg输出为null,n.name输出为child,简单的输出Child中定义的变量值。
n.getMsg()调用Parent中的函数,其中所用到的变量为Parent中声明的变量。n.getName()
也是一样的道理,所以为你所看到的输出。
因为对象创建在堆内存的不同地方
System.out.println(n.msg);----------(1)输出null,调用子类
System.out.println(n.name);---------(2)输出child,调用子类
System.out.println(n.getMsg());-----(3)输出parentparent,继承,调用父类
System.out.println(n.getName());----(4)输出parent,同上
Parent p = new Parent();
System.out.println(p.getMsg());-----(5)输出parentparent,同上(新建了一个事例)
在子类中添加这样一个函数:
public String getParentMsg() {
return super.msg;
}
public Parent() {
super();
setMsg();
}
public String getMsg() {
return msg;
}
public String getName() {
return name;
}
protected void setMsg() {
msg = name.concat(name);
}
}public class Child extends Parent {
protected String name = "child";
protected String msg = null;public static void main(String[] args) {
Child n = new Child();
System.out.println(n.msg);
System.out.println(n.name);
System.out.println(n.getMsg());
System.out.println(n.getName());
Parent p=new Parent();
System.out.println(p.getMsg());}
public void setMsg() {
System.out.println(name);
msg = name.concat(name);
}
}结果程序抛出空指针异常:在setMsg方法里name为空??