今天主要学习了匿名内部类。
匿名内部类是一种特殊的内部类,它没有类名,是通过继承一个类或实现一个接口来创建的,匿名内部类相当于基类的一个导出类,不过它只能通过向上转型为基类类型后才能被使用。
匿名内部类主要用于对继承方法进行实现或覆盖,它不需要添加其它的方法,即使添加也无法使用(因为它没有类名,只能通过向上转型使用,且无法向下转型,因此添加的其它方法也就无法访问)。
匿名内部类如果想使用外部定义的对象,则编译器要求参数引用必须是final类型,否则会报错。如:
public Destination destination(final String s){
return new Destination(){
private String item=s;
}
};
匿名内部类可以通过实例初始化来达到为匿名内部类创建一个构造器的效果。如:
DangerousMonster getMonster(){
return new DangerousMonster(){
{System.out.println("this is Inside instance initializer");}
@Override
public void menace() {
System.out.println("this is DangerousMonster.menace()");
}
@Override
public void destroy() {
System.out.println("this is DangerousMonster.destroy()");
}
};
使用匿名内部类来设计工厂方法会达到更好的效果:
package chapter_ten;
import java.util.Random;
public class Demo_seventeen {
static void playGame(GameFactory f){
Game g=f.getGame();
g.play();
}
public static void main(String[] args) {
playGame(ThrowCoin.factory);
playGame(ThrowDice.factory);
}
}
interface Game{
void play();
}
interface GameFactory{
Game getGame();
}
class ThrowCoin implements Game{ //抛硬币
private Random rand=new Random();
public void play() {
if(rand.nextInt(2)==1)
System.out.println("您此次抛的是正面");
else
System.out.println("您此次抛的是反面");
}
public static GameFactory factory=new GameFactory(){
@Override
public Game getGame(){
return new ThrowCoin();
}
};
}
class ThrowDice implements Game{ //掷骰子
private Random rand=new Random();
public void play(){
switch(rand.nextInt(6)+1){
case 1:
System.out.println("您掷的是1");
break;
case 2:
System.out.println("您掷的是2");
break;
case 3:
System.out.println("您掷的是3");
break;
case 4:
System.out.println("您掷的是4");
break;
case 5:
System.out.println("您掷的是5");
break;
case 6:
System.out.println("您掷的是6");
break;
}
}
public static GameFactory factory=new GameFactory(){
@Override
public Game getGame(){
return new ThrowDice();
}
};
}