2014-04-17 18 views
1

所以,一个朋友送我这个代码,并表示,它已成功编译并返回42 但是,在困扰的事情是在父类中的方法“返回”42是私有的,被调用的方法在子类中,并且是公共的。那么,任何人都可以说出为什么以及如何运作?Java中,继承 - 在父母的私有字段是通过孩子的公共方法访问

static class A { 
    private int f() { 
     return 42; 
    } 
} 

static class B extends A { 
    public int f2() { 
     return super.f(); 
    } 
} 

public static void main(String[] args) { 
    System.out.print(new B().f2()); 

} 

它返回42

我试图摆脱静态的,

class A { 
    private int f() { 
     return 42; 
    } 
} 

class B extends A { 
    public int f2() { 
     return super.f(); 
    } 
} 

public static void main(String[] args) { 
    Main m= new Main(); 
    B b= m.new B(); 
    System.out.print(b.f2()); 

} 

仍然会返回42

回答

6

由于两个班(AB)的嵌套在Main,他们可以访问private int f()方法。

如果您从顶级类中提取AB的源,则不会发生这种情况,您将无法编译。

0

私人的一点是,“外”类应该不能够看到私有变量。但是,A和B是同一类的两个组成部分,或者是互相嵌套,使他们可以访问对方的私有成员。

那么这将工作:

public class A { 

    private void a() { 
    int bVal = this.new B().val; //! Accessing B private 
    } 

    class B { 
     A a = new A(); 
     private int val = 10; 
     public void b() { 
     a.a();  // !! Accessing A private 
     } 
} 

但是,这会失败,即使A和B都是在同一文件但不在对方:

class A { 
    private void a() {} 
} 

class B extends A { 
    A a = new A(); 
    public void b() { 
     a.a(); // can't see even if B extends A 
    } 
} 
0

这是因为两个类A和B被嵌套在另一个类中,即两个类是内部类(或“一部分”)另一个相同类别。由于它们(数据成员和方法)基本上都是外部类的成员,所以即使是私有的,它们也可以在其他内部类中访问。

Java允许我们嵌套类,如果你不知道嵌套类第一次读到这样的:
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

class Outer{ 


class A { 
    private int f() { 
     return 42; 
    }//Method f() is a private member of A and accessible by Outer 
} 

class B extends A { 
    public int f2() { 
     return super.f(); 
    }//As class B is inner class of Outer it can access members of outer,thus indirectly member of A 
} 

public static void main(String[] args) { 
    System.out.print(new B().f2()); 

} 

} 
相关问题