1. 程式人生 > 其它 >從零開始學Java-Day09

從零開始學Java-Day09

靜態程式碼塊

執行順序:

​ 靜態程式碼塊 —> 構造程式碼塊 —>構造方法程式碼塊

隨著類的呼叫而執行

載入一些需要第一時間需要載入並且只能載入一次的資源

package cn.tedu.block;
//本類用來測試程式碼塊之間的關係
public class TestBlock {
    public static void main(String[] args) {
        Person person = new Person();
        person.run();
        System.out.println("==============");
        /*在建立物件之間會先自動呼叫靜態程式碼塊而且此靜態程式碼塊只執行一次
        * 每一次建立物件構造程式碼塊都會優先執行*/
        Person person1 = new Person();
        Girl girl = new Girl();
        System.out.println(girl.AGE);
    }
}

class Person{
    final String AGE = "永遠的18歲";
    /*
    靜態程式碼塊
        位置:類裡方法外
        觸發時機:靜態程式碼塊也是靜態資源隨著類的載入而載入,優先於物件載入
        作用:用於載入一些需要第一時間載入的資源
     */
    static {
        System.out.println("我是靜態程式碼塊");
    }
    {
        System.out.println("我是構造程式碼塊");
    }
    public Person(){
        System.out.println("我是一個無參構造方法");
    }
    public void run(){
        {
            System.out.println("我是區域性程式碼塊");
        }
        System.out.println("我是普通方法");
    }
}

class Girl extends Person{

}

final

  1. 被final修飾的類,不能被繼承
  2. 被final修飾的方法,不能被重寫
  3. 被final修飾的變數是個常量,值不能被改變
  4. 常量的定義形式:final 資料型別 常量名 = 值;
package cn.tedu.oppfinal;
//本類用作final的入門案例
public class TestFinal {
    public static void main(String[] args) {
        RiceHouse rh = new RiceHouse();
        //rh.oldFood();
//        rh.name = "specialWeek";
//        System.out.println(rh.name);
        rh.food();
    }
}
/*final表示最終,可以用來修飾類,被final修飾的類無法被繼承*/
class House{
    final String name = "riceShower";//被final修飾的變數無法被再次修改,定義的時候必須賦值
    public void food(){
        System.out.println("青草");
    }
}

final class RiceHouse extends House{
    @Override
    public void food(){
        System.out.println("胡蘿蔔");
    }
//    public void oldFood(){
//        super.food();
//    }
}

多型

多型最經典的用法之一:

​ try - catch 異常處理:

package cn.tedu.oop;
//本類用於多型的入門案例
public class TestDemo {
    public static void main(String[] args) {
        Books books = new Books();
        LoveBooks loveBooks = new LoveBooks();
        FantasticBooks fantasticBooks = new FantasticBooks();
        books.read();
        loveBooks.read();
        fantasticBooks.read();
        Books yellowBooks = new YellowBooks();
        /*
        * 多型的前提:
        *   1.繼承
        *   2.重寫
        * 無法呼叫沒被重寫的子類功能
        * 多型的出現是為了統一標準,向父類看齊
        * 只能使用父類宣告的功能(功能的表達形式如果在子類被重寫用子類的,如果沒有,用父類的),子類特有的功能無法使用*/
        yellowBooks.read();
        Books fb = new FantasticBooks();

    }
}

class Books{
    public void read(){
        System.out.println("讀書使我快樂");
    }
}

class LoveBooks extends Books{
//    public void read(){
//        System.out.println("讀愛情類的書使我想睡覺");
//    }
}

class FantasticBooks extends Books{
    public void read(){
        System.out.println("exciting!!");
    }
    public void value(){
        System.out.println("有價值");
    }
}

class YellowBooks extends Books{
    public void read(){
        System.out.println("Oh~~~~");
    }
}


