Java静态内部类

2020-05-25  本文已影响0人  jiezzy
public class EmpTest {
    private Integer id;
    private Integer empLevel;
    private String mapingOrderLevel;
    private String empNo;
    private Integer orderNumLimit;


    //外部类私有的构造方法
    private EmpTest(Builder builder) {
        setId(builder.id);
        setEmpLevel(builder.empLevel);
        setMapingOrderLevel(builder.mapingOrderLevel);
        setEmpNo(builder.empNo);
        setOrderNumLimit(builder.orderNumLimit);
    }

    //对外提供初始化EmpTest类的唯一接口,通过这个方法,获得内部类的实例
    public static Builder newBuilder() {
        return new Builder();
    }

    //静态内部类:Builder
    public static final class Builder {
        private Integer id;
        private Integer empLevel;
        private String mapingOrderLevel;
        private String empNo;
        private Integer orderNumLimit;

        public Builder() {
        }

        public Builder id(Integer val) {
            id = val;
            return this;
        }

        public Builder empLevel(Integer val) {
            empLevel = val;
            return this;
        }

        public Builder mapingOrderLevel(String val) {
            mapingOrderLevel = val;
            return this;
        }

        public Builder empNo(String val) {
            empNo = val;
            return this;
        }

        public Builder orderNumLimit(Integer val) {
            orderNumLimit = val;
            return this;
        }
        //通过内部类的build方法,实例化外部类,并给其实例各个字段赋值
        public EmpTest build() {
            return new EmpTest(this);
        }

    }

    public Integer getId() {
        return id;
    }

    //...下边的get set 方法省略,和第一段一样

}



//初始化20个员工实例:
for(int i=0;i<20;i++){
            empList.add(EmpTest.newBuilder().empLevel(getRandom(5)).empNo("Emp_"+i).id(i).mapingOrderLevel(getRandomChar()).orderNumLimit(getRandom(20)).build());
        }

https://blog.csdn.net/cd18333612683/article/details/79129503

内部类和静态内部类的区别

内部类:

1、内部类中的变量和方法不能声明为静态的。
2、内部类实例化:B是A的内部类,实例化B:A.B b = new A().new B()。
3、内部类可以引用外部类的静态或者非静态属性及方法。

静态内部类:

1、静态内部类属性和方法可以声明为静态的或者非静态的。
2、实例化静态内部类:B是A的静态内部类,A.B b = new A.B()。
3、静态内部类只能引用外部类的静态的属性及方法。

inner classes——内部类
static nested classes——静态嵌套类

其实人家不叫静态内部类,只是叫习惯了,从字面就很容易理解了。

内部类依靠外部类的存在为前提,而静态嵌套类则可以完全独立,明白了这点就很好理解了。

非静态内部类中的变量和方法不能声明为静态的原因

静态类型的属性和方法,在类加载的时候就会存在于内存中。使用某个类的静态属性和方法,那么这个类必须要加载到虚拟机中。但是非静态内部类并不随外部类一起加载,只有在实例化外部类之后才会加载。

我们设想一个场景:在外部类并没有实例化,内部类还没有加载的时候如果调用内部类的静态成员或方法,内部类还没有加载,却试图在内存中创建该内部类的静态成员,就会产生冲突。所以非静态内部类不能有静态成员变量或静态方法。

https://www.jianshu.com/p/ec54424c5c34

https://www.jianshu.com/p/e8a89eb48aa4

上一篇 下一篇

猜你喜欢

热点阅读