Java-成员内部类 匿名内部类

1)成员内部类: 应用率不高
1.1)类中套类,外面的称为外部类,里面的称为内部类
1.2)内部类通常只服务于外部类,对外不具备可见性
1.3)内部类对象通常在外部类中创建
1.4)内部类中可以直接访问外部类的成员(包括私有的)
内部类中有一个隐式的引用,指向了创建它的外部类对象
---外部类名.this

public class InnerClassDemo {
    public static void main(String[] args) {
        Mama m = new Mama();
        //Baby b = new Baby(); //编译错误,内部类对外不具备可见性
    }
}

class Mama { //外部类
    private String name;

    void create() {
        Baby b = new Baby();
    }

    class Baby { //内部类
        void showName() {
            System.out.println(name); //简便写法
            System.out.println(Mama.this.name); //完整写法
            //System.out.println(this.name); //编译错误,this指代当前Baby对象
        }
    }
}

2)匿名内部类:----------大大简化代码的操作
2.1)若想创建一个类(派生类)的对象,并且对象只被创建一次,
此时可以设计为匿名内部类
2.2)在匿名内部类中不能修饰外面局部变量的值,
因为该变量在此处会默认为final的----------记住它(传奇才师那用)
2.3)问:内部类有独立的.class吗?
答:有

public class NstInnerClassDemo {
    public static void main(String[] args) {
        //1)系统自动创建了Aoo的一个派生类,但是没有名字
        //2)为该派生类创建了一个对象,名为o1
        //      new Aoo(){}是在创建Aoo的派生类的对象
        //3)大括号中的为派生类的类体
        Aoo o1 = new Aoo() {};

        //1)系统自动创建了Aoo的一个派生类,但是没有名字
        //2)为该派生类创建了一个对象,名为o2
        //3)大括号中的为派生类的类体
        Aoo o2 = new Aoo() {};
        //1)系统自动创建了Boo的一个派生类,但是没有名字
        //2)为该派生类创建了一个对象,名为o3
        //3)大括号中的为派生类的类体
        Boo o3 = new Boo() {
            void show() {
                System.out.println("show");
            }
        };
        o3.show();
        int num = 5;
        num = 55;
        Boo o4 = new Boo() {
            void show() {
                System.out.println("show");
                //num = 66; //编译错误,匿名内部类中不能修改外面局部变量的值,
                //因为在此处该变量会默认为final的
            }
        };

    }
}

abstract class Boo {
    abstract void show();
}

abstract class Aoo {
}
posted @ 2022-07-18 19:34  自带光环的宇  阅读(48)  评论(0)    收藏  举报