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}
。这意味着上面的代码应该可以正常工作。发生了什么?
“限定此”表达式Main。上级。这一个
出现在
MegaInner
内部。
MegaInner
的封闭类是Inner
和Main
。因此,此
是第0个限定的此
,内部。此
是第一个限定此和Main。此
是本标准的第二个限定项。
您缺少的部分是,它必须是类的一个封闭类,在该类中出现带有
this
的表达式SuperInner
不是MegaInner
的封闭类,因此限定此
不适用于它。
在现实中想想吧。此表达式引用类的实例。它不引用类本身。例如,不能从静态方法引用
this
。
现在,当您创建
MegaInner
的实例时,它必须是Inner
的实际实例和Main
的实际实例的一部分。但不能保证存在SuperInner
的实际实例。封闭类的代码可以在任何时候创建SuperInner
类型的对象,并且独立于internal
的实例。
因此,您不能在编译时访问它的
部分。但是,如果通过引用变量为您提供了一个实例,那么您可以访问变量
a
,因为它们都是同一外部类的成员。
一个可以有多个SuperInner
,以及Inner
或MegaInner
的实例。调用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_
我正在做下面这样的事情,但它不起作用。为什么?又是如何做到的呢?