class Person {
        private String name="hhhhhhhh";
        public void setName(String name) {
                this.name = name;        
        }
        public String getName() {
                return name;
        }}class Student extends Person {
        private String school;
        public void setSchool(String school) {
                this.school = school;
        }
                public String getSchool() {
                return school;
        }
        public void getSuper() {
          System.out.println("super:"+super.getName());
        
        }
                
}class TestPerson {
        public static void main(String[] args) {
                Student student = new Student();
                //student.setName("John");//1此句注释掉的话,3行和4行打印的都是:"hhhhhhhh";否则都是"John"。
                student.setSchool("SCH");//2
                student.getSuper();//3
                System.out.println(student.getName());//4
                System.out.println(student.getSchool());//5
        }
}
//我就不明白了,setName(),貌似操作的是父类的 private String name="hhhhhhhh";。但是既然是继承下来了,那操作的应该是子类的 private String name="hhhhhhhh";。
//所以,1行不注释的话,按理说3行是打印"hhhhhhhh",4行打印:"John"。所以就不明白了。希望大家给个解释,谢谢。。参考帖子:http://www.cn-java.com/www1/bbs/viewthread.php?tid=32130

解决方案 »

  1.   

    你没有对getName()进行重写,父类的getName()和子类的getName()有什么区别呢?
      

  2.   

    //我就不明白了,setName(),貌似操作的是父类的 private String name="hhhhhhhh";。但是既然是继承下来了,那操作的应该是子类的 private String name="hhhhhhhh";。
    //所以,1行不注释的话,按理说3行是打印"hhhhhhhh",4行打印:"John"。所以就不明白了。希望大家给个解释,谢谢。。
    --------------------------
    LZ,针对你的例子说事。
    子类新增的方法中可以写:
      return this.getName();
      this.setName("dddd");
    但是子类新增的方法中不可以写:
      return this.name;
    就是说父类的private 实例字段 name,只有父类的方法才能访问,换句话说,子类定义的方法不能直接访问父类的私有实例字段。也就是,父类的私有实例字段与子类新定义的私有实例字段是有区别的。因此,
    但是既然是继承下来了,那操作的应该是子类的 private String name="hhhhhhhh";。 ]是你理解上出现了误读,因为子类没有name。
      

  3.   

    private 属性的变量是继承不下来的 属于父类私有变量 子类中并不存在 
    所有对 private String name="hhhhhhhh";的操作都是在操作父类中的
      

  4.   

    应该是通过继承的父类方法调父类的元素吧,你父类的name是private的啊,不继承的吧
      

  5.   

    但是既然是继承下来了,那操作的应该是子类的 private String name="hhhhhhhh";。————继承的意思就是:还是父类的那个name,只是现在无法直接访问了而已。
      

  6.   


    就算子类重写了 getName() 也访问不了父类的 private 属性吧?
      

  7.   

    Java code
    主要是继承的对象搞混了。
    上面的例子里继承的是方法,不是成员变量。class Person {        // 这个不能被子类继承,也不能被子类访问
            private String name="hhhhhhhh";        // 这个可以被子类继承为protected。能在子类里被调用。但操作的父类的成员变量
            public void setName(String name) {
                    this.name = name;        
            }
            public String getName() {
                    return name;
            }
     
      

  8.   

    sun公司给出的官方解释是私有变量在子类中有,但是不能用,即能看不能用,相当于不能继承