日期:2014-05-20  浏览次数:20706 次

关于继承的一道试题苦逼无分求解答啊~
public class One { 
  protected void printA()
        {System.out.println("one A");}  
  private void printB()
        {System.out.println("one B");}  
  protected void printAB()
         {printA();printB();} }

 public class Two extends One {  
   protected void printA()
       {System.out.println("two A");}  
   private void printB()
        {System.out.println("two B");}  
   public static void main(String[] args) 
        {   Two t = new Two();   t.printAB();} } 
结果是:
two A
one B
不太理解为什么这样子,父类的printB()是private为什么还会被调用??求解释啊啊,拜谢了~
------解决方案--------------------
我的理解是
  首先可以看到t.printAB()这个方法是父类的,调用这个方法的时候会先执行父类的方法,如果子类重写了才会去执行子类的,
  在父类定义的private的方法在子类肯定不存在重写那么只有调用父类的 而定义的 protected 方法被子类重写那么相当于父类方法被覆盖 所以结果显而易见了! 你不妨把这些修饰符多换下看是不是想要的结果!

------解决方案--------------------
引用:
我的理解是
  首先可以看到t.printAB()这个方法是父类的,调用这个方法的时候会先执行父类的方法,如果子类重写了才会去执行子类的,
  在父类定义的private的方法在子类肯定不存在重写那么只有调用父类的 而定义的 protected 方法被子类重写那么相当于父类方法被覆盖 所以结果显而易见了! 你不妨把这些修饰符多换下看是不是想要的结果!


同意。
LZ可以在方法上加上@Override
你会看到 class Two method printB 直接被IDE报出ERROR。
------解决方案--------------------
嗯嗯,挺有道理的,不过@override是什么??
------解决方案--------------------
标识此方法重载 如果不是重载的会出编译时异常。
------解决方案--------------------
同意一楼
------解决方案--------------------
protected:继承权限
private:私有权限 

好好看看基础。
------解决方案--------------------
跟方法的访问权限有关,protected void printA(),所以被覆盖掉了,所以会调用Two的方法,但是private void printB()是One私有的,所以不会被继承覆盖,而AB方法中调用的自然就是One中的B方法了
------解决方案--------------------
楼主手动DEBUG一下就知道了 。
------解决方案--------------------
The method printB() from the type Two is never used locally
------解决方案--------------------
终于弄明白了。谢谢各位!
------解决方案--------------------
该回复于2012-09-22 11:23:03被版主删除