静态内部类和内部类的区别(4大区别详解)

静态内部类和内部类的区别(4大区别详解)-mikechen

静态内部类和非静态内部类是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();

 

内存消耗的区别

静态内部类的对象通常占用的内存较少,因为它们不会包含对外部类实例的引用。

非静态内部类的对象包含对外部类实例的引用,因此它们可能占用更多内存。

总之,静态内部类和非静态内部类在使用方式、生命周期、访问权限和内存消耗等方面有很大差异。

评论交流
    说说你的看法