因為工作需要, 最近在準備1Z0-803考試, 考題有點刁阿,
感覺不是真的想考你會不會, 是想考你會不會考試,
準備了一個半月, 覺得程式沒有進步阿, 就是為了解題而解題. (純抱怨)
這邊記下可能會考的陷阱.
出題不外乎就這幾個地方容易有陷阱. 筆記一下.
希望大家能一次考過, 阿斯.
- 檢查陣列大小.
- 檢查傳值.
- 初始值,
int 的預設值為 0 .
boolean預設為 false.
char 預設為 "" (空白).
String 預設為 null , 做字串相處理會直接變成 "null".
Float 預設為 0.0
若這些屬性在main裡面, 沒有給定初始值, 會compile fails. - private 只有該物件可以使用.
- substring(0,x) x是指到尾數之前的整數.
- char 和int可以自動轉型. 例如
char a =97;
int b = 'a'; - 抽象類別和類別才可以繼承抽象類別.
- 抽象類別不能直接被叫用.
- interface必須被實作 implements 才可以使用. 否則就只是一個殼而已.
- arrarycopy
int [] array = {1,2,3,4,5}; int [] array2 = {6,7,8,9,10}; System.arraycopy(array, 2, array2, 1, 2);
執行後
array = {1,2,3,4,5}
array2 = {6,3,4,9,10} - if不適用 break
int a =0; int b =0; if(a==b){ System.out.println("1. "); }else{ break; }
答案會是compile false.
-
while(intA<= intB); ==> 無線迴圈
int intA=0; int intB=0; System.out.println("before while 1. "); while(intA!=intB); System.out.println("after while 1. "); int intC=0; int intD=0; System.out.println("before while 2. "); while(intC==intD); System.out.println("after while 2. ");
輸出會是
before while 1.
after while 1.
before while 2.
程式進入無限迴圈. -
substring(beginIndex, endIndex) 的指定值
String a="0123456789"; a=a.substring(1,10); System.out.println(a);
最後會輸出
123456789 -
繼承的overwrite方法必須有相同的型別
例如
abstract class Car { public void power(){ System.out.println("Power.."); }; abstract int move(); } public class abstractSample extends Car{ public static void main(String[] args){ abstractSample aa = new abstractSample(); aa.move(); } public int move() { System.out.println("坦克用履帶移動.."); return 1; } }
move() 方法回傳必須相同.
-
封裝 (encapsulated) 中 Fields 盡量設定成private, 異動的資料盡量設定單一入口.
例如class 中有個int a; 方法A 設定 就不要有其他方法修改了.
例如
class A { private int a=0; public class void setA(int x){ a=x; }; // 已經有setA了, 盡量別有其他地方異動 fields a, 單一入口. 下方註解拔掉. // public class void setA2(int x){ // a=x; // }; }
-
多選題會再問句裡告訴你要選幾個.
多選的選項打勾處為
方形
口 A) 答案A
口 B) 答案B
單選為圓形
O A) 答案A
O B) 答案B -
extends 繼承
class Animal{ public void move(){ System.out.println("移動"); } } class Tiger extends Animal{ Tiger(){ //super.move();//這行會造成Compile Fails, super()前面不能有東西 super(); //可以這樣叫用 super();建構子只能再建構子裡面被叫用. super.move();//可以這樣叫用 } public void skill(){ //super(); //這行會Compile Fails. super.move();//可以這樣叫用 System.out.println("狩獵"); } //宣告同名方法會Compile Fails., super() 方法不得複寫. //public void super(){ //} }
-
interface 可以被類別實作, 定義的方法都必須實作,
除非實作的對象為抽象類別,interface Y{ public void methodY(); } abstract class Z implements Y{ }
-
一個類別可以實作多組interface.
-
interface Y{ public void methodY(); } interface Y2{ public void methodY2(); } class Z implements Y,Y2{ public void methodY() { } @Override public void methodY2() { } }
就不會compile fail.
特別注意下, 硬類別不論繼承interface或者抽象類別, 其方法都必須實作.
否則會compile false.
-
interface 可以繼承interface
interface face1 { public int a = 60; public void funA(); public abstract void funB(); } interface face2 extends face1 { }
-
抽象類別繼承interface 或者繼承抽象類別的方法可以不用實作.
interface Y{ public void methodY(); } abstract class Z2 implements Y{ // public abstract void methodY(); }
也可宣告成抽象類別方法, 只給一個殼沒有內容這樣. (上方註解處.)
-
抽象類別才可以有抽象方法.
class FunA { abstract void funB(); //這行會壞去 Compile fails. }
-
宣告的順序必須先繼承再實作.
例如:
class A implements X extend Y{}
這樣就會coompile false.
正確寫法應該這樣才對.
class A extend Y{} implements X
(這樣考超沒意義, 但考題就是會這樣出.) -
SE 7 的switch (XXX){} 中條件可以使用String, int, Integer.
-
考題會故意在switch 中不放break;
讓執行序繼續跑下去.int level = 10; switch(level) { case 10: case 9: System.out.println("A"); case 8: System.out.println("B"); break; case 7: System.out.println("C"); break; case 6: System.out.println("D"); break; default: System.out.println("E"); }
執行結果會輸出
AB -
運算元的小遊戲
可以參考這篇public static void main(String[] args){ int i=0; int j=1; int k=0; k= i++; System.out.println("i="+i+", j="+j+", k="+k); k= j+=1; System.out.println("i="+i+", j="+j+", k="+k); k= (int) ((i+1.5) /j); // k= (i+1.5) /j; //這行會compile fails. // 出這種考題真的只是考你會不會考試, 對你的開發專案真的幫助有限. 抱怨again. }
輸出會是.
i=1, j=1, k=0
i=1, j=2, k=2
i=1, j=2, k=1
另外出一題int[] x = {6,7,8}; for(int xx:x){ xx++; System.out.print(xx+ " "); } System.out.println(" "); for(int xx:x){ System.out.print(xx+ " "); } System.out.println(" "); for(int xx:x){ System.out.print(xx+ " "); xx++; }
答案會是
7 8 9
6 7 8
6 7 8 -
int 和char 在JAVA裡可以互通,
C#就壞給你看了.
public static void main(String[] args){ int a = 'a'; char c=97; System.out.println("a="+a); System.out.println("c="+c); }
輸出會是
a=97
c=a
.. -
Error 會列出錯誤的地方, Exception只會拋出例外.
import java.lang.Exception; public class TestClass{ public static void main(String[] args){ TestClass t = new TestClass(); try{ t.doSomething(); }catch(Exception e){ System.out.println("Caught "+ e); } } public void doSomething() throws Exception{ throw new Error("Error"); } }
執行後會輸出錯誤結果
Exception in thread "main" java.lang.Error: Error
at TestClass.doSomething(TestClass.java:13)
at TestClass.main(TestClass.java:6)
import java.lang.Exception; public class TestClass{ public static void main(String[] args){ TestClass t = new TestClass(); try{ t.doSomething(); }catch(Exception e){ System.out.println("Caught "+ e); } } public void doSomething() throws Exception{ throw new Exception("Error"); } }
執行後僅輸出
Caught java.lang.Exception: Error -
try... catch 的順序
import java.io.IOException; import java.lang.Exception; public class TestClass{ public static void main(String[] args){ TestClass t = new TestClass(); try{ t.doSomething2(); t.doSomething1(); }catch(IOException e){ System.out.println("Caught "+ e); }catch(Exception e){ System.out.println("Caught "+ e); } } public void doSomething1() throws Exception{ throw new Exception("Error"); } public void doSomething2() throws IOException{ throw new IOException("Error"); } }
這個範例來看,
IOException 要在Exception之前, 不然會compile fails.
因為Exception是 IOException的父類別.