Java 内部类和嵌套类
Oracle文档(在下面的链接中)指出: 非静态嵌套类(内部类)可以访问其他成员 即使它们声明为private,也可以是封闭类的 但在下面的示例中,我创建了一个对象Java 内部类和嵌套类,java,Java,Oracle文档(在下面的链接中)指出: 非静态嵌套类(内部类)可以访问其他成员 即使它们声明为private,也可以是封闭类的 但在下面的示例中,我创建了一个对象objin(内部类),它无法访问其封闭外部类的任何方法或变量。下面是代码,你能解释一下吗 使用Main方法初始化 package Package_1; public class D { public static void main(String[] args) { Outer objout = new
objin
(内部类),它无法访问其封闭外部类的任何方法或变量。下面是代码,你能解释一下吗
使用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
方法
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
}
}
您尝试的是使用internal
实例访问publicMethod()
,该实例没有任何该名称的方法
症结所在:
非静态嵌套类只能访问容器类的所有属性和方法,但不能继承这些方法
objin.Multiply()
无法工作,因为关键在于Multiply()
是在外部定义的,而不是内部定义的,因此没有方法Multiply()
关于内部
文档并没有说您可以通过引用内部类来访问外部类的字段和方法。所以你不能这么做
objin.Multiply();
因为乘不是一种内在的方法。您可以做的是:
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命名约定。方法以小写字母开头。我看到了你的“隐私”!
从非静态嵌套类(内部类)的代码中,您可以访问封闭类的公共和私有成员
但这是你的“私事”,不是我的!
这就是您在尝试执行objin.Multiply()
时的想法:您正在访问Multiply()
,好像它是内部类的成员,但它不是。请记住,您可以从内部类的代码中看到它,但它不会像是您的一样被公开
您正试图使用内部类对象的实例访问该方法。只能通过外部类方法在外部访问它。您可以直接在内部类的类定义内调用该方法,但不能使用内部类的实例。如果仍要执行此操作,请尝试:
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.
}
}
}
@维涅什维诺:是的,他有一个。那会导致堆栈溢出错误。为什么会导致堆栈溢出?我知道了。我需要使用Outer.this.Multiply();很抱歉,我有点困惑,根据Java中面向对象的概念,我们可以使用对象引用或类名(对于静态方法)调用方法。但是,在这种情况下,我们如何在另一个方法中单独调用一个方法——“Multiple():”。这不会与java fundamentals.Outer冲突。它保存当前的外部对象引用。所以这不是对Multiply()的静态调用,我喜欢你非常“直观”的风格。你用什么工具来做这些?
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.
}
}
}