Java深入学习19:内部类分析

如下

 

public class OutClass {

    public String outParam = "outParam";

    public String print(){
        System.out.println("this OutClass print method");
        return "OutClass.print";
    }
    public String print(String param){
        System.out.println("this OutClass print(String param)" + param);
        return param;
    }
    public void print2(){
        System.out.println("this OutClass print method for MemberInnerClass");
    }

    //1-成员内部类
    //成员内部类:作为类的成员而存在的,其定义位于类的内部,可以类比为成员变量来理解
    //类定义的约束,成员内部类的类定义没有任何约束,不仅可以将内部类声明为public、private的,甚至可以将其声明为一个abstract抽象类和interface接口,以及继承外部类也是允许的
    //内部属性和方法定义约束:
        //(1)不能使用static来修饰任何成员内部类中的属性和方法,但可以使用private、final等其余任意修饰符
        //(2)可以用static final来修饰成员
        //(3)可以允许与外部类字段和方法重名
    //访问上的约束
        //(1)成员内部类也存在this指针,但是这个指针指向的是自己的引用,如果想访问外部类,需要使用 外部类名.this这个指针
        //(2)可以通过 外部类名.静态字段来访问外部类的静态属性或方法字段
    class MemberInnerClass{
        //static String sParam = "";//inner class can not have static declaration
        static final String sfParam = "";//static final variable is allowed
        public void print(){
            OutClass.this.print(outParam);
        }
    }

    //2-局部内部类
    //局部内部类位于外部类成员方法的内部,可以类比局部变量.局部内部类和成员内部类十分类似
    //相关约束
        //(1)其类上不允许有任何修饰符,但是可以使用abstract将类声明为抽象类
        //(2)不允许将局部内部类声明为接口
        //(3)不允许使用static来声明成员变量和方法
        //(4)可以将局部内部类声明在静态方法中
        //(5)任意两个方法中的局部内部类可以重名
    //使用:既然是局部内部类,就只能在声明类的方法处来使用.同样地,我们依然可以无条件访问内部类中定义的私有属性
    public void method1(){
        class LocalInnerClass{
            //static String sParam = "";//inner class can not have static declaration
            static final String sfParam = "";//static final variable is allowed
            private String localInnerClassVariable = "localInnerClassVariable";
            private void print(){
                System.out.println("method1 |LocalInnerClass");
            }
        }
        LocalInnerClass localInnerClass = new LocalInnerClass();
        localInnerClass.print();
        System.out.println("LocalInnerClass localInnerClassVariable");
    }

    //3-匿名内部类
    //匿名内部类没有类的声明,会隐式地继承一个类或实现一个接口(这个很重要)
    //这里的Demo可以换成任意一个类或者接口,你会发现这个类没有名字,所以被叫做匿名内部类如果Demo是一个普通类,则匿名内部类相当于这个类的子类;如果Demo是一个接口或者抽象类,则这个匿名内部类相当于接口或抽象类的实现
    //约束:想要理解匿名内部类的约束,就需要将整个匿名内部类不要当成一块程序逻辑来看,而应该当成一个对象来处理,整块匿名内部类完全可以当成一个对象,可以调用对象的方法、属性等等
        //不能使用static来修饰方法和属性,但是可以有static final的属性
        //可以使用this指针来访问本身定义的变量和继承得到的变量,也可以使用 外部类名.this
        //指针来访问外部类中的所有属性
        //无法在类上进行任何修饰,因为没有class定义符和类名
        //其中定义的私有字段对外是完全可见的
    public void method2(){

        String printResult = new OutClass() {
            @Override
            public String print() {
                System.out.println("this method2 OutClass print method");
                return "method2 OutClass print";
            }
        }.print();
        System.out.println("method2 printResult: " + printResult);

        new InterfaceA(){
            @Override
            public void print() {
                System.out.println("InterfaceA " + OutClass.this.print());
            }
        }.print();
    }
    //4-静态内部类
    //静态内部类相当于static修饰的成员内部类,可以当作静态变量来理解
    //约束这里的约束就和之前的有很大不同了,如下:
        //(1)可以使用任意的修饰符来修饰类、方法和属性
        //(2)可以访问外部类的静态方法和属性
        //(3)没错,广义上,静态内部类根本没有约束
    static  class StaticInnerClass{
        public static String a = "a";
        static{
            System.out.println("StaticInnerClass static block");
        }
        public static void print(){
            System.out.println("StaticInnerClass print");
        }
    }

    public MemberInnerClass getInstance(){
        return new MemberInnerClass();
    }

    public static void main(String[] args) {
        OutClass oc = new OutClass();
        System.out.println("-------------------1-----------------");
        oc.getInstance().print();
        System.out.println("-------------------2-----------------");
        oc.method1();
        System.out.println("-------------------3-----------------");
        oc.method2();
        System.out.println("-------------------4-----------------");
        StaticInnerClass.print();

    }


}

interface InterfaceA{
    void print();
}

 

日志如下

-------------------1-----------------
this OutClass print(String param)outParam
-------------------2-----------------
method1 |LocalInnerClass
LocalInnerClass localInnerClassVariable
-------------------3-----------------
this method2 OutClass print method
method2 printResult: method2 OutClass print
this OutClass print method
InterfaceA OutClass.print
-------------------4-----------------
StaticInnerClass static block
StaticInnerClass print

 

END

posted on 2020-04-22 20:19  我不吃番茄  阅读(197)  评论(0编辑  收藏  举报