静态内部类和非静态内部类是Java中两种不同类型的内部类,下面是4大静态内部类和内部类的区别@mikechen
静态性质的区别
静态内部类是静态的,而非静态内部类不是静态的。
静态内部类被声明为静态,因此不依赖于外部类的实例,它可以独立于外部类而存在,就像普通的顶级类一样。
如下所示:
public class OuterClass { private static int outerField = 10; // 静态内部类 public static class StaticInnerClass { private int innerField = 20; public void printOuterField() { // 在静态内部类中无法访问外部类的非静态成员outerField System.out.println("Inner Field: " + innerField); } } public static void main(String[] args) { // 创建静态内部类的对象 StaticInnerClass innerObj = new StaticInnerClass(); innerObj.printOuterField(); // 输出 "Inner Field: 20" } }
在这个示例中,StaticInnerClass
是一个静态内部类,它可以像普通类一样通过类名 OuterClass.StaticInnerClass
来访问。
非静态内部类是与外部类的实例相关联的,它依赖于外部类的实例存在。
public class OuterClass { private int outerField = 10; // 非静态内部类 public class NonStaticInnerClass { private int innerField = 20; public void printOuterField() { // 在非静态内部类中可以访问外部类的非静态成员outerField System.out.println("Outer Field: " + outerField); } } public static void main(String[] args) { // 创建外部类的实例 OuterClass outerObj = new OuterClass(); // 创建非静态内部类的对象 NonStaticInnerClass innerObj = outerObj.new NonStaticInnerClass(); innerObj.printOuterField(); // 输出 "Outer Field: 10" } }
在这个示例中,NonStaticInnerClass
是一个非静态内部类,它需要通过外部类的实例来创建。
访问权限的区别
静态内部类可以有不同的访问修饰符,包括public、private、protected和默认包访问,与普通类相似。
非静态内部类的默认访问权限是包级别(package-private),但可以显式设置为其他访问权限。
创建方式的区别
静态内部类的对象可以通过使用外部类的类名来创建,无需外部类的实例。
例如:
OuterClass.StaticInnerClass obj = new OuterClass.StaticInnerClass();
非静态内部类的对象通常需要在外部类的实例上创建。
例如:
OuterClass outerObj = new OuterClass(); OuterClass.NonStaticInnerClass obj = outerObj.new NonStaticInnerClass();
内存消耗的区别
静态内部类的对象通常占用的内存较少,因为它们不会包含对外部类实例的引用。
非静态内部类的对象包含对外部类实例的引用,因此它们可能占用更多内存。
总之,静态内部类和非静态内部类在使用方式、生命周期、访问权限和内存消耗等方面有很大差异。