- 匿名内部类语法比较奇特,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征。因此,匿名内部类有以下两种调用方式:
//法一: 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;
@Override
public 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(){
@Override
public void hi() {
System.out.println("匿名内部类重写了 hi方法,哈哈...");
}
@Override
public 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);
}
}
//抽象类/接口...