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.成员)去访问。