package cn.tedu.oop;
//本類用於多型元素的測試
public class TestDemo2 {
    public static void main(String[] args) {
        LOL g1 = new LOL();
        System.out.println(g1.sum);//100
        g1.play();//重寫的方法
        g1.dead();//特有的方法
        System.out.println("=====================");
        Game game = new LOL();
        /*
        多型中成員變數的使用都是父類的
         */
        System.out.println(game.sum);//10
        /*
        多型中方法的宣告,看的是父類的,實現使用的時子類
         */
        game.play();
        /*
        建立父類中的靜態方法
        如果有同名的靜態方法使用的時父類的
         */
    }
}

class Game{
    int sum = 10;
    public static void play(){
        System.out.println("sa!開始我們的遊戲吧");
    }
    public static void start(){
        System.out.println("game要開始嗎");
    }
}

class LOL extends Game{
    int sum = 100;
    //@Override
    public static void play(){
        System.out.println("獵殺時刻到了!");
    }
    public void dead(){
        System.out.println("你已經陣亡!");
    }
}

class QQT extends Game{

}

異常

Throwable: 頂級父類

  • Error:系統錯誤,無法修復
  • Exception:可以修復的錯誤
    • RunTimeException
      • ClassCastException
      • ClassNotFoundException

package cn.tedu.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class ExceptionDemo {
    public static void main(String[] args) {
        //method1();
        //method2();
        //System.out.println(method3());
        //method4();
        f();//在main呼叫前處理異常
    }

    private static void f() throws InputMismatchException, ArithmeticException {
        try {
            method4();
        }catch (Exception e){
            System.out.println("請輸入正確的資料");
        }
    }

    /*
    異常丟擲的格式:在小括號與大括號之間寫:throws異常型別
    若果有多個異常,使用逗號隔開
     */
    private static void method4() {
        Scanner scan = new Scanner(System.in);
        System.out.println("輸入第一個整數");
        int num1 = scan.nextInt();
        System.out.println("輸入第二個個整數");
        int num2 = scan.nextInt();
        System.out.println(num1 + "/" + num2 + "=" +  num1 / num2);
        scan.close();
    }
    /*
    如果一個方法丟擲異常,誰呼叫這個方法,誰處理這個異常
    兩種方案:捕獲解決和繼續向上丟擲
    會在main()呼叫之前解決異常
     */
    private static int method3() {
        Scanner scan = new Scanner(System.in);
        System.out.println("輸入第一個整數");
        int num1 = scan.nextInt();
        System.out.println("輸入第二個個整數");
        int num2 = scan.nextInt();
        if (num2 == 0){
            ArithmeticException e = new ArithmeticException("除數不能為0");
            throw e;
        }
        scan.close();
        return num1 / num2;
    }

    private static void method2() {
        Scanner scan = new Scanner(System.in);
        try {
            System.out.println("輸入第一個整數");
            int num1 = scan.nextInt();
            System.out.println("輸入第二個個整數");
            int num2 = scan.nextInt();
            System.out.println(num1 + "/" + num2 + "=" +  num1 / num2);
        }catch (InputMismatchException e){
            System.out.println("只能輸入整數");
        }catch (ArithmeticException e){
            System.out.println("除數不能為0");
        }catch (Exception e){
            System.out.println("出錯了,請找管理員");
        }
        scan.close();
    }

    private static void method1() {
        Scanner scan = new Scanner(System.in);
        /*
        try中放著可能會出現錯誤的程式碼
        如果發生了異常會被catch捕獲,執行catch大括號中的解決方案
         */
        try {
            System.out.println("輸入第一個整數");
            int num1 = scan.nextInt();
            System.out.println("輸入第二個個整數");
            int num2 = scan.nextInt();
            try {
                System.out.println(num1 + "/" + num2 + "=" +  num1 / num2);
            }catch (Exception e){
                System.out.println("除數不能為0");
            }
        }catch (Exception e){
            System.out.println("請輸入整數");
        }
        scan.close();
    }
}