- 匿名内部类语法比较奇特,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征。因此,匿名内部类有以下两种调用方式:
//法一: new A(){
@Override
public void cry(){
System.out.println(“hello~”);
}
}.cry();//法二: A a = new A(){
@Override
public void cry(){
System.out.println(“hello~”);
}
};
a.cry();
package test;/*** 演示匿名内部类的使用*/public class Main {//外部其他类public static void main(String[] args) {Outer Outer = new Outer();Outer.f1();System.out.println("main Outer hashcode=" + Outer);}}class Outer {private int n1 = 99;public void f1() {//创建一个基于类的匿名内部类//不能添加访问修饰符,因为它的地位就是一个局部变量//作用域 : 仅仅在定义它的方法或代码块中Person p = new Person(){private int n1 = 88;@Overridepublic void hi() {//可以直接访问外部类的所有成员,包含私有的//如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,//默认遵循就近原则,如果想访问外部类的成员,则可以使用 (外部类名.this.成员)去访问System.out.println("匿名内部类重写了 hi方法");System.out.println("n1 = " + n1 + " 外部内的n1=" + Outer.this.n1);//Outer.this 就是调用 f1的 对象System.out.println("Outer.this hashcode=" + Outer.this);}};p.hi();//动态绑定, 运行类型是 Outer$1//也可以直接调用, 匿名内部类本身也是返回对象// 底层:class 匿名内部类 extends Person {}new Person(){@Overridepublic void hi() {System.out.println("匿名内部类重写了 hi方法,哈哈...");}@Overridepublic void ok(String str) {super.ok(str);}}.ok("WTY2002");}}class Person {//类public void hi() {System.out.println("Person hi()");}public void ok(String str) {System.out.println("Person ok() " + str);}}//抽象类/接口...

