• Java 中内部类、静态内部类、枚举类的知识


    1、内部类

           内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:内部、局部内部、静内部、匿名内部


    例如:

    public class Test2 {
        public static void main(String[] args) {
            //实例化的方法一
            Cls box=new Cls();
            box.data=300;
            Cls.Incls inbox=box.new Incls();
            inbox.show();
    
            //实例化的方法二
            Cls.Incls box2=new Cls().new Incls();
            box2.show();
        }
    
    }
    
    //外部类
    class Cls
    {
        //外部类的成员变量
        public int data=200;
    
        //成员内部类
        class Incls{
            //内部类的成员
            public void show(){
                System.out.println("内部类数据:"+data);
            }
        }
    }

    结果:

    2、静态内部类

    如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:

      1. 要创建嵌套类的对象,并不需要其外围类的对象。

      2. 不能从嵌套类的对象中访问非静态的外围类对象。

    例如:

    public class Outer {
        private static int i = 1;
        private int j = 10;
    
        public static void outer_f1() {}
    
        public void outer_f2() {}
    
        // 静态内部类可以用public,protected,private修饰
        // 静态内部类中可以定义静态或者非静态的成员
        private static class Inner {
            static int inner_i = 100;
            int inner_j = 200;
    
            static void inner_f1() {
                // 静态内部类只能访问外部类的静态成员(包括静态变量和静态方法)
                System.out.println("Outer.i" + i);
                outer_f1();
            }
    
            void inner_f2() {
                // 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)
                // System.out.println("Outer.i"+j);
                // outer_f2();
            }
        }
    
        public void outer_f3() {
            // 外部类访问内部类的静态成员:内部类.静态成员
            System.out.println(Inner.inner_i);
            Inner.inner_f1();
            // 外部类访问内部类的非静态成员:实例化内部类即可
            Inner inner = new Inner();
            inner.inner_f2();
        }
    
        public static void main(String[] args) {
            new Outer().outer_f3();
        }
    }

    3、枚举类

    这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒。

    例如:

    public enum Singleton {  
        INSTANCE;  
        public void whateverMethod() {  
        }  
    }  

    此文章转载于:https://www.cnblogs.com/best/p/6736771.htmlhttp://cantellow.iteye.com/blog/838473

  • 相关阅读:
    Spring.profile配合Jenkins发布War包,实现开发、测试和生产环境的按需切换
    Ubuntu 配置 Tomcat
    Proper usage of Java -D command-line parameters
    Linux下设置MySql自动启动
    cent6.x配置主机名及静态网络
    vmware can not be closed virtual machine is busy
    VMware虚拟机下扩容磁盘(centos7)
    Spring、MyBatis、Shiro、Quartz、Activiti框架
    Jenkins ChangeLog
    JEECG DataGridColumn dictionary使用问题
  • 原文地址:https://www.cnblogs.com/ljj5/p/9476961.html
Copyright © 2020-2023  润新知