A:匿名内部类
就是内部类的简化写法
B:前提
这里的类可以是具体类也可以是抽象类
C:格式
new 类名或者接口(){ //表示继承这个类或实现这个接口重写方法}
D:本质是什么呢?
是一个继承了该类或者实现了该接口的子类匿名对象
E:案例实现
按要求来写一个匿名内部类与一个有名字的内部类进行对比要求:创建一个Inter接口,接口里面有个抽象方法print,print这个抽象方法有个输出语句,输出 print ,然后分别用 **有名字的内部类** 跟 **匿名内部类** 这两种方式去实现。
一,有名字的内部类(Outer)
package Demo_nimingneibulei;public class hasming {public static void main(String[] args) {Outer o =new Outer(); //创建对象o.method(); //调用method()方法}}interface Inter{ //定义接口public void print(); //接口里面有一个print抽象方法
}class Outer{ //有名字的内部类去实现了Inter这个接口,然后重写Inter接口里面抽象方法printclass Inner implements Inter{ //创建Inner这个类去实现Inter接口,Inner就是Inter的子类public void print(){ //重写Inter接口里面的方法System.out.println("print");}}public void method(){
① Inner i = new Inner();i.print();② new Inner().print(); //new Inner() 代表着Inter的子类对象,然后 .print() 再调用Inner里面重写之后的print()方法
//①②两种方法是一样的想过,②是①的另外一种形式
// new Inter(); //创建Inter对象,是错误的,因为Inter是抽象的,无法去实例化}
}
二,匿名内部类(Outer1)
package Demo_nimingneibulei;import Demo_nimingneibulei.Outer.Inner;public class Noname {public static void main(String[] args) {Outer1 o = new Outer1(); //创建Outer1该类的对象oo.method(); //调用Outer1里面的method方法}
}interface Inter1 {public void print();
}class Outer1{ //创建匿名内部类public void method(){ //匿名内部类是局部内部类的一种,所以必须写在方法里面// new Inter(); //直接创建Inter对象,不能这样写,因为Inter1是个接口是抽象的,无法实例化new Inter1(){ //实现Inter接口,实现接口,必须重写Inter1接口里面的抽象方法print()public void print(){ //重写Inter接口里面的print抽象方法System.out.println("print");}}.print(); //.之前的内容,代表在Inter1这个接口的子类对象,然后,我们就可以调用Inter1这个接口的子类对象里面的方法了,直接.print(),去调用该方法}
//匿名内部类与有名字的内部类相比,不用再写一个类名去实现接口或者去继承类了
}