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的引擎盖下正在做什么。。。