抽象方法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();
}
}

