interface People {
public abstract void show();
}
public class Main {
public static void main(String[] args) {
People p=new People() {
@Override
public void show() {
System.out.println("匿名内部类重写后的show方法");
}
};
p.show();
}
}
首先,我们先创建一个People接口,它有一个抽象方法show( ).
其次,介绍一下创建匿名内部类的语法, new 类名/接口名( ) { }
,它的含义是什么呢?我们一点一点来解释.new不必多说,它的作用就是创建一个新的对象,类名或者接口名就代表你继承的是哪个类,或者实现的哪个接口,而后面的花括号才是这个类的本体.简而言之,其实就是某个类的子类,或者是某个接口的实现类,对其父类或者接口的一些方法进行了重写,然后同时创建了一个匿名内部类的对象.
大家可以运行一下这段代码,就会发现什么也没有输出,这是为什么呢?因为我们只是new了一个对象,并且重写了方法,但是并没有去调用.我们可以回想一下普通的类是怎么创建对象的,比如字符串创建对象是这样的:String s=new String("helloworld.")
左边是不是用String类型的变量s来接受一个String对象?但是我们这里创建的匿名内部类是不是没有名字?所以这里就需要用到类和接口的多态了(如果不知道多态是什么,请自行查阅).
interface People {
public abstract void show();
}
public class Main {
public static void main(String[] args) {
People p = new People() {
@Override
public void show() {
System.out.println("匿名内部类重写后的show方法");
}
};
p.show();
}
}
大家再运行一下这段代码,就正常的打印出了"匿名内部类重写后的show方法".至于匿名内部类的应用场景,例如我们需要对某个类的某个方法重写,但是这个新的类又只需要使用一次.那么我们再去创建一个class文件,是不是很麻烦还多余?使用匿名内部类很简洁的就解决了.再比如下面的一段代码.方法需要一个类作为参数,我们一般是不是创建一个对象然后再传进去进行测试?但是我们学了匿名内部类之后就可以直接创建一个匿名内部类作为参数传入函数.在调试代码的时候会方便很多.
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
func(dog);
func(new Dog() {
@Override
public void eat() {
System.out.println("大狗在吃骨头");
}
});
}
public static void func(Dog dog) {
dog.eat();
}
}
class Dog {
public void eat() {
System.out.println("小狗在吃骨头");
}
}
评论区