Java 内部类的访问

310 阅读1分钟

Java内部类只应该服务于它的外部类,否则就不应该写成内部类

非静态内部类

可以在一定程度上看作是“实例成员变量”,它拥有对外部类隐式的引用,在内部类中,可以有如下权限:

  • 访问内部类的实例方法
  • 通过this关键字得到外部类对象的引用

非静态Builder实现

public class NonstaticBuilderDemo {

    private  String s1;
    private  String s2;
    private  String s3;
    private  String s4;

    public class NonStaticBuilder{
        private String ins1;
        private String ins2;
        private String ins3;
        private String ins4;


        public NonStaticBuilder s1(String s1){
            this.ins1 = s1;
            return this;
        }

        public NonStaticBuilder s2(String s2){
            this.ins2 = s2;
            return this;
        }

        public NonStaticBuilder s3(String s3){
            this.ins3 = s3;
            return this;
        }

        public NonStaticBuilder s4(String s4){
            this.ins4 = s4;
            //invoke instance method outside
            getS1();
            //obtain a reference to the enclosing instance using the qualified this construct
            NonstaticBuilderDemo this = NonstaticBuilderDemo.this;
            return this;
        }

        public NonstaticBuilderDemo build(){
            NonstaticBuilderDemo nonstaticBuilderDemo = new NonstaticBuilderDemo();
            nonstaticBuilderDemo.s1 = ins1;
            nonstaticBuilderDemo.s2 = ins2;
            nonstaticBuilderDemo.s3 = ins3;
            nonstaticBuilderDemo.s4 = ins4;
            return nonstaticBuilderDemo;
        }
    }

    public String getS1() {
        return s1;
    }
}

静态内部类

可以在一定程度上看作是“静态成员变量”,在该内部类中,可以有如下权限:

  • 访问外部类的静态成员变量

静态builder实现

public class StaticBuilderDemo {

    private final String s11;
    private final String s2;
    private final String s3;
    private final String s4;

     public static class Builder{
        private String ins1;
        private String ins2;
        private String ins3;
        private String ins4;

         public Builder( ) {

         }

         public Builder s1(String s1){
            this.ins1 = s1;
            return this;
        }

        public Builder s2(String s2){
            this.ins2 = s2;
            return this;
        }

        public Builder s3(String s3){
            this.ins2 = s3;
            return this;
        }

        public Builder s4(String s4){
            this.ins2 = s4;
            return this;
        }

        public StaticBuilderDemo build(){
            //关键字this,this的妙用
            //赋值要想着在内部完成,outer.s1 = this.s1(不能这样干,静态内部类不能获取外部的非静态变量)
            return new StaticBuilderDemo(this);
        }

    }

    private StaticBuilderDemo(Builder builder){
         this.s11 = builder.ins2;
         this.s2 = builder.ins2;
         this.s3 = builder.ins3;
         this.s4 = builder.ins4;
    }

}