java文件中
class A{
int i=27;
public int f(){
     return g();
}
private int g(){
     return i;
}
}
class B extends A{
   int i=47;
   public int g(){
      return i;
   }
}
public class Test{
   public static void main(String[] args){
       A a1=new B();
   System.out.println(a1.f());
   }
}现问:上面的题为什么会输出27呢,

解决方案 »

  1.   

    因为你A中private int g()是private的,private就不存在多态一说了所以,不确定一个方法是否被重写,在方法上加上@Override注解最好不过了
      

  2.   

    java文件中
    class B{
    int i=27;
    public int f(){
    return g();
    }
    private int g(){
    return i;
    }
    }
    public class Test{
      public static void main(String[] args){
      B a1=new B();
    System.out.println(a1.f());
      }
    }
     
      

  3.   

    System.out.println(a1.f())中的f()方法是 A 中的方法,B中没有,A中的g()修饰符是 private,所以不会被继承,也就不能被重写,所以得到是27,如果把 A类中的g()修饰符改为 public,输出就会变成 47
      

  4.   

    重写、private、this等的使用
    知识点
      

  5.   

    我的理解是:首先,子类继承了父类的所有方法和属性(这是一定的),由于父类的g()方法有private修饰,相当于默认加了final修饰,子类此时不能重写父类的g()方法,但子类还是继承了该方法,只是不能直接的去访问。这有点类似与封装属性的性质,讲封装时候,我们是去调用公有的方法去访问私有变量的,此时我们一样可以去调用公有的方法去调用私有的方法,所以通过调用public的f(),进而去方法private的g(),该g()正是父类中声明的方法,所以输出上述结果
      

  6.   

    证明上面说的
    class P
    {
    public void m()
    {
    System.out.println(f());
    }
    private int f()
    {
    return 1;
    }
    }
    public class TestPri {
    public static void main(String[] args) {
    P p =new P();
    p.m();
    }

    }