gpt4 book ai didi

带有静态内部类的 Java 新关键字

转载 作者:行者123 更新时间:2023-12-01 14:13:59 25 4
gpt4 key购买 nike

我知道以前有人问过这个问题,但大多是关于某个库的。给出的答案并没有真正向我解释发生了什么。

这就是为什么我在这里设置了一个非常简单的测试场景,并试图摆弄它,但仍然有一些问号!
Online Java Example

简单代码由两个文件组成:
Main.java

public class Main
{
public static void main(String[] args) {
// this works, and inner1 and inner2 seem to be new instances
Outer.Inner inner1 = new Outer.Inner();
Outer.Inner inner2 = new Outer.Inner();
inner1.setName("Mario");
inner1.say();
inner2.setName("Luigi");
inner2.say();

// if Inner is not a public static class this gives this error:
// error: an enclosing instance that contains Outer.InnerNoStatic is required
Outer.InnerNoStatic inner3 = new Outer.InnerNoStatic();
}
}
Outer.java
public class Outer {
public static class Inner {
private String name;

public void say() {
System.out.println("Hi " + name);
}

public void setName(String name) {
this.name = name;
}
}

public class InnerNoStatic {
public void say() {
System.out.println("Hi from InnerNoStatic");
}
}
}

所以看起来即使 Inner类是用静态声明的,我们创建了两个新实例,分别称为 inner1 和 inner2。那为什么叫静态呢?

反过来,如果我删除静态,如 InnerNoStatic我将如何获取该类的实例?

最佳答案

static这里指示如何 InnerInnerNoStatic用于 Outer .

因为InnerOuter 中是静态的,它与 Outer 的任何特定实例无关。 (与往常一样,静态成员属于该类,而不属于该类的任何特定实例)。这解释了它是如何编译的:

Outer.Inner inner1 = new Outer.Inner();
InnerNoStatic但是,它是一个实例成员(就是这样:如果它不是静态的,则它与给定的成员相关联)。这就解释了为什么编译器会在这里引发错误:
Outer.InnerNoStatic inner3 = new Outer.InnerNoStatic();

因为 InnerNoStatic必须绑定(bind)到 Outer 的实例,需要使用这样的实例来创建 inner3 :
Outer.InnerNoStatic inner3 = new Outer().new InnerNoStatic(); //note the calls

您也可以使用现有实例。
Outer outer = new Outer();
Outer.InnerNoStatic inner3 = outer.new InnerNoStatic();

在这两种情况下, Outer实例用于构建 InnerNoStatic实例(没有变量指向 Outer 创建的 new Outer().new InnerNoStatic() 对象)

注意:容易混淆 new Outer.Inner();new Outer().new Inner(); .这些不是做同样的事情(前者中的“Outer”基本上扮演命名空间的角色,而后者中的 new Outer() 是创建一个 Outer 对象)。也就是说,前者中有一个构造函数调用( Inner() ),而后者中有两个构造函数调用( Outer()Inner() )。

关于带有静态内部类的 Java 新关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61058423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com