1. 程式人生 > 實用技巧 >javaSE小知識點

javaSE小知識點

javaSE小知識點

var關鍵字

var sb = new StringBuilder();//自動推斷sb的型別

多行字串

public class Main {
public static void main(String[] args) {
String s = """ //java13
SELECT * FROM
users
WHERE id > 100
ORDER BY name DESC
""";
System.out.println(s);
}

輸出不換行

package com.bi;

public class Main {
public static void main(String[] args) {
System.out.print("A,");
System.out.print("B,");
System.out.print("C.\teee\n");\\不換行
}
}

格式化輸出

public class Main {
public static void main(String[] args) {
double d = 3.1415926;
System.out.printf("%.2f\n", d); // 顯示兩位小數3.14
System.out.printf("%.4f\n", d); // 顯示4位小數3.1416
}
}

輸入

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 建立Scanner物件
System.out.print("Input your name: "); // 列印提示
String name = scanner.nextLine(); // 讀取一行輸入並獲取字串
System.out.print("Input your age: "); // 列印提示
int age = scanner.nextInt(); // 讀取一行輸入並獲取整數
System.out.printf("Hi, %s, you are %d\n", name, age); // 格式化輸出
}
}

判斷引用型別是否相等

判斷值型別的變數是否相等,可以使用==運算子。但是,判斷引用型別的變數是否相等,==表示引用是否相等,或者說,是否指向同一個物件。要判斷引用型別的變數內容是否相等,必須使用equals()方法。


switch

  • java12增加表示式

public class Main {
public static void main(String[] args) {
String fruit = "apple";
switch (fruit) {
case "apple" -> System.out.println("Selected apple");
case "pear" -> System.out.println("Selected pear");
case "mango" -> {
System.out.println("Selected mango");
System.out.println("Good choice!");
}
default -> System.out.println("No fruit selected");
}
}
}
  • 利用switch表示式會返回值給變數賦值

public class Main {
public static void main(String[] args) {
String fruit = "apple";
int opt = switch (fruit) {
case "apple" -> 1;
case "pear", "mango" -> 2;
default -> 0;
}; // 注意賦值語句要以;結束
System.out.println("opt = " + opt);
}
}
  • 如果需要複雜的語句,我們也可以寫很多語句,放到{...}裡,然後,用yield返回一個值作為switch語句的返回值:

public class Main {
public static void main(String[] args) {
String fruit = "orange";
int opt = switch (fruit) {
case "apple" -> 1;
case "pear", "mango" -> 2;
default -> {
int code = fruit.hashCode();
yield code; // switch語句返回值
}
};
System.out.println("opt = " + opt);
}
}
  • switch的計算結果必須是整型、字串或列舉型別;


變數應該把訪問範圍縮到最小的原則。


for each迴圈

for each迴圈能夠遍歷所有可迭代的資料型別,如List,陣列、Map等。無法拿到索引

public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 4, 9, 16, 25 };
        for (int n : ns) {
            System.out.println(n);
        }
    }
}

陣列列印、排序

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 1, 2, 3, 5, 8 };
        System.out.println(Arrays.toString(ns));
    }
}

可變引數

class Group {
    private String[] names;

    public void setNames(String... names) {//傳空可以,無法傳null
        this.names = names;
    }
}

呼叫時:

Group g = new Group();
g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 傳入3個String
g.setNames("Xiao Ming", "Xiao Hong"); // 傳入2個String
g.setNames("Xiao Ming"); // 傳入1個String
g.setNames(); // 傳入0個String

構造方法

  • 沒有在構造方法中初始化欄位時,引用型別的欄位預設是null,數值型別的欄位用預設值,int和boolean的預設值分別是0、false

  • 建立物件例項時,按照如下順序: 1. 先初始化欄位,例如,int age = 10;表示欄位初始化為10double salary;表示欄位預設初始化為0String name;表示引用型別欄位預設初始化為null 2. 執行構造方法的程式碼進行初始化。

  • 多構造方法,一個構造方法可以複用其他構造方法,通過this關鍵字。

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(String name) {
        this(name, 18); // 呼叫另一個構造方法Person(String, int)
    }

    public Person() {
        this("Unnamed"); // 呼叫另一個構造方法Person(String)
    }
}

super

  • 子類引用父類的欄位時,可以用super.fieldName

  • 任何class的構造方法,第一行語句必須是呼叫父類的構造方法。如果沒有明確地呼叫父類的構造方法,編譯器會幫我們自動加一句super();


final

  • 只要某個class沒有final修飾符,那麼任何類都可以從該class繼承即不允許子類繼承。

  • 如果一個父類不允許子類對它的某個方法進行覆寫,可以把該方法標記為final。用final修飾的方法不能被Override

  • 被final修飾的變數或引用不允許再賦值。

  • 對於一個類的例項欄位,同樣可以用final修飾。用final修飾的欄位在初始化後不能被修改。


轉型

  • 向上轉型:把一個子類型別安全地變為父類型別的賦值(upcasting),轉型後只能呼叫父類的方法,如果子類覆蓋了父類的方法,則呼叫子類的方法,對於只有子類才有的方法,通過父類的引用將無法呼叫。

  • 向下轉型:把一個父類型別強制轉型為子類型別,就是向下轉型(downcasting)。只用父類引用真實指向的是子類,才能向下轉型,否則會失敗,會報ClassCastException

  • instanceof操作符,可以先判斷一個例項究竟是不是某種型別。


多型

在繼承關係中,子類如果定義了一個與父類方法簽名完全相同的方法,被稱為覆寫(Override)。

Override和Overload不同的是,如果方法簽名如果不同,就是Overload,Overload方法是一個新方法;如果方法簽名相同,並且返回值也相同,就是Override

Java的例項方法呼叫是基於執行時的實際型別的動態呼叫,而非變數的宣告型別。

這個非常重要的特性在面向物件程式設計中稱之為多型。它的英文拼寫非常複雜:Polymorphic。

多型是指,針對某個型別的方法呼叫,其真正執行的方法取決於執行時期實際型別的方法。