在java开发实战经典里有这么一段话:在父类里定义了private的成员方法,再到其子类里声明同名的权限为default的成员方法,那么这不算是方法覆写。
  可是如下代码执行结果:
    public class Person 
    {
        private String name="abc";
     private void printMessage(){System.out.println("Person----->print()"+"name="+name); }
        private void printMessage2() { System.out.println("Person----->print2()");}
        public void fun()
        {
           this.printMessage();
           this.printMessage2();
         }
    };    public class Student extends Person 
    {
      private String name="xyz";//属性覆写
     void printMessage()
        {
         System.out.println("Student----->print()"+"name="+name+", sex="+sex);
        }
        public void printMessage2()
        {
            System.out.println("Student----->print2()");
        }
    };    public class Main
    {
        public static void main(String[] args)
        {
            new Student().printMessage();
         new Student().printMessage2();
         new Student().fun();
        }
     }
     netbeans里执行结果为:
     Student----->print()name=xyz, sex=null
     Student----->print()name=xyz, sex=null
     Student----->print2()
     Person----->print()name=abc, age=0
     Person----->print2()
请教是什么原因?谢谢!

解决方案 »

  1.   

    你是那一块不懂呢??System.out.println("Student----->print()"+"name="+name+", sex="+sex);
    这一块你的变量都没有声明哦,还有父类私有的东西子类是不会继承的,对子类是透明的,那么子类中即使写了和父类同样的方法声明,这个也不叫覆盖,是子类自己的方法,谈不上覆盖!!
      

  2.   

    你想问的是,为什么后面new Student().fun(); 打印的还是Person----->print()name=abc, age=0
      Person----->print2()对吧???   我觉得你应该看一下动态绑定。。 
      

  3.   

    我的经验学习中好像,子类不能继承父类的private变量方法。
    默认的访问限定符是protected ,如果子类和父类在同一个包中,子类继承父类除private的成员变量(以及方法)作为自己的成员变量(作为自己的方法); 
    如果子类和父类不在同一个包中,子类继承父类的protected,public成员变量,并继承父类的protected、public方法作为子类的方法。但不能继承父类的友好变量和友好方法。
      

  4.   

    谢谢各位的热心帮助!
    我学的太少了,一方面还没搞清楚“子类可以继承的不是父类的所有成员”,另一方面是对覆盖需要再好好理解,再就是要看看动态绑定。
    是的,代码贴的有些乱,以后多注意些。
    刚学java,请大家多多指导。谢谢!
      

  5.   


    作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × ×