Java中的子类不继承(或重写)私有成员?

Java中的子类不继承(或重写)私有成员?,java,jvm,Java,Jvm,子类不是从超类继承了所有东西吗?但子类无法访问其超类的私有属性/方法,但可以访问其自己的属性/方法。所以我写了一个测试程序。但子类似乎并没有一个 class a { private void set() { System.out.println("a.set()"); } } public class b extends a { // private void set() { // System.out.pritln("b.set()")

子类不是从超类继承了所有东西吗?但子类无法访问其超类的私有属性/方法,但可以访问其自己的属性/方法。所以我写了一个测试程序。但子类似乎并没有一个

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视图中有任何解释吗?

是的,
私有
方法无法从派生类访问<代码>受保护的和
公共的

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

如果试图调用
super.set()
,仍然会出现错误


编辑:我想aroth所说的技巧是反射。:)不要这样做。

是的,
private
方法无法从派生类访问<代码>受保护的和
公共的

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

如果试图调用
super.set()
,仍然会出现错误


编辑:我想aroth所说的技巧是反射。:)不要。这个问题毫无意义。私密就是私密。对当前类以外的所有对象都不可见。如果你想得到“保护”,就使用它。

这个问题毫无意义。私密就是私密。对当前类以外的所有对象都不可见。如果您想要“受保护”,请使用它。

如果您想要介于两者之间的内容,请使用“受保护”修饰符而不是“私有”修饰符;protected本质上是指除子类以外的所有私有对象。

如果您想要介于两者之间的内容,请使用“protected”修饰符而不是“private”修饰符;protected本质上意味着除子类之外的所有私有对象。

它们是继承的,但默认情况下不可访问。如果您真的想,可以使用一些技巧使它们在运行时可访问。它们是继承的,但默认情况下不可访问。如果你真的想,可以使用一些技巧使它们在运行时变得可访问。Private是私有的…直到有人使用反射查找
字段并调用
setAccessible(true)
。问题是这个字段是否是继承的,而且它是继承的,不管它是否真的可见。@aroth虽然公平地说,我只在一些“黑客”中看到过这种情况;不考虑设计:)@TylerTreat-只有一些ORM或DI框架。其他框架要求您通过可访问的方法或字段公开属性。Private是私有的…直到有人使用反射查找
字段
并对其调用
setAccessible(true)
。问题是这个字段是否是继承的,而且它是继承的,不管它是否真的可见。@aroth虽然公平地说,我只在一些“黑客”中看到过这种情况;不考虑设计:)@TylerTreat-只有一些ORM或DI框架。其他框架要求您通过可访问的方法或字段公开属性。+1关于避免通过RelefectionThank you L.G.规避访问权限的建议,我知道super.set()无疑是不可访问的(或不可访问的?Orz…)。我感到困惑的是:由于b继承了a的所有内容,b有自己的set(),所以它在f()中使用set(),这是理性的,对吗?我想知道在JVM中正在做些什么…+1为避免通过RelefectionThank you L.G.规避访问权限,我知道super.set()无疑是不可访问的(或不可访问的?Orz…)。我感到困惑的是:由于b继承了a的所有内容,b有自己的set(),所以它在f()中使用set(),这是理性的,对吗?我想知道在JVM的引擎盖下正在做什么。。。