3,4主要因为调用get方法public String getName() {
        return name;
    }其实是public String getName() {
        return this.name;
    }默认会产生指向自己reference,所有你调用get就会得到父类的属性。

解决方案 »

  1.   

    在Child 和 Parent类中的两个属性已经是不同的了
    所以第一个
    System.out.println(n.msg);----------(1)输出null
    回打印出null,因为这里输出的是child.msg的值
    而这里它的值并没有初始化。
    child的构造函数显然只调用parent的构造函数
    而这个构造函数只初始化了parent.msg的值
    同样的道理,因为child没有重载parent中相应的方法
    所以调用的都是parent的方法,而这些方法都返回parent自己的变量值
    父类是不可能知道字类会有同名的属性的
      

  2.   

    你把父类的protected变成public试试
      

  3.   

    我认为是自类定义的变量覆盖了父类的变量
    你在子类当中重定义了两个变量相当于
    parent.name和this.name已经不是同一个变量
      

  4.   

    借问:例子中下句的concat方法定义怎么没有看见?等号后面的name是什么?
            msg = name.concat(name);
      

  5.   

    to learnner:
      concat 是String对象的方法
      name:是个成员变量
      

  6.   

    Child n = new Child();
    因为Child没有声明构造函数,所以为空,这个只是单纯的声明一个Child类,没做什么实际的东西。因此n.msg输出为null,n.name输出为child,简单的输出Child中定义的变量值。 
    n.getMsg()调用Parent中的函数,其中所用到的变量为Parent中声明的变量。n.getName()
    也是一样的道理,所以为你所看到的输出。
      

  7.   

    子类和父类的名字相同但并不表明他们可以覆盖!
    因为对象创建在堆内存的不同地方
      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,同上(新建了一个事例)
      

  8.   

    http://expert.csdn.net/Expert/topic/1629/1629256.xml?temp=.3064539
      

  9.   

    你可以这样试试是不是子类的成员变量覆盖父类的成员变量:
    在子类中添加这样一个函数:
    public String getParentMsg() {
            return super.msg;
        }
      

  10.   

    我把程序改成这样:
    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为空??