zoukankan      html  css  js  c++  java
  • 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的类文件。

  • 相关阅读:
    java中Condition类的详细介绍(详解)
    Semaphore原理以及使用总结
    RocketMQ消息存储原理总结(一)
    Es Bucket聚合(桶聚合)总结
    "元素隐式具有 “any” 类型,因为类型“Shared”没有索引签名"问题解决思路
    有关生产环境tomcat java应用报错Caused by: java.lang.OutOfMemoryError: Java heap space的调研
    docker 实践02
    正睿比赛总结day1
    【水】一个神秘玩意:如何分辨出差别很小的颜色?
    AtCoder Regular Contest 125 比赛记录(vp)
  • 原文地址:https://www.cnblogs.com/human/p/5117128.html
Copyright © 2011-2022 走看看