show code block

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...