学习匿名内部类


/**
 * 匿名内部类
 *
 *  一 定义:
 *      new 接口(){//重写或实现抽象方法}
 *      new 父类([实参列表]){//重写或实现抽象方法}
 *
 * 二 要求
 *      1   仅且实现一个接口或继承一个父类
 *      2   不可以是抽象类,必须实现所有的抽象方法(来自实现树或继承树)
 *      3   不可以定义构造器
 *
 *
 * 三 匿名内部类创建本类的实例(匿名内部类的对象访问自定义的成员两种情况)
 *           //  注意:
 *           //第一种情况无法访问 ,该对象被User类限制了
 *           User user = new User(){ }
 *          //第二种情况可以访问自己声明的成员,var为声明为本类,var 只能声明局部变量,不可以声明成员变量
 *           var user = new User(){String name = "tom"; }
 *
 * 四 注意
 *     1 创建内部类的匿名内部类对象和内部类对象的区别,是否有大括号.
 *        var a = new User().new A();//创建内部类对象
 *        var a = new User.A(){};//创建内部类的匿名内部类对象
 *     2 匿名内部类和普通内部类没有什么区别,只能包含实例成员(成员变量,方法,内部类,代码块),不可以包含静态成员
 *     3 可以选择哪个父类的构造器,去创建父类的对象
 *     4 局部变量a被匿名内部类访问后,则a自动使用了final修饰,不论在匿名内部类内部或在之后都不可以修改
 *     5 匿名内部类除了包含局部内部类声明和作用范围都在在代码块,普通方法,构造器里等相同点,还可以给成员变量赋值,活在类/实例的声明周期里
 *
 *
 */
//测试匿名内部类
public class 匿名内部类 {
    public static void main(String[] args) {
        int i = 1;//初始化一个局部变量i值为1;
//    User user = new User(){   // 该user对象被User类限制了,如下输出除了第一行输出语句,其他输出语句全部报错
        var user = new User(){//第二种情况可以访问自己声明的成员,var为声明为当前对象类型
            {

                System.out.println("我是匿名匿名内部类的实例初始化块,现在访问局部变量i: " + i);
            }
            String name = "我是匿名内部类的实例变量name";
            String hobby = "吃饭";
            public void eat(){
                System.out.println(name + "爱好" + hobby);
            }
            class Detail{
                int age = 55;
                char gender = '男';
            }
        };
        //我是User实例变量name(输出这句话,说明匿名内部类可以给成员变量赋值,符合创建上面的匿名内部类对象,父类的nme实例变量会先初始化)
        //我是匿名内部类的实例初始化块,现在访问局部变量i: 1(执行匿名内部类的实例代码块,输出这句话)
        System.out.println(user.name);  //我是匿名内部类的实例变量name(访问覆盖父类User的实例变量name
        System.out.println(user.hobby); //吃饭(访问自定义的实例变量hobby)
        System.out.println(user.new Detail().age); //55(创建匿名内部类的实例内部类的实例,并访问它的实例成员age)
        System.out.println(user.new Detail().gender);//男(创建匿名内部类的实例内部类的实例,并访问它的实例成员gender)
        user.eat(); //我是匿名内部类的实例变量name爱好吃饭(访问自定义的实例方法)
        //System.out.println(i++);//(i已经被匿名内部类访问过了,现在有对他进行修改,输出报错)
        //(如上验证了匿名内部类可以包含实例成员(成员变量,方法,内部类,代码块)并且都可通过访问)

    }
}
class User{
    匿名内部类 name = new 匿名内部类(){{
        System.out.println("我是User实例变量name");
    }};

}

如下窗口输出


我是User实例变量name
我是匿名匿名内部类的实例初始化块,现在访问局部变量i: 1
我是匿名内部类的实例变量name
吃饭
55

我是匿名内部类的实例变量name爱好吃饭

posted @ 2022-05-14 14:28  -和时间赛跑-  阅读(28)  评论(0编辑  收藏  举报