假设Computable是一个接口,那么,Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了Computable接口的类去掉类声明后的类体,称作匿名类。
new Computable() {
实现接口的匿名类的类体
} ;
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,对于
void f(ComPutable x)其中的参数x是接口,那么在调用f时,可以向f的参数x传递一个匿名对象,例如:
f(new ComPutable() {
实现接口的匿名类的类体
})
新建一个Ball类
Ball.java
public interface Ball { //接口
void getColor();
}
新建RedBall类
RedBall .java
public class RedBall implements Ball{ //实现这个接口和抽象方法
@Override
public void getColor() {
System.out.println("red");
}
}
新建BlueBall类
BlueBall.java
public class BlueBall implements Ball{ //实现这个接口和抽象方法
@Override
public void getColor() {
System.out.println("blue");
}
}
Test.java
public class Test {
void testPerson(Person person) {
person.speak();
}
void testCar(Car car){
car.sound();
}
void testBall(Ball ball){
ball.getColor();
}
}
在主类中如何来调用它呢?
Demo29.java
public class Demo29 {
public static void main(String[] args) {
Ball ball = new RedBall();
Test test = new Test();
test.testBall(ball);
}
}
运行结果
修改代码
Demo29.java
public class Demo29 {
public static void main(String[] args) {
Ball ball = new RedBall();
Test test = new Test();
test.testBall(ball);
ball = new BlueBall();
test.testBall(ball); //再把我们的ball传进来
}
}
运行结果,先打印red,再打印blue这就是之前的接口与多态
这里将接口和多态和我们的匿名类结合起来
修改代码
Demo29.java
public class Demo29 {
public static void main(String[] args) {
Ball ball = new RedBall();
Test test = new Test();
test.testBall(ball);
test.testBall(ball);
test.testBall(new RedBall());
test.testBall(new Ball() { //这里重写的是一个接口,一个接口必须把它当中的方法做一个实现
@Override
public void getColor() {
System.out.println("yellow");
}
});
}
}
这里的匿名接口子类打印的是yellow
网友评论