自学java 第十章内部类(二)
今天主要學習了匿名內部類。
匿名內部類是一種特殊的內部類,它沒有類名,是通過繼承一個類或實現一個接口來創建的,匿名內部類相當于基類的一個導出類,不過它只能通過向上轉型為基類類型后才能被使用。
匿名內部類主要用于對繼承方法進行實現或覆蓋,它不需要添加其它的方法,即使添加也無法使用(因為它沒有類名,只能通過向上轉型使用,且無法向下轉型,因此添加的其它方法也就無法訪問)。
匿名內部類如果想使用外部定義的對象,則編譯器要求參數引用必須是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();
}
};
}
轉載于:https://www.cnblogs.com/grj0011/p/4845351.html
總結
以上是生活随笔為你收集整理的自学java 第十章内部类(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20145328 《Java程序设计》第
- 下一篇: iOS 开发中的各种证书