Java基礎知識(二)

L.Error發表於2020-11-27

Java 語法

字元型常量和字串常量的區別?

  1. 形式上: 字元常量是單引號引起的一個字元; 字串常量是雙引號引起的0個或若干個字元
  2. 含義上: 字元常量相當於一個整型值( ASCII 值),可以參加表示式運算; 字串常量代表一個地址值(該字串在記憶體中存放位置)
  3. 佔記憶體大小 字元常量只佔 2 個位元組; 字串常量佔若干個位元組 (注意: char 在 Java 中佔兩個位元組),字元封裝類 Character 有一個成員常量 Character.SIZE 值為16,單位是bits,該值除以8(1byte=8bits)後就可以得到2個位元組
    在這裡插入圖片描述
    關於註釋?
  4. 單行註釋
  5. 多行註釋
  6. 文件註釋。

在我們編寫程式碼的時候,如果程式碼量比較少,我們自己或者團隊其他成員還可以很輕易地看懂程式碼,但是當專案結構一旦複雜起來,我們就需要用到註釋了。註釋並不會執行(編譯器在編譯程式碼之前會把程式碼中的所有註釋抹掉,位元組碼中不保留註釋),是我們程式設計師寫給自己看的,註釋是你的程式碼說明書,能夠幫助看程式碼的人快速地理清程式碼之間的邏輯關係。因此,在寫程式的時候隨手加上註釋是一個非常好的習慣。

程式碼的註釋不是越詳細越好。實際上好的程式碼本身就是註釋,我們要儘量規範和美化自己的程式碼來減少不必要的註釋。
若程式語言足夠有表達力,就不需要註釋,儘量通過程式碼來闡述。
舉個例子:
去掉下面複雜的註釋,只需要建立一個與註釋所言同一事物的函式即可
// check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
應替換為
if (employee.isEligibleForFullBenefits())

識別符號和關鍵字的區別是什麼?

在我們編寫程式的時候,需要大量地為程式、類、變數、方法等取名字,於是就有了識別符號,簡單來說,識別符號就是一個名字。但是有一些識別符號,Java 語言已經賦予了其特殊的含義,只能用於特定的地方,這種特殊的識別符號就是關鍵字。因此,關鍵字是被賦予特殊含義的識別符號。比如,在我們的日常生活中 ,“警察局”這個名字已經被賦予了特殊的含義,所以如果你開一家店,店的名字不能叫“警察局”,“警察局”就是我們日常生活中的關鍵字。

Java中有哪些常見的關鍵字?

訪問控制privateprotectedpublic
類,方法和變數修飾符abstractclassextendsfinalimplementsinterfacenative
newstaticstrictfpsynchronizedtransientvolatile
程式控制breakcontinuereturndowhileifelse
forinstanceofswitchcasedefault
錯誤處理trycatchthrowthrowsfinally
包相關importpackage
基本型別booleanbytechardouble floatintlong
shortnulltruefalse
變數引用superthisvoid
保留字gotoconst

自增自減運算子
在寫程式碼的過程中,常見的一種情況是需要某個整數型別變數增加 1 或減少 1,Java 提供了一種特殊的運算子,用於這種表示式,叫做自增運算子(++)和自減運算子(–)。

++和–運算子可以放在變數之前,也可以放在變數之後,當運算子放在變數之前時(字首),先自增/減,再賦值;當運算子放在變數之後時(字尾),先賦值,再自增/減。例如,當 b = ++a 時,先自增(自己增加 1),再賦值(賦值給 b);當 b = a++ 時,先賦值(賦值給 b),再自增(自己增加 1)。也就是,++a 輸出的是 a+1 的值,a++輸出的是 a 值。用一句口訣就是:“符號在前就先加/減,符號在後就後加/減”。

continue、break、和return的區別是什麼?
在迴圈結構中,當迴圈條件不滿足或者迴圈次數達到要求時,迴圈會正常結束。但是,有時候可能需要在迴圈的過程中,當發生了某種條件之後 ,提前終止迴圈,這就需要用到下面幾個關鍵詞:

  1. continue :指跳出當前的這一次迴圈,繼續下一次迴圈。
  2. break :指跳出整個迴圈體,繼續執行迴圈下面的語句。

