当我浏览this文章时,在超类中的私人会员部分下,我看到了这一行
嵌套类可以访问其封闭的所有私有成员 class-字段和方法。因此,公共或受保护的嵌套 由子类继承的类具有对所有子类的间接访问权限 超类的私人成员。
我的问题是,我们如何才能直接访问Nested
中的Base
Derived
类public
(我们可以访问任何protected
,Derived
字段)?
和
如果有办法,p
如何Base
访问Nested
public class Base {
protected int f;
private int p;
public class Nested {
public int getP() {
return p;
}
}
}
class Derived extends Base {
public void newMethod() {
System.out.println(f); // i understand inheriting protected field
// how to access the inherited Nested class here? and if accessed how to retrieve 'p' ?
}
}
到{{1}}的私有字段?
{{1}}
提前感谢您在此主题中花费的时间和精力!
答案 0 :(得分:3)
Base.Nested theClassBro= new Base.Nested();
或者对于Derived类,这应该有效:
Derived.Nested theClassBro= new Derived.Nested();
我不确定您是否需要使用超级关键字
答案 1 :(得分:1)
非静态内部类总是需要它嵌套的类的封闭实例。在类Base或类Derived中定义的代码中(因为它继承了内部类),你可以简单地编写
Nested nested = new Nested();
创建新实例。然后,您可以在嵌套引用上调用getP()方法以获取私有p值的值。此值是包含嵌套实例的类Base实例的一部分。
因为内部类是公共的,所以在Base或Derived之外定义的代码也可以创建实例。但这需要一个包含Derived或Base的实例。 Java具有特殊语法,您可以在封闭类的实例上调用new运算符。所以在Base或Derived之外你可以做到:
Base base = new Base();
Base.Nested baseNested = base.new Nested();
Derived derived = new Derived();
Derived.Nested derivedNested = derived.new Nested();
Base.Nested d = derivedNested;
也可以导入Base.Nested,以便您可以编写:
Base base = new Base();
Nested baseNested = base.new Nested();
Derived derived = new Derived();
Nested derivedNested = derived.new Nested(); // Base.Nested reference
了解这种语法很有用,但如果只允许封闭类创建内部类的新实例,我觉得代码通常更清晰(更容易理解,更好的封装)。如果需要一个逻辑上只属于Base但不需要封闭实例的类,也可以使用静态嵌套类。
答案 2 :(得分:0)
如您所知,Nested
只能在包含Nested
类定义的类的封闭实例时创建,在我们的示例中,它是Enclosing
类。为了能够通过继承其Enclosing
类来访问Nested
类的私有成员,我们需要向Derived
类的构造函数提供包含{{Enclosing.Nested
类的封闭实例。 1}}。以下代码应该更清楚地理解。为了更好地理解,我更改了原始示例中的变量和类的名称:
public class Enclosing {
protected int protectedMember = 3;
private int privateMember = 7;
public class Nested {
public int getPrivate() {
return privateMember;
}
public int getProtected() {
return protectedMember;
}
}
}
class Derived extends Enclosing.Nested {
//Provide the enclosing instance that contains Enclosing.Nested
public Derived() {
new Enclosing().super();
}
//Access protected member of Enclosing class
public void accessProtectedMember() {
System.out.println(getProtected());
}
//Access private Member of Enclosing class
public void accessPrivateMember() {
System.out.println(getPrivate());
}
}
public class Test {
public static void main(String... args) {
Derived derived = new Derived();
derived.accessProtectedMember();
derived.accessPrivateMember();
}
}