2012-07-26 64 views
1

是不是这个子类继承了所有东西都是超类真?但子类无法访问其超类的私有属性/方法,但可以访问它自己的。所以我写了一个测试程序。但似乎子类没有一个!私有成员没有被Java中的子类继承(或可以覆盖)?

class a { 
    private void set() { 
      System.out.println("a.set()"); 
    } 
} 
public class b extends a { 
//  private void set() { 
//  System.out.pritln("b.set()"); 
//  } 
     void f() { 
      set(); 
     } 
     public static void main(String[] args) { 
      b b = new b(); 
      b.f(); 
     } 
} 

如果我注释掉b中的set()方法,它将不会编译。

有什么想法? JVM视图的任何解释?

+1

它们是继承的,但默认情况下不可访问。如果你真的想,你可以利用一些技巧让它们在运行时变得可访问。 – aroth 2012-07-26 01:54:40

回答

4

是的,private方法不能从派生类访问。 protectedpublic

当您在派生类中声明set时,您可以访问此派生版本,因为它现在是类的一部分(不再是基类方法private)。

如果您尝试致电super.set(),仍然会出现错误。

编辑:这个诡计正在谈论我假设的是反思。 :) 别。

+1

+1反对通过重新感染避开访问权限的建议 – akf 2012-07-26 01:58:01

+0

谢谢L.G. ,我知道super.set()无疑是无法访问的(或无法访问?Orz ...)。我感到困惑的是:因为b继承了a的所有内容,b有它自己的set(),所以它在f()中使用set(),这是理性的,对吗?我想知道在JVM中正在做什么...... – larmbr 2012-07-26 02:15:16

0

这个问题是没有意义的。私人是私人的。当前课程以外的所有内容都不可见。如果你想'保护',使用它。

+1

私有是私有的......直到有人使用反射来查找Field并在其上调用setAccessible(true)。问题是这个字段是否是继承的,它是,不管它是否真的可见。 – aroth 2012-07-26 01:56:15

+0

@aroth虽然公平起见,但我只看到在一些“黑客”中做过的事情;而不是在设计中:) – 2012-07-26 01:57:23

+0

@pst和单元测试。 – 2012-07-26 01:57:39

0

如果您想要介于两者之间,请使用“受保护”修饰符而不是“私有”修饰符;基本上保护意味着除了子类以外的所有东西都是私有

+1

和相同的包。 – 2012-07-26 02:05:24