• 2)Java学习笔记:匿名内部类


    为什么要使用匿名内部类

    ①如果以前的类有一些缺陷,只是想在某一个模块进行修复,可以在引用该类的地方使用匿名内部类,在overRide方法进行修复。
    ②如果一个类,需要派生出很多类,而且这些类大多只是在一个特定模块去使用,是不是没有必要挨个的去创建这些子类呢。

    注意事项

    ①使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
    ②匿名内部类中是不能定义构造函数的, 只能用现有的父类构造器或者用初始化代码块来进行初始化。
    ③匿名内部类中不能存在任何的静态成员变量和静态方法。
    ④匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
    ⑤匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
    ⑥匿名内部类只能访问所在方法用final修饰的局部变量,为了防止匿名内部类不小心修改了外部变量的引用。

    匿名内部类语法

    new 父类构造器(参数列表)|实现接口()  
        {  
         //匿名内部类的类体部分  
        }
    

    Example

    interface Product {
        long getPrice();
    }
    
     abstract class Bird {
        private String name;
        public void setName(String name) {this.name = name;}
        public String getName() {return name;}
        public abstract int fly();
    }
    
    public class Anonymous {
    
        public void test(String name /* must defined final that innerClass Method can access; */) {
    
            final int age = 22;
    
            Product p1  = new Product() {
                @Override
                public long getPrice() {
                    // 只能访问用final修饰的局部变量
                    return age;
                }
            };
    
            Bird p2  = new Bird() {
                @Override
                public void setName(String _name) {
                    // compile error, name must defined final
    //                super.setName(name);
                }
                @Override
                public int fly() {
                    return 1999;
                }
            };
        }
    
        public static void main(String[] args) {
            new Anonymous().test("human.huang");
        }
    }
    编译后目录:=》
    total 40
    -rw-r--r--  1 huangjunhua  staff  600 Jan  9 20:13 Anonymous$1.class
    -rw-r--r--  1 huangjunhua  staff  665 Jan  9 20:13 Anonymous$2.class
    -rw-r--r--  1 huangjunhua  staff  977 Jan  9 20:13 Anonymous.class
    -rw-r--r--  1 huangjunhua  staff  528 Jan  9 20:13 Bird.class
    -rw-r--r--  1 huangjunhua  staff  132 Jan  9 20:13 Product.class
    
    
    编译后代码:=》
        public void test(String name) {
            boolean age = true;
            byte ageTest = 33;
            System.out.println(ageTest);
            Product var10000 = new Product() {
                public long getPrice() {
                    return 22L;
                }
            };
            Bird var6 = new Bird() {
                public void setName(String _name) {
                }
    
                public int fly() {
                    return 1999;
                }
            };
        }
    

    其实匿名内部类也生成了Anonymous$1.class和Anonymous$2.class的类文件。

  • 相关阅读:
    复习正则表达式20190618
    python每日练习10题2
    java多线程
    资源2
    apache
    行转列,列转行
    mysql5.7安装(正确安装)实战
    常见规则引擎技术
    Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势
    Vue开源项目库汇总
  • 原文地址:https://www.cnblogs.com/human/p/5117128.html
Copyright © 2020-2023  润新知