Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 复杂继承/包组合中的包私有成员可见性-验证可见性的Qiuck通用规则_Java_Inheritance_Visibility_Protected_Package Private - Fatal编程技术网

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()
及其所有私有成员(在引擎盖下)。但如果我将下面代码中的包private
f()
更改为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和Driver在同一个包中(即来自任何驱动程序的 方法代码
    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)都不起作用。我们也不关心其他类在什么包中
  • 但是对于包私有成员,我们关心的是哪个包中的哪个层次类,对于一般情况,我不能制定一个简单可靠的“快速猜测”规则

    注:有趣的旁注:

    如果我在上面的代码段(在文章的顶部)中重写派生和派生FromDerived中的方法(将它们保留为包私有),则输出为:

    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