Java 复杂继承/包组合中的包私有成员可见性-验证可见性的Qiuck通用规则
如果基类和派生类位于不同的包中,则基类中的包私有成员不应继承,因此派生类中不应包含该成员,也就是说,通过Java 复杂继承/包组合中的包私有成员可见性-验证可见性的Qiuck通用规则,java,inheritance,visibility,protected,package-private,Java,Inheritance,Visibility,Protected,Package Private,如果基类和派生类位于不同的包中,则基类中的包私有成员不应继承,因此派生类中不应包含该成员,也就是说,通过Base obj=new-Derived()和Derived obj=new-Derived()-obj.member()都不能访问该成员在任何情况下都会给出编译错误 但是我看到对于Base obj=new-Derived(),obj.f()是可以访问的 是的,私有成员仍然存在,因为当我创建new-Derived()时,也会创建new-Base()及其所有私有成员(在引擎盖下)。但如果我将下面
Base obj=new-Derived()
和Derived obj=new-Derived()
-obj.member()都不能访问该成员
在任何情况下都会给出编译错误
但是我看到对于Base obj=new-Derived()
,obj.f()
是可以访问的
是的,私有成员仍然存在,因为当我创建new-Derived()
时,也会创建new-Base()
及其所有私有成员(在引擎盖下)。但如果我将下面代码中的包privatef()
更改为private,obj.f()
将是Base obj=new-Derived()
的编译错误,正如预期的那样。。。无论如何,我怀疑在我的包私有成员示例中,它与此完全相同-从派生类访问其超类(基类)的私有(-)成员(隐式存在)
(-)(因为基和派生在不同的包中)
及
及
最后
import org.another_pkg.Derived;
import com.totally.different_pkg.DerivedFromDerived;
public class Driver { // Base class is in same pkg as Driver!
public static void main(String[] args) {
Base obj1 = new Derived();
obj1.f(); // f() is visible!
Base obj2 = new DerivedFromDerived();
obj2.f(); // f() is visible!
}
}
请您制定一个快速简单的实用规则(换句话说,JLS和公共场所默认可见性定义除外)如何理解复杂继承/包组合中的可见性(访问)(我们可能有复杂的层次结构基础->派生->派生->派生2->派生3和每个类)可以在相同/不同的软件包中。如何快速查询辅助功能
例如,对于(基类的)受保护成员,“快速猜测”规则非常简单:
Base obj=new Base();obj.baseProtectedMember();
编译)=>任何组合都可以工作(Base obj1=new Derived2();
Derived2 obj2=新的Derived2(),etc-obj1.baseProtectedMember()
和obj2.baseProtectedMember()
是可见的,并且可以调用)。我们不关心其他类在什么包中Base obj=new Base();obj.baseProtectedMember();
不编译)=>任何组合(见1)都不起作用。我们也不关心其他类在什么包中f() from Base called
f() from Base called
Base
和Driver
在同一个包中,因此Driver
可以看到Base
的包私有方法。如果将Base obj1=new-Derived()
声明为Derived obj1=new-Derived()
则看不到f()
。对于Base obj2=new-DerivedFromDerived(),同样适用
,如果您将其声明为DerivedFromDerived
,您将看不到f()
快速简单的规则是:包私有成员在定义它们的包中可见。“不应被继承”它们被继承,只是不可见而已。
package com.totally.different_pkg;
import org.another_pkg.Derived;
public class DerivedFromDerived extends Derived {
}
import org.another_pkg.Derived;
import com.totally.different_pkg.DerivedFromDerived;
public class Driver { // Base class is in same pkg as Driver!
public static void main(String[] args) {
Base obj1 = new Derived();
obj1.f(); // f() is visible!
Base obj2 = new DerivedFromDerived();
obj2.f(); // f() is visible!
}
}
f() from Base called
f() from Base called