创建一个包NiMing,下面有一个抽象类Animal
Animal抽象类:
package NiMing;
public abstract class Animal {
public abstract void eat();
}
再创建一个Test类用于测试:
package NiMing;
public class Test {
public static void main(String[] args) {
}
}
因为抽象类是不可以实例化的,如果我们要实现Animal类,那么我们可以再次创建另一个类来继承它,并且重写它的所有抽象方法。
比如说我们可以创建一个Dog类来继承Animal类,然后通过Dog类来new一个对象,通过对象来调用eat()方法,如下
package NiMing;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗在吃东西");
}
}
package NiMing;
public class Test {
public static void main(String[] args) {
Dog d=new Dog();
d.eat();
}
}
但这样太麻烦了,我们为了实现调用eat()方法使其具体化,不得不特意创建一个Dog类,在其中重写这个方法,特别麻烦。 由此我们可以使用匿名类。
以下是匿名类的格式:
我们将刚刚的代码用匿名类来实现:
形式1:
package NiMing;
public class Test {
public static void main(String[] args) {
new Animal(){
@Override
public void eat() {
System.out.println("狗吃东西");
}
}.eat();
}
}
当然,也可以这样来实现:
形式2
package NiMing;
public class Test {
public static void main(String[] args) {
Animal a= new Animal(){
@Override
public void eat() {
System.out.println("狗吃东西");
}
};
a.eat();
}
}
其实,我们可以这样理解:
把上图红圈内的内容看成一个对象,这个对象属于一个没有名字的类,这个没有名字的类继承自Animal抽象类,因而这个对象当然就可以调用eat()方法了。
为了更好的理解,写出以下代码:
method()方法需要的参数是Animal的子类对象,在上面代码中,红圈中的内容就相当于Animal的子类对象。
上述接口类如是。
即使不是抽象类和接口,一般的函数也可以通过匿名类来重写类中方法,而不用修改原类中的方法,达到多态的效果。
需要注意的是抽象类或接口,在使用匿名类时要重写所有的抽象方法,否则会报错