7.2.1 和子类有关的匿名类
java允许我们直接使用一个类的子类的类体创建一个子类对象,也就是说,创建子类对象时,除了使用父类的构造方法外还有类体,此类提被认为是一个子类去掉类声明后的类体,称作匿名类。匿名类不能声明对象,但是可以创建一个对象。
Bank a = new Bank(){
匿名类的类体
};
- 匿名类可以继承父类的方法,也可以重写父类的方法
- 匿名类一定是在某个类中用匿名类创建对象,匿名类一定是内部类。
- 与内部类相同,匿名类的类体不可以声明static成员,可以访问外嵌类的成员。
- 匿名类创建对象用的是父类的构造方法。
- 匿名对象的引用可以直接传递给一个匹配的参数
abstract class OutputAlphabet{
public abstract void output();
}
public class OutputEnglish extends OutputAlphabet{
public void output(){
for(char c = 'a';c<='z';c++){
System.out.println("%3c",c);
}
}
}
public class showBoard{
void showMess(OutputAlphabet show){
show.output();
}
}
public class Example{
public static void main(String args[]){
ShowBoard board = new ShowBoard();
board.showMess(new OutputEnglish());//向参数传递OutputAlphabet的子类,也就是利用上转型对象的作用,
board.showMess(new OutputAlphabet()
{
public void output()
{
for(char = '1';c<='9';c++)
{
System.out.println("%3c",c);
}
}
});//为什么要这样呢?因为我们其实没有真正定义一个子类可以取输出数字,所以我们可以利用匿名类看成是一个子类,然后直接在里面重写父类的东西就可以。
}
}
7.2.2 和接口有关的匿名类
假设Computable是一个接口,那么java允许使用接口名和一个类体创建一个匿名对象,此类体被认为是实现了Computable接口的类去掉类声明后的类体,称作匿名类。
new Computable(){};
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给该方法的参数,类体必须重写接口中的全部方法。
interface SpeakHello{
void speak();
}
class HelloMachine{
public void turnOn(SpeakHello hello){
hello.speak();
}
}
public class example{
public static void main(String args[]){
HelloMachine machine = new HelloMachine();
machine.turnOn(new SpeakHello(){
public void speak(){
System.out.println("hello,you are welcome!");
}
});
}
}