1、与子类有关的匿名类
假如没有显示的声明一个类的子类,而又想用子类创建一个对象,那么该如何实现这一个目的呢?
Java允许我们直接使用一个类的子类的类体创建一个子类对象。也就是说创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类体,称作匿名类。
假设Bank是类,那么下列代码就是用Bank的一个子类(匿名类)创建对象:
new Bank () {
匿名类的类体
};
匿名类的常用的方式是向方法的参数传值。
void f(A a){
}
2、与接口有关的匿名类
假设Computable是一个接口,那么,Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了Computable接口的类去掉类声明后的类体,称作匿名类。
new Computable() {
实现接口的匿名类的类体
} ;
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,对于
void f(ComPutable x) 其中的参数x是接口,那么在调用f时,可以向f的参数x传递一个匿名对象,例如:
f(new ComPutable() {
实现接口的匿名类的类体
})
3、示例程序
Ball.java
public interface Ball {
void getColor();
}
BlueBall .java
public class BlueBall implements Ball{
@Override
public void getColor() {
System.out.println("blue");
}
}
Boy .java
public class Boy extends Person{
@Override
void speak() {
System.out.println("boy");
}
}
Car .java
public class Car {
void sound(){
System.out.println("sound");
}
}
Demo29 .java
public class Demo29 {
public static void main(String[] args) {
// Person person = new Boy();
// Test test = new Test();
// test.testCar(new Car(){
// });
// test.testPerson(person);
// test.testPerson(new Boy());
// test.testPerson(new Person(){
//
// @Override
// void speak() {
// System.out.println("匿名类说的话");
// }});
// person = new Girl();
// test.testPerson(person);
Ball ball = new RedBall();
Test test = new Test();
// test.testBall(ball);
// test.testBall(new RedBall());
test.testBall(new Ball() {
@Override
public void getColor() {
System.out.println("yellow");
}
});
// ball = new BlueBall();
// test.testBall(ball);
}
}
Girl .java
public class Girl extends Person{
@Override
void speak() {
System.out.println("girl");
}
}
Person .java
public abstract class Person {
abstract void speak();
}
RedBall .java
public class RedBall implements Ball{
@Override
public void getColor() {
System.out.println("red");
}
}
Test .java
public class Test {
void testPerson(Person person) {
person.speak();
}
void testCar(Car car){
car.sound();
}
void testBall(Ball ball){
ball.getColor();
}
}