大家先看看下面这个例子。我想明白它的工作原理是什么?
它的输出是A.a与A.b。可是我不太明白为什么是这个样子啊,B继承了A后,A的ab()方法不是传给它了吗,这个时候方法ab()不是直接在B中可以调用了吗?
或者按我对继承的原理的理解应该是,主方法调用了B的默认构造函数,B是A的子类,所以先调用A的默认构造函数。但是这之后发生了什么啊,不还是调用了B中从A继承来ab()方法了,为什么结果会是那样??
帮忙给我讲讲它的原理。谢谢class A{
 private void a(){
  System.out.println("A.a");
 }
 private void b(){
  System.out.println("A.b");
 }
 public void ab(){
  a();
  b();
 }
}
public class B extends A{
 private void a(){
  System.out.println("B.a");
 }
 protected void b(){
  System.out.println("B.b");
 }
 public static void main(String[] args){
  new B().ab();
 }
}

解决方案 »

  1.   

    咋看之下好像是输出“B.a”,“B.b“偶运行一下看看在说~
      

  2.   

    只有非private方法才能被覆盖,如果父类的方法是private的话,你下面产生的方法,并不是覆盖,仅是产生了一个新的方法. 
    private的方法只有类自己看得到,就算子类也看不到.你可以把a,b方法都改为public的话,结果就是B.a和B.b了!
    给你个例子:
    public class PrivateOverride{
     private void f(){
    System.out.println("private f()");
    }
    public static void main(String[] args){
    PrivateOverride po = new PrivateOverride();
    po.f();
    }
    }
    class Derived extends PrivateOverride{
    void f(){
    System.out.println("public f()");
    }
    }
      

  3.   

    运行果然是A.a与A.b
    偶也8 知道why
      

  4.   

    请看清楚你自己给出来的例子,A类有2个私有方法一个共有方法,B类有2个私有方法,虽然A类的私有方法和B类的私有方法同名,但是没有任何关系,由于B类继承A类,所以可以用A类的公有方法,这时A类公有方法调用自己的2个私有方法,当然是输出A.a与A.b
      

  5.   

    sor例子给错了:public class PrivateOverride{
     private void f(){
    System.out.println("private f()");
    }
    public static void main(String[] args){
    PrivateOverride po = new Derived();
    po.f();
    }
    }
    class Derived extends PrivateOverride{
    void f(){
    System.out.println("public f()");
    }
    }
      

  6.   

    测试了一下,确实如此,见识了。
    似乎是因为Class A 中的a,b 2个方法是private的,无法被子类覆写的缘故。把A中的ab()方法copy至B中后,就会输出“B.a,B.b”这说明A中的a(),b()和B中的a(),b()是同时存在的。
      

  7.   

    class A{
     private void a(){
      System.out.println("A.a");
     }
     private void b(){
      System.out.println("A.b");
     }
     public void ab(){
      a();
      b();
     }
    }
    public class B extends A{
     private void a(){
      System.out.println("B.a");
     }
     protected void b(){
      System.out.println("B.b");
     }
     public static void main(String[] args){
      new B().ab();
     }
    }----------------------------------------------------------
    首先B是继承于A的,当然就继承了了A的所有public 的方法和变量,A中的a()和b()方法都是为public 的ab()服务的,意思是ab()中同步调用了a()和b()。我们再看一下类B,它自己的类体里没有ab()函数,然而在程序入口处调用了new B.ab(),所以这里的调用方法其实就是A.ab()方法,呵呵,谁叫A.ab()方法是public的呢,如果你把权限换成private ,那这段程序将会失败。
     
                                              ------------罗毅
      

  8.   

    晕,private显然是不能继承的,但你可以用public的方法间接调用阿
      

  9.   

    在父类public方法里调用,子类的方法仍然不会调用到父类的private,所以没有违反信息隐藏的原则阿
      

  10.   

    因为你调用  new B().ab();是调用B类继承A类的ab()方法
    而A类的ab()中的a(),b()执行的是A类的a(),b()方法啊
    而不是B类中重载的方法