Java基础——匿名内部类详解及举例
说明:定义在外部类的局部位置,比如方法中,并且没有类名
匿名内部类的使用
- 匿名内部类的基本语法
new 类或接口(参数列表){ 类体 };
用途:有些时候为了简化开发,创建一个基于接口或者基于类的新的类,但这个类我只使用一次,后面不再使用,按照传统的写法new一个新类或者接口有点太浪费了,于是用匿名内部类来简化开发
基于接口的匿名内部类
public class AnonymouslnnerClass { public static void main(String[] args) { Outer04 o=new Outer04(); o.method(); } } class Outer04{ //外部类 private int n1 = 10; //属性 public void method(){ //方法 //基于接口的匿名内部类 A tiger = new A(){ @Override public void cry() { System.out.println("老虎叫叫。。。"); } }; tiger.cry(); } } //接口 interface A{ public void cry(); }
- 基于类的匿名内部类
public class AnonymouslnnerClass { public static void main(String[] args) { Outer04 o=new Outer04(); o.method(); } } class Outer04{ //外部类 private int n1 = 10; //属性 public void method(){ //方法 //基于类的匿名内部类 //1、father编译类型 Father //2、father运行类型 Outer$1 Father father=new Father("jack"){ @Override public void test() { System.out.println("匿名内部类重写的test方法"); } }; System.out.println("father对象的运行类型:"+father.getClass()); father.test(); } } class Father{ //类 public Father(String name){ //构造器 } public void test(){ //方法 } } //输出:father对象的运行类型:class 匿名内部类.Outer04$1
- 基于抽象类的匿名内部类
public class AnonymouslnnerClass { public static void main(String[] args) { Outer04 o=new Outer04(); o.method(); } } class Outer04{ //外部类 private int n1 = 10; //属性 public void method(){ //方法 //基于抽象类的匿名内部类 Animal animal = new Animal(){ @Override void cry() { System.out.println("zoo"); } }; animal.cry(); } } abstract class Animal{ abstract void cry(); }
匿名内部类举例:
- 有一个铃声接口Bell,里面有一个ring方法。
- 有一个手机类Cellphone,具有闹钟功能alarmClock,参数是Bell类型。
- 测试手机类的闹钟功能,通过匿名内部类(对象)作为参数,打印:懒猪起床了
- 再传入另一个匿名内部类(对象),打印:小伙伴上课了
package 匿名内部类;
public class InnerClassExercise02 {
public static void main(String[] args) {
Cellphone cellphone=new Cellphone();
cellphone.alarmClock(new Bell() {
@Override
public void ring() {
System.out.println("懒猪起床了!");
}
});
cellphone.alarmClock(new Bell() {
@Override
public void ring() {
System.out.println("小伙伴们起床了!");
}
});
}
}
class Cellphone{
public void alarmClock(Bell bell){
bell.ring();
}
}
interface Bell{
void ring();
}
匿名内部类注意的细节
1. 匿名内部类语法比较奇特,请大家注意,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有出创建对象的特征,对前面代码分析可以看出这个特点,因此可以调用内部类方法。
2. 可以直接访问外部类的所有成员,包含私有的
3. 不能添加访问修饰符,因为它的地位就是一个局部变量。
4. 作用域:仅仅在定义它的方法或代码块中。
5. 匿名内部类--访问--->外部类的成员函数 [访问方式:直接访问]
6. 外部其他类--->不能访问--->匿名内部类(因为 匿名内部类地位是一个局部变量)
7. 如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用 (外部类名.this.成员)去访问。