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的类文件。

  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/human/p/5117128.html
Copyright © 2011-2022 走看看