[JAVA] 1Z0-803 考試準備心得

因為工作需要, 最近在準備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的父類別.