Java: 静态 vs 内部类

静态嵌套类和非静态嵌套类的区别是什么?

288853 次浏览

内部类通过定义不能是静态的,所以我将把你的问题重新定义为“静态嵌套类和非静态嵌套类之间的区别是什么?”

非静态嵌套类对其嵌套所在类的成员具有完全访问权。静态嵌套类没有对嵌套实例的引用,因此静态嵌套类不能调用非静态方法,也不能访问嵌套类所在类实例的非静态字段。

让我们在智慧之源中寻找这样的问题:

从技术上讲,没有静态内部类这样的东西。根据有效的Java,正确的术语是静态嵌套类。非静态嵌套类实际上是一个内部类,与匿名类和局部类一样。

现在引用一下:

非静态嵌套的类的每个实例都是隐式关联的 包含类的封闭的实例…这是可能的

.调用封闭实例上的方法

静态嵌套类不能访问外围实例。它也占用更少的空间。

讨论嵌套的类…

不同之处在于,同样是静态的嵌套类声明可以在外围类之外实例化。

当你有一个嵌套的类声明不是静态的时,Java不允许你实例化它,除非通过外围类。从内部类创建的对象被链接到从外部类创建的对象,因此内部类可以引用外部类的字段。

但如果它是静态,则链接不存在,外部字段不能被访问(除非通过像任何其他对象一样的普通引用),因此您可以通过自身实例化嵌套类。

静态内部类:可以声明静态&非静态成员,但只能访问其父类的静态成员。

非静态内部类:只能声明非静态成员,但可以访问父类的静态和非静态成员。

静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了打包方便而嵌套在另一个顶级类中。

静态内部类和非静态内部类之间有两个区别。

  1. 如果声明成员字段和方法,是非静态的 内部类不能有静态字段和方法。 但是,在静态内部类的情况下,可以有静态和非静态字段 李和方法。< / p > < / >

  2. 使用引用创建非静态内部类的实例 对象的外部类,这意味着它已经定义 封闭的实例。但是静态内部类的实例是 创建时没有引用Outer类,这意味着它有引用

  3. .

    .

请看这个例子

class A
{
class B
{
// static int x; not allowed here
}


static class C
{
static int x; // allowed here
}
}


class Test
{
public static void main(String… str)
{
A a = new A();


// Non-Static Inner Class
// Requires enclosing instance
A.B obj1 = a.new B();


// Static Inner Class
// No need for reference of object to the outer class
A.C obj2 = new A.C();
}
}

内部类不能是静态的,所以我将把你的问题重新定义为“静态嵌套类和非静态嵌套类之间的区别是什么?”

正如你在这里所说的,内部阶级不可能是静态的…我发现下面的代码是静态....原因?或者哪个是正确的....

是的,静态嵌套类型的语义中没有任何东西会阻止您这样做。这段代码运行正常。

    public class MultipleInner {
static class Inner {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Inner();
}
}
}

这是这个网站上的一个代码…

对于问题——>静态嵌套类可以实例化多次吗?

答案是——>

现在,当然嵌套类型可以做自己的实例控制(例如,私有构造函数,单例模式等),但这与它是嵌套类型的事实无关。此外,如果嵌套类型是静态enum,当然您根本不能实例化它。

但是一般来说,静态嵌套类型可以被实例化多次。

注意,从技术上讲,静态嵌套类型不是“内部”类型。

  1. 静态内部类不能访问外围类的非静态成员。它可以直接访问外围类的静态成员(实例字段和方法),类似于不创建对象而获取值的过程式方式。

  2. 静态内部类可以声明静态成员和非静态成员。静态方法可以访问主类的静态成员。但是,它不能访问非静态内部类成员。要访问非静态内部类的成员,必须创建非静态内部类的对象。

  3. 非静态内部类不能声明静态字段和静态方法。它必须在静态类型或顶级类型中声明。你会得到这样的错误,说“静态字段只能在静态或顶级类型中声明”。

  4. 非静态内部类可以以获取值的过程式方式访问外围类的静态和非静态成员,但它不能访问静态内部类的成员。

  5. 外围类在创建内部类的对象之前不能访问内部类的成员。如果主类访问非静态类的成员,它可以创建非静态内部类的对象。

  6. 如果主类访问静态内部类的成员,它有两种情况:

    • 案例1:对于静态成员,可以使用静态内部类的类名
    • 情况2:对于非静态成员,可以创建静态内部类的实例。
    • 李< / ul > < / >