浅析匿名内部类

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


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

官方文档的示例

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)、匿名内部内中可以对其他类进行实例化。

原文地址:https://www.cnblogs.com/spx88/p/14193545.html