美文网首页
静态内部类与非静态内部类

静态内部类与非静态内部类

作者: 26小瑜儿 | 来源:发表于2019-08-19 22:52 被阅读0次

    静态内部类与非静态内部类的区别

    1、非静态内部类不能声明静态成员变量和静态成员方法,而静态内部类可以声明静态和非静态的成员变量以及成员方法
    2、非静态内部类可以访问外部类的所有成员变量以及成员方法,而静态内部类只能访问外部类的静态成员变量和静态成员方法
    3、非静态内部类的实例化需要依赖外部类,因此必须先实例化外部类,再通过“外部类对象.new”语法实例化内部类,而静态内部类的实例化不依赖于外部类,可以直接创建静态内部类的对象。

    Demo解释如下:
    public class OuterClass {
        private String outerName = "outerName";
        private static String outerStaticName = "outerStaticName";
    
        private void outerDisplay() {
            System.out.println(outerName + ":" + outerStaticName);
        }
        private static void outerStaticDisplay() {
            //outerName处报错,静态方法不能访问非静态成员变量
            //System.out.println(outerName + ":" + outerStaticName);
            System.out.println(outerStaticName);
        }
    
    非静态内部类
        class InnerClass {
            String innerName = "innerName";
    
            //报错!非静态内部类不能声明静态成员
            //static String innerStaticName = "innerStaticName";
    
            public void innerDisplay() {
                //内部类可以无缝访问外部类的静态和非静态成员变量,即使是私有的
                System.out.println(outerName +":"+ outerStaticName);
    
                //内部类可以无缝访问外部类的非静态成员方法,即使是私有的
                outerDisplay();
    
                //内部类可以无缝访问外部类的静态成员方法,即使是私有的
                outerStaticDisplay();
            }
    
            //非静态内部类中不能定义静态成员方法
            /*public static void innerStaticDispaly() {
    
            }*/
        }
    
    静态内部类
        static class StaticInnerClass {
            String staticInnerName = "staticInnerName";
    
            //静态内部类中可以声明静态成员变量
            static String staticInnerStaticName = "staticInnerStaticName";
    
            public void staticInnerDispaly() {
                //outerName处报错,静态内部类不能访问外部类的非静态成员变量
                //System.out.println(outerName +":"+ outerStaticName);
    
                //静态内部类可以访问外部类的静态成员变量
                System.out.println(outerStaticName);
    
                //静态内部类不能访问外部类的非静态成员方法
                //outerDisplay();
    
                //静态内部类可以访问外部类的静态成员方法
                outerStaticDisplay();
            }
    
            public static void staticInnerStaticDispaly() {
                //静态内部类的静态方法不可以访问静态内部类的非静态成员变量
                //System.out.println(staticInnerName);
    
                //静态内部类的静态方法可以访问静态内部类的静态成员变量
                System.out.println(staticInnerStaticName);
    
                //静态内部类的静态方法不可以访问外部类的非静态成员变量
                //System.out.println(outerName);
    
                //静态内部类的静态方法可以访问外部类的静态成员变量
                System.out.println(outerStaticName);
    
                //静态内部类的静态方法不能访问外部类的非静态成员方法
                //outerDisplay();
    
                //静态内部类的静态方法可以访问外部类的静态成员方法
                outerStaticDisplay();
            }
        }
    
    主函数
        public static void main(String[] args) {
            OuterClass outer = new OuterClass();
    
        > 非静态内部类实例的创建依赖于外部类实例,
        > 因此必须先创建外部类对象,再通过outer.new语法创建内部类实例
    
            OuterClass.InnerClass inner = outer.new InnerClass();
    
            inner.innerDisplay();
    
      >静态内部类对象的创建不依赖于外部类对象
      >因此创建静态内部类的对象不需要先创建外部类对象
    
            OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();
            staticInner.staticInnerDispaly();
            StaticInnerClass.staticInnerStaticDispaly();
        }
    }
    

    相关文章

      网友评论

          本文标题:静态内部类与非静态内部类

          本文链接:https://www.haomeiwen.com/subject/tyeysctx.html