抽象方法abstract 和 介面interface
直接進入正題
abstract可以解釋成“一定會有的東西”,所以只能繼承一次。
interface可以解釋成“附屬品”,可有可無,但有大量的東西都需要它,他就派上用場了。
舉實際的例子:武器
武器都一定有攻擊力、攻擊範圍、名字
這時候如果你需要大量的使用到武器,那上述說的『攻擊力、攻擊範圍、名字』這些東西就適合放在abstract。
但武器百百種,可能長槍會有紅櫻、刀和劍會有劍柄而且也可能會有紅櫻、長弓、短弓和十字弓會有弦。
這些東西就不是一定會存在武器內的東西,我們就可以使用interface
實作:
先把傷害、攻擊範圍、武器名稱寫成abstract
武器.java
abstract public class 武器 { abstract int damage(); abstract int range(); abstract String getName(); }這樣武器的基底,就出現了。
來製作武器吧
先來做一把霸王槍
霸王槍.java
public class 霸王槍 extends 武器 { @Override int damage() { return 200; } @Override int range() { return 80; } @Override String getName() { return getClass().getSimpleName(); } }
一把霸王槍就誕生了,他同時擁有了傷害、攻擊範圍、和名稱
再來創建一把青龍偃月刀配戴紅櫻
武器紅櫻.java
interface 紅纓 { int 裝配紅櫻(); }
然後是青龍偃月刀.java
public class 青龍偃月刀 extends 武器 implements 紅櫻 { @Override public int damage() { return 250; } @Override protected int range() { return 90; } @Override protected String getName() { return getClass().getSimpleName(); } @Override public String 紅櫻樣式() { return "大花樣,關羽專用"; } }
這樣就區分了青龍偃月刀和霸王槍之間的差別。
再來
每把長槍,希望青龍偃月刀比較不同,那就給他一個顏色吧
武器顏色.java
public interface 武器配色 { String 顏色(); }
在改動青龍偃月刀
public class 青龍偃月刀 extends 武器 implements 紅櫻,武器配色 { @Override public int damage() { return 250; } @Override protected int range() { return 90; } @Override protected String getName() { return getClass().getSimpleName(); } @Override public String 紅櫻樣式() { return "大花樣,關羽專用"; } @Override public String 顏色() { return "青龍色"; } }
有注意到了嗎?
武器的是每一把、每一種武器都能套用的,但介面的部分可以一直增加。
此時我在創造一把武器,干將劍
我要有刀柄和紅櫻
干將劍.java
public class 干將劍 extends 武器 implements 武器刀柄,紅櫻{ @Override public int damage() { return 170; } @Override protected int range() { return 10; } @Override protected String getName() { return getClass().getSimpleName(); } @Override public int 刀柄長度() { return 5; } @Override public String 紅櫻樣式() { return "春秋古代款"; } }
一把佩戴紅纓的春秋款干將就誕生了
大致上abstract 和 interface的用法就是這樣
在寫個人使用他們吧:
我招喚出
張無忌.java
public class 張無忌 { private 武器 weapon; public void attack() { if (weapon == null) { System.out.println("張無忌空手,使用拳頭,造成敵人十點傷害"); return; } System.out.println("張無忌使用 " + weapon.getName() + ",造成敵人" + weapon.damage() + "傷害"); } public void 換武器(武器 weapon) { this.weapon = weapon; } }
之後再MainActivity.java內來操作。
MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 張無忌 person = new 張無忌(); person.attack(); 武器 weapon = new 干將劍(); person.換武器(weapon); person.attack(); } }