return 用於跳出所在方法,結束該方法的執行。return 一般有兩種用法:

  1. return; :直接使用 return 結束方法執行,用於沒有返回值函式的方法
  2. return value; :return 一個特定值,用於有返回值函式的方法

Java泛型瞭解麼?什麼是型別擦除?介紹一下常用的萬用字元?
Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時型別安全檢測機制,該機制允許程式設計師在編譯時檢測到非法的型別。泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。
Java的泛型是偽泛型,這是因為Java在編譯期間,所有的泛型資訊都會被擦掉,這也就是通常所說型別擦除 。更多關於型別擦除的問題,可以檢視這篇文章:《Java泛型型別擦除以及型別擦除帶來的問題》

List<Integer> list = new ArrayList<>();

list.add(12);
//這裡直接新增會報錯
list.add("a");
Class<? extends List> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add", Object.class);
//但是通過反射新增,是可以的
add.invoke(list, "kl");

System.out.println(list)

泛型一般有三種使用方式:泛型類、泛型介面、泛型方法。
1.泛型類:

//此處T可以隨便寫為任意標識,常見的如T、E、K、V等形式的引數常用於表示泛型
//在例項化泛型類時,必須指定T的具體型別
public class Generic<T>{ 
   
    private T key;

    public Generic(T key) { 
        this.key = key;
    }

    public T getKey(){ 
        return key;
    }
}

如何例項化泛型類:

Generic<Integer> genericInteger = new Generic<Integer>(123456);

2.泛型介面 :

public interface Generator<T> {
    public T method();
}

實現泛型介面,不指定型別:

class GeneratorImpl<T> implements Generator<T>{
    @Override
    public T method() {
        return null;
    }
}

實現泛型介面,指定型別:

class GeneratorImpl<T> implements Generator<String>{
    @Override
    public String method() {
        return "hello";
    }
}

使用:

// 建立不同型別陣列: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3 };
String[] stringArray = { "Hello", "World" };
printArray( intArray  ); 
printArray( stringArray  );

常用的萬用字元為: T,E,K,V,?

==和equals的區別
== : 它的作用是判斷兩個物件的地址是不是相等。即判斷兩個物件是不是同一個物件。(基本資料型別==比較的是值,引用資料型別==比較的是記憶體地址)

因為 Java 只有值傳遞,所以,對於 ==
來說,不管是比較基本資料型別,還是引用資料型別的變數,其本質比較的都是值,只是引用型別變數存的值是物件的地址。

equals() : 它的作用也是判斷兩個物件是否相等,它不能用於比較基本資料型別的變數。equals()方法存在於Object類中,而Object類是所有類的直接或間接父類。

Objectequals()方法:

  • 情況 1:類沒有覆蓋 equals()方法。則通過 equals()比較該類的兩個物件時,等價於通過“==”比較這兩個物件。使用的預設是 Objectequals()方法。
  • 情況 2:類覆蓋了 equals()方法。一般,我們都覆蓋 equals()方法來兩個物件的內容相等;若它們的內容相等,則返回 true(即,認為這兩個物件相等)。

舉個例子:

 public class test1 {
    public static void main(String[] args) {
        String a = new String("ab"); // a 為一個引用
        String b = new String("ab"); // b為另一個引用,物件的內容一樣
        String aa = "ab"; // 放在常量池中
        String bb = "ab"; // 從常量池中查詢
        if (aa == bb) // true
            System.out.println("aa==bb");
        if (a == b) // false,非同一物件
            System.out.println("a==b");
        if (a.equals(b)) // true
            System.out.println("aEQb");
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}

說明:

  • String 中的 equals 方法是被重寫過的,因為 Objectequals 方法是比較的物件的記憶體地址,而 Stringequals 方法比較的是物件的值。
  • 當建立 String 型別的物件時,虛擬機器會在常量池中查詢有沒有已經存在的值和要建立的值相同的物件,如果有就把它賦給當前引用。如果沒有就在常量池中重新建立一個 String 物件。

Stringequals()方法:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

相關文章