Java 如何使成员对其子类可见(可能不在同一个包中)?
我有一个抽象基类,其中包含某些字段/抽象方法 即使孩子们不住在同一个包裹里,我如何让孩子们看到这些?(我认为Java 如何使成员对其子类可见(可能不在同一个包中)?,java,Java,我有一个抽象基类,其中包含某些字段/抽象方法 即使孩子们不住在同一个包裹里,我如何让孩子们看到这些?(我认为public有点太开放了,protected不起作用!) (对于下面的注释,protected不起作用,因为protected字段仅在同一个包中可见) 为了证明这一点,下面的代码不起作用。请告诉我为什么不 package a; public class Base { protected void foo() {} } // in a separate file/package
public
有点太开放了,protected
不起作用!)
(对于下面的注释,protected
不起作用,因为protected
字段仅在同一个包中可见)
为了证明这一点,下面的代码不起作用。请告诉我为什么不
package a;
public class Base
{
protected void foo() {}
}
// in a separate file/package
package b;
public class Child extends Base
{
private Base wrappedBase = new Base();
@Override
protected void foo()
{
wrappedBase.foo(); // <<<<< This throws "The method foo from type Base is not visible"
}
}
a包;
公共阶级基础
{
受保护的void foo(){}
}
//在单独的文件/包中
b包;
公共类子扩展基
{
private Base wrappedBase=new Base();
@凌驾
受保护的void foo()
{
wrappedBase.foo();//通常,您只需使用protected
,它在JLS中限制的子类中工作:
在foo/Parent.java
中:
package foo;
public class Parent {
protected int x;
}
package bar;
import foo.Parent;
public class Child extends Parent {
public Child() {
// Look ma, access to a protected variable declared
// by my superclass in a different package!
x = 10;
}
}
在bar/Child.java
中:
package foo;
public class Parent {
protected int x;
}
package bar;
import foo.Parent;
public class Child extends Parent {
public Child() {
// Look ma, access to a protected variable declared
// by my superclass in a different package!
x = 10;
}
}
现在,您给出的示例略有不同,因为您试图通过编译时类型Base
…访问受保护的变量,但这不起作用。您只能通过与执行访问的代码(或子类型)具有相同编译时类型的表达式访问受保护的成员。如下所示:
设C为声明受保护成员的类。仅允许在C的子类S的主体内访问
此外,如果Id表示实例字段或实例方法,则:
- 如果访问是通过限定名Q.Id进行的,其中Q是ExpressionName,则当且仅当表达式Q的类型是S或S的子类时,才允许访问
- 如果访问是通过字段访问表达式E.Id进行的,其中E是主表达式,或者通过方法调用表达式E.Id(…),其中E是主表达式,则当且仅当E的类型是S或S的子类时,才允许访问
无法向所有子类提供对超类所有对象的受保护成员的访问。这是故意的-它阻止代码仅仅为了访问更多其他类型的成员而创建子类。为什么您认为受保护的不起作用呢?因为我试过了!(另外,protected
仅使同一包中的字段可见!)不,绝对不是。请展示您所做的尝试-因为受保护的正是为访问子类而设计的。请看。来吧,@onetwotree:Jon Skeet,在这里有最高的代表,告诉您受保护的允许您访问任何子类的成员。他提供了一个到规范的链接。检查您的事实。@OneTwOthere您的示例没有访问它自己的foo方法,而是尝试使用您创建的新对象的方法。请尝试super.foo()
好吧,这不是我要做的事情。请查看我更新的问题。@onetwotree:查看我更新的答案。但它是访问包外的受保护成员,因此您的声明“受保护字段仅在同一个包中可见”不正确。