Static Nested Class 和 Inner Class的不同
发布时间:2024年01月05日
在Java中,内部类(Inner Class)和静态内部类(Static Nested Class)有一些关键的区别。以下是它们的主要区别:
-
实例化:
- 内部类:每次创建外部类的实例时,都会隐式地创建一个内部类的实例。
- 静态内部类:每次创建外部类的实例时,并不隐式地创建一个静态内部类的实例。相反,您需要使用
OuterClass.StaticNestedClass
的方式来显式地创建静态内部类的实例。
-
访问外部类的成员:
- 内部类:可以访问外部类的所有成员(包括私有成员)。
- 静态内部类:只能访问外部类的静态成员。
-
关联性:
- 内部类:与一个外部类的实例关联。
- 静态内部类:与外部类的类型关联,而不是与外部类的实例关联。
-
关键字:
- 内部类:可以使用
new
关键字来创建其实例,如new OuterClass.InnerClass()
。 - 静态内部类:使用
new
关键字来创建其实例时,需要使用外部类的类型,如new OuterClass.StaticNestedClass()
。
-
没有外部类的上下文:
- 对于静态内部类,即使删除
static
关键字,它仍然是一个静态内部类,因为它的定义不依赖于外部类的实例。这意味着即使没有创建外部类的实例,也可以创建静态内部类的实例。
-
生命周期:
- 内部类:它的生命周期与外部类的实例相同。当外部类的所有实例都消失时,内部类也会被垃圾回收。
- 静态内部类:它的生命周期与外部类相同。当外部类被加载到JVM时,静态内部类就已经存在了。
-
使用场景:
- 内部类:通常用于封装与外部类紧密相关的逻辑。它可以直接访问外部类的所有成员。
- 静态内部类:通常用于与外部类的类型相关的独立逻辑。它不能直接访问外部类的非静态成员。
-
匿名内部类:
- 匿名内部类是一种没有名称的特殊类型的内部类,用于实现接口或扩展现有类并立即实例化。它是唯一的在声明的同时进行实例化的Java代码块。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 首先,我们定义一个外部类
OuterClass
,其中包含一个静态内部类StaticNestedClass
和一个普通内部类InnerClass
:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? public class OuterClass { ?
? ? private String outerVariable = "Outer"; ?
??
? ? public static class StaticNestedClass { ?
? ? ? ? private String nestedVariable = "Nested"; ?
??
? ? ? ? public String getNestedVariable() { ?
? ? ? ? ? ? return nestedVariable; ?
? ? ? ? } ?
? ? } ?
??
? ? public class InnerClass { ?
? ? ? ? private String innerVariable = "Inner"; ?
??
? ? ? ? public String getInnerVariable() { ?
? ? ? ? ? ? return innerVariable; ?
? ? ? ? } ?
? ? } ?
}?现在,我们将使用OuterClass
、StaticNestedClass
和InnerClass
的实例:? ? ? ? ? ? ? ? ??public class Main { ?
? ? public static void main(String[] args) { ?
? ? ? ? OuterClass outer = new OuterClass(); ?
? ? ? ? OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass(); ?
? ? ? ? OuterClass.InnerClass inner = outer.new InnerClass(); // 创建内部类的实例时需要外部类的实例 ?
??
? ? ? ? System.out.println("Outer variable: " + outer.outerVariable); // 输出 "Outer variable: Outer" ?
? ? ? ? System.out.println("Nested variable: " + nested.getNestedVariable()); // 输出 "Nested variable: Nested" ?
? ? ? ? System.out.println("Inner variable: " + inner.getInnerVariable()); // 输出 "Inner variable: Inner" ?
? ? } ?
}? ?在这个例子中,我们创建了OuterClass
、StaticNestedClass
和InnerClass
的实例,并分别访问它们的成员变量和成员方法。请注意,创建内部类的实例时需要外部类的实例。
文章来源:https://blog.csdn.net/zz_ll9023/article/details/135307942
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!