Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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 内部类和嵌套类_Java - Fatal编程技术网

Java 内部类和嵌套类

Java 内部类和嵌套类,java,Java,Oracle文档(在下面的链接中)指出: 非静态嵌套类(内部类)可以访问其他成员 即使它们声明为private,也可以是封闭类的 但在下面的示例中,我创建了一个对象objin(内部类),它无法访问其封闭外部类的任何方法或变量。下面是代码,你能解释一下吗 使用Main方法初始化 package Package_1; public class D { public static void main(String[] args) { Outer objout = new

Oracle文档(在下面的链接中)指出:

非静态嵌套类(内部类)可以访问其他成员 即使它们声明为private,也可以是封闭类的

但在下面的示例中,我创建了一个对象
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.
    }

}
}