
静态内部类和非静态内部类是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();
内存消耗的区别
静态内部类的对象通常占用的内存较少,因为它们不会包含对外部类实例的引用。
非静态内部类的对象包含对外部类实例的引用,因此它们可能占用更多内存。
总之,静态内部类和非静态内部类在使用方式、生命周期、访问权限和内存消耗等方面有很大差异。
关于mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。