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


    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

  • 相关阅读:
    浮点数
    opencv笔记-GFTTDetector
    有向图与关联矩阵
    亚像素角点
    字符串格式化输出
    字符串表示与转换
    Bresenham算法
    罗德里格斯公式
    模型调参
    jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/12755619.html
Copyright © 2020-2023  润新知