基于接口的匿名内部类
package com.InnerClass; public class AnonymousInnerClass { public static void main(String[] args) { Outer01 outer01 = new Outer01(); outer01.method(); } } interface IA{ public void cry(); } class Outer01{ public void method(){ //传统方法是写一个类,实现接口IA,再创建该类的对象 //匿名内部类是创建类的同时创建一个实例对象,类只能使用一次, //但创建的实例对象可以一直使用。 //tiger的编译类型 左边的IA //tiger的运行类型 就是匿名内部类,类名Outer01$1(系统命名) IA tiger = new IA() {//基于接口的匿名内部类 @Override public void cry() { System.out.println("老虎在叫..."); } }; //打印匿名内部类类名 System.out.println("tiger的运行类型="+tiger.getClass()); tiger.cry(); } }
基于类的匿名内部类
package com.InnerClass; public class AnonymousInnerClass { public static void main(String[] args) { Outer01 outer01 = new Outer01(); outer01.method(); } } interface IA{ public void cry(); } class Outer01{ public void method(){ //传统方法是写一个类,实现接口IA,再创建该类的对象 //匿名内部类是创建类的同时创建一个实例对象,类只能使用一次, //但创建的实例对象可以一直使用。 //tiger的编译类型 左边的IA //tiger的运行类型 就是匿名内部类,类名Outer01$1(系统命名) IA tiger = new IA() {//基于接口的匿名内部类 @Override public void cry() { System.out.println("老虎在叫..."); } }; //打印匿名内部类类名 System.out.println("tiger的运行类型="+tiger.getClass()); tiger.cry(); //........... //如果是new Father("jack");这是创建一个Father类的对象 //father编译类型 Father //father运行类型 匿名内部类,类名Outer01$2 Father father = new Father("jack"){//基于类的匿名内部类,有参数列表 @Override void test() { System.out.println("匿名内部类重写了test方法"); } }; father.test(); } } class Father{ public Father(String name){//构造器 } void test(){ } }
匿名内部类使用细节
细节1)
//比如上面的接口示例
IA tiger = new IA() {//基于接口的匿名内部类
@Override
public void cry() {
System.out.println("老虎在叫...");
}
};
tiger.cry(); //动态绑定
//也可以写成
new IA() {//基于接口的匿名内部类
@Override
public void cry() {
System.out.println("老虎在叫...");
}
}.cry(); //动态绑定
细节2)
package com.InnerClass; public class InnerClassExercise { public static void main(String[] args) { CellPhone cellPhone = new CellPhone(); cellPhone.alarmClock(new Bell() {//以匿名内部类作为运行类型创建的对象, @Override // 编译类型为Bell public void ring() { System.out.println("懒猪起床了"); } }); cellPhone.alarmClock(new Bell() { @Override public void ring() { System.out.println("小伙伴起床了"); } }); } } interface Bell{ void ring(); } class CellPhone{//CellPhone类中含有方法alarmClock public void alarmClock(Bell bell){//方法alarmClock的参数为接口类型 bell.ring();//方法动态绑定机制,自动绑定到上面重写了的ring方法 } }
细节3)
//使用静态方法
package com.InnerClass; public class InnerClassExercise { public static void main(String[] args) { alarmClock(new Bell() { @Override public void ring() { System.out.println("闹铃响了"); } }); } //静态方法 public static void alarmClock(Bell bell){ bell.ring(); //方法动态绑定机制,自动绑定到上面重写了的ring方法 } } interface Bell{ void ring(); }