zoukankan      html  css  js  c++  java
  • 浅析匿名内部类

    小小的总结一波匿名内部类


    顾名思义,匿名是重点,在定义一个类的同时对其进行实例化。它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类。

    官方文档的示例

    public class HelloWorldAnonymousClasses {

    /**
    * 包含两个方法的HelloWorld接口
    */
    interface HelloWorld {
    public void greet();
    public void greetSomeone(String someone);
    }

    public void sayHello() {

    // 1、局部类EnglishGreeting实现了HelloWorld接口
    class EnglishGreeting implements HelloWorld {
    String name = "world";
    public void greet() {
    greetSomeone("world");
    }
    public void greetSomeone(String someone) {
    name = someone;
    System.out.println("Hello " + name);
    }
    }

    HelloWorld englishGreeting = new EnglishGreeting();

    // 2、匿名类实现HelloWorld接口
    HelloWorld frenchGreeting = new HelloWorld() {
    String name = "tout le monde";
    public void greet() {
    greetSomeone("tout le monde");
    }
    public void greetSomeone(String someone) {
    name = someone;
    System.out.println("Salut " + name);
    }
    };

    // 3、匿名类实现HelloWorld接口
    HelloWorld spanishGreeting = new HelloWorld() {
    String name = "mundo";
    public void greet() {
    greetSomeone("mundo");
    }
    public void greetSomeone(String someone) {
    name = someone;
    System.out.println("Hola, " + name);
    }
    };

    englishGreeting.greet();
    frenchGreeting.greetSomeone("Fred");
    spanishGreeting.greet();
    }

    public static void main(String... args) {
    HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses();
    myApp.sayHello();
    }
    }


    分析:这个例子中,EnglishGreeting 是局部类,实现了HelloWorld接口,使用匿名类来初始化变量frenchGreeting 和spanishGreeting 

    1.可以看出,局部类实现了接口,定义完成之后需要实例化才可以使用

    2.而匿名类在定义的同时就已经完成了实例化,定义完成后就可以直接使用

    3.需要注意的是,匿名类是一个表达式,因此在定义的最后用";"结束

    简言之,匿名内部类主要特点:匿名+定义与实例化同时完成(定义完直接使用)+表达式

    访问作用域内的局部变量、定义和访问匿名内部类成员

    (1)、匿名内部类可以访问外部内的所有成员;

    (2)、匿名内部类不能访问外部类未加final修饰的变量(注意:JDK1.8即使没有用final修饰也可以访问);

    (3)、属性屏蔽,与内嵌类相同,匿名内部类定义的类型(如变量)会屏蔽其作用域范围内的其他同名类型(变量):

    (4)、匿名内部类中不能定义静态属性、方法;

    (5)、匿名内部类可以有常量属性(final修饰的属性);

    (6)、匿名内部内中可以定义属性,如上面代码中的代码:private int x = 1;

    (7)、匿名内部内中可以可以有额外的方法(父接口、类中没有的方法);

    (8)、匿名内部内中可以定义内部类;

    (9)、匿名内部内中可以对其他类进行实例化。

  • 相关阅读:
    Java第二次作业
    JAVA学习计划
    学生选课系统
    抽奖
    Java第二次作业
    Java第六次作业修改版
    Java第六次作业
    JAVA第五次作业
    Java第四次作业
    JAVA第三次作业
  • 原文地址:https://www.cnblogs.com/spx88/p/14193545.html
Copyright © 2011-2022 走看看