当前位置: 首页 > 知识库问答 >
问题:

为什么我们不能从内部的类构造函数访问另一个内部类?

罗安和
2023-03-14
class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
    }

    public class SuperInner{
        int a;
    }

    public class Inner{
        public class MegaInner{
            public MegaInner(){
                Main.SuperInner.this.a = 6; //error: not an enclosing class: Main.SuperInner
            }
        }
    }
}

伊登

JLS所说的是:

设C是ClassName表示的类。设n是一个整数,使得C是类的第n个词汇封闭类,在该类中出现有条件的this表达式。

[...]

如果当前类不是类C或C本身的内部类,则为编译时错误。

C:=Main的情况下,内部类集S:={SuperInner,MegaInner,inner}。这意味着上面的代码应该可以正常工作。发生了什么?

共有2个答案

后凯捷
2023-03-14

“限定此”表达式Main。上级。这一个出现在MegaInner内部。

MegaInner的封闭类是InnerMain。因此,是第0个限定的内部。此是第一个限定此和Main。此是本标准的第二个限定项。

您缺少的部分是,它必须是类的一个封闭类,在该类中出现带有this的表达式SuperInner不是MegaInner的封闭类,因此限定此不适用于它。

在现实中想想吧。此表达式引用类的实例。它不引用类本身。例如,不能从静态方法引用this

现在,当您创建MegaInner的实例时,它必须是Inner的实际实例和Main的实际实例的一部分。但不能保证存在SuperInner的实际实例。封闭类的代码可以在任何时候创建SuperInner类型的对象,并且独立于internal的实例。

因此,您不能在编译时访问它的部分。但是,如果通过引用变量为您提供了一个实例,那么您可以访问变量a,因为它们都是同一外部类的成员。

侯英达
2023-03-14

一个可以有多个SuperInner,以及InnerMegaInner的实例。调用Main。晚餐。这从MegaInner中的中,不清楚哪个实例(如果有实例)应该将a变量设置为6。

内部类的行为很像普通类:总是需要一个实例来设置其中的变量<代码>主。上级。此不表示来自MegaInner视图的实例,因为仅指MegaInner的类层次结构,而SuperInner不是其一部分。

 类似资料:
  • 我在Java中使用嵌套类时遇到问题,有人知道为什么Java不允许我这样做吗?

  • (我一直在重读那个问题标题,思考它看起来有多荒谬,但我向你保证,这是对问题的最佳描述,我有一个实际的应用程序,其中这是最好的结构。我发誓我没有疯。) 考虑以下内容。每个块都是一个单独的文件: 注意,enclosinstance业务是为了解决涉及中间构造函数调用的问题。请参阅“为什么外部类不能扩展内部类?”。 我希望输出为“2”。但是相反,我在System.out.println(a.this.I)

  • 问题内容: 因此,我们大多数人都知道 如何 从内部类访问外部类。用这些词进行搜索会给出关于该主题的大量回答问题。但是我想知道的是为什么语法是这样。 例: 为什么呢?看起来是A类的静态字段,但是… 感到困惑 如果这是重复的话,请原谅我。就像我说的那样,用这些词进行搜索会给出操作答案。 问题答案: 为什么这样做呢?真的,只是因为它的方式。它行之有效,从某种意义上讲,并且不需要花哨的语法来完成这项工作。

  • 我在班里学习。出于好奇,我扩展了具有参数化构造函数的内部类。但是当我编写super(inti)来调用它时,代码不会编译。 因为内部类是外部类的一部分(成员),必须通过外部类访问它们。如何调用测试类的超级构造函数。 编译错误是:由于某些中间构造函数调用,没有外部类型的封闭实例可用

  • 我有两个类:Date和Person Person有Date类的两个属性 案例1 类是与Person类分开的类。我有这段代码正常工作: 案例2:内部类(赋值要求) 我把作为Person的私有内部类 现在,上面的构造函数代码不再工作了。以下是错误消息: 说明资源路径位置类型由于某些中间构造函数调用人员,类型Person的封闭实例不可用。java/Wk03_Ch10_文件IO_Ch13_接口/Wk03_

  • 我正在做下面这样的事情,但它不起作用。为什么?又是如何做到的呢?