匿名内部类是什么
定义在外部类的内部,比如方法中,并且没有类名(由系统直接分配,若用debug查看变量,显示的是外部类名.$数组)
匿名内部类可以访问外部类的私有属性和私有方法,不能添加修饰符
public class Anonymous {
public static void main(String[] args) {
Outer outer = new Outer();
outer.tiger.cry();
outer.dog();
}
}
interface IA{
void cry();
}
class Outer{
//如果要使用IA接口,并创建对象,传统方式是写一个类实现接口并创建对象
//但是这个类只需要使用一次所以使用匿名内部类来简化开发
//匿名内部类的名字由系统自动分配,需要使用对象.getclass
//接口其实是无法new的,但是这里通过大括号并实现其中的方法,是的其可以创建并且将地址传递给tiger
//匿名内部类只能使用一次,但是已经创建的tiger可以多次使用
IA tiger=new IA() {
@Override
public void cry() {
System.out.println("老虎狂啸");
}
};
public void dog() {
IA dog = new IA() {
@Override
public void cry() {
System.out.println("小狗汪汪");
}
};
}
new Father(){
@Override
publi void ih(){
sop("匿名内部类调用了hi方法")
}
}.hi();//这样甚至都不用创建变量,直接调用
//体现了匿名内部类的对象的特征
Father father=new Father("jack"){
//匿名内部类中不能重写构造器,不能创建特有方法
//运行类型是Outer$3
//这里可以重写father的方法
//这里相当于继承了一个类,省去了创建不必要的新的子类
@Override
public void test() {
super.test();
}
};//这里有大括号,所有是匿名内部类
// Father father=new Father("jack");这里是直接创建father对象
}
class Father{
String name;
public Father(String name){
this.name=name;
}
public void test(){
System.out.println("name="+name);
}
}
匿名内部类可以当成实参直接传递
```Java
class m{
public static voie main(String[] args){
f1(new IL(){//注意这里的用法,原本接口时无法new的,但是这里使用了{}并实现了方法
@Override
public void show(){
sop("这是一副名画");
}//当作实参直接传入,否则就需要用一个类继承接口在new之后调用,
});
}
publc static void f1(IL il){
il.show();
}
interface IL{
void show();
}
}