Oracle文档(在下面的链接中)说:
非静态嵌套类(内部类)可以访问其他成员 封闭类的,即使它们被宣布为私有。
但是在下面的示例中,我创建了一个对象objin
(内部类),它无法访问其封闭外层类的任何方法或变量。以下是代码,您可以对此进行澄清吗?
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
package Package_1;
public class Outer {
int k;
public void Multiply()
{
System.out.println("inside outer class' method multiply");
}
public class Inner {
int l;
public void Division()
{
System.out.println("inside inner class' method Divison");
}
}
}
使用Main方法的类
package Package_1;
public class D {
public static void main(String[] args) {
Outer objout = new Outer();
objout.k = 5;
objout.Multiply();
Outer.Inner objin = objout.new Inner();
objin.l = 7;
objin.Division();
}
}
使用objin
对象,我无法访问其封闭类中的Multiple
方法。
答案 0 :(得分:5)
从非静态嵌套类(内部类)的代码中,您可以访问封闭类的公共成员和私有成员。
当您尝试执行objin.Multiply()
时,这就是您的想法:您正在访问Multiply()
,就好像它是内部类的成员,但事实并非如此。请记住,您可以从内部类的代码中看到它,但它不会被曝光,就好像它是您的。
答案 1 :(得分:2)
这是规范所说的
public class Outer{
private int x;
private void method(){
}
public void publicMethod(){}
public class Inner{
//has access to even private properties of x
method(); //can be called
//NOTE: Only has ACCESS and does not INHERIT those methods
}
}
您尝试的是使用publicMethod()
的实例访问Inner
,该实例没有任何该名称的方法。
CRUX:
非静态嵌套类 只对容器类的所有属性和方法具有访问权限 ,但 不会继承 那些方法。
objin.Multiply()
无法解决问题,因为Multiply()
在Outer
而不是Inner
上定义Multiply()
,因此{{1}上没有方法Inner
}}
答案 2 :(得分:1)
文档没有说您可以通过使用对内部类的引用来访问外部类的字段和方法。所以你做不到
objin.Multiply();
因为Multiply不是Inner的方法。你能做的是:
public class Inner {
int l;
public void Division()
{
System.out.println("I can access the field k in outer: " + k);
System.out.println("I can access the method Multiply in outer (even if Multiply was private): ");
Multiply();
// which is a shortcut for
Outer.this.Multiply();
}
}
PS:请尊重Java命名约定。方法以小写字母开头。
答案 3 :(得分:0)
您正尝试使用Inner类对象的实例来访问该方法。它只能通过外类方法在外部访问。您可以直接在Inner类的类定义中调用该方法,但不能使用内部类的实例。如果您仍想这样做,请尝试:
package Package_1;
public class Outer {
int k;
public void Multiply()
{
System.out.println("inside outer class' method multiply");
}
public class Inner {
int l;
public void Division()
{
System.out.println("inside inner class' method Divison");
}
public void Multiply() {
Outer.this.Multiply(); //Outer class method.
}
}
}