show code block

顯示具有 Java基礎 標籤的文章。 顯示所有文章
顯示具有 Java基礎 標籤的文章。 顯示所有文章

2018年11月14日 星期三

Java基礎:抽象abstract 和 介面interface




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

}





2017年8月16日 星期三

Java基礎 — 猛虎出柙雙劍合璧版

前言:

Android寫久了,你會發現雖然自己在用java寫Android,但是會Android不代表會Java。

所以我找了猛虎出柙雙劍合璧版來拜讀。

還沒買,網路上的電子書有試讀版的,大改只給你試讀187頁。

我還沒買正式版,看完試讀版後整理一些我之前忽略的Java基礎。

https://play.google.com/store/books/details?id=EElBCgAAQBAJ

上面是連結,有興趣可以看看他的試讀版內容。




 正文開始:


1、&和&&差別

同樣都是 AND 但差別在哪呢?
用一個陣列和if判斷式做簡單說明
ArrayList<String> arrayTest = null;

if(ArrayTest != null && ArrayTest.size() == 1){
}
if(ArrayTest != null & ArrayTest.size() == 1){
}

做個很簡單的判斷,其實公用一樣,差別就在於&如果第一個為false,他還是會往下一個做判斷。
&&如果第一個是false,就直接離開if判斷式了
把上面的例子開程式去跑,if判斷式使用&會崩潰,因為根本是null判斷不了。
&&很順利地跑完判斷式。


2、for迴圈的命名斷點
label_name:

label_outLoop:
for (int i = 0; i < 10; i++) {
    label_InnerLoop:
    for (int j = 0; j < 7; j++) {
        if (j == 5)
            break label_outLoop;
    }
}
 
可做到goto的效果

3、for-each的用法
假設你有個陣列內有很多String,這時候我們可以使用for-each把它全部列出來
for-each

ArrayList<String> TestList = new ArrayList<>();
TestList.add("hello1");
TestList.add("hello2");
TestList.add("hello3");
TestList.add("hello4");
for (String string : TestList) {
    System.out.println(string);
}

 
for(要顯示的單體string : 要顯示的陣列)

此時看Log就會很漂亮的全部顯示出來。

4、方法內變數int...用法
我們要先了解方法超載overloading這件事情
有時候我們會需要使用到同個名稱,但方法參數有變。
ex:
public void calc(int a){...}
public void calc(int a, int b){...}
 
如果要寫很多這種的就很累人。
所以可以用int...的方式代表很多參數,這時候就可以取用這些參數做事。
如下例子:

public int newCalc(int... c) {
   int sum = 0;
   for (int i : c) {
       sum += i;
   }
   return sum;
}

 
這就變成一個加法計算的方法。
System.out.println("加總:”+newCalc(5,5,10,8)); //加總:28

5、繼承的一些技巧

class Animal {
    public void move() {
        System.out.println("animal move...");
    }
}

class Cat extends Animal {
    @Override
    public void move() {
        System.out.println("cat小貓跳動!!!");
    }

    public void skill() {
        System.out.println("cat小貓亂抓!!!");
    }
}

class Bird extends Animal {
    public void move() {
        System.out.println("鳥拳跳動!!!");
    }
}

class Tiger extends Cat {
    public void skill() {
        System.out.println("狩獵!!!");
    }
}
 
看看圖片有助於幫助了解這邊在幹嘛
這時候

Tiger tiger = new Tiger(); //這行我們稱做用Tiger的觀點來看Tiger
Cat tiger=new Tiger();//用貓科動物的觀點來看Tiger
Animal tiger=new Tiger();//用動物的觀點來看Tiger

Animal tiger = new Tiger();
((Bird) tiger).move();

 
編譯是可以過的,但是會Crash
利用Bird的觀點來操作new Tiger();的實體基本上是不合邏輯的,但卻可以過關,因為Bird和Tiger都同為Animal的子類別。
此時可以使用instanceof來做判斷

if(tiger instanceof Bird){
((Bird) tiger).move();
}else{
Log.d(“checkpoint”,"根本不是Bird!!");
}
 



後記


然後....

就沒有然後了。

如果我有買這本書在做分享。

協程(coroutine) - 協程為什麼要學它?

 Coroutine 協程 再強調一次 協程就是由kotlin官方所提供的線程api //Thread Thread { }.start() //Executor val execu...