一些基礎的問題

標識符

由字母數字下劃線$符號組成,但是不能以數字開頭

關鍵字

從來沒有用到的關鍵字:goto, const
jdk1.4 assert jdk1.5 enum

接口和抽象類的區別

1.從構造器來看:抽象類允許有構造方法,而接口不允許有構造方法。兩者均不能被實例化,但是抽象類可以被聲明
2.從成員變量來看:抽象類允許有普通的成員變量,而接口不允許有普通的成員變量,必須被public static final 修飾 即常量
3.從方法來看:抽象類中可以有靜態方法和普通方法,而接口中必須是抽象方法,默認是 public abstract (abstract 可以省略),抽象類的方法可以被public .protect.private修飾,接口中的方法必須被public修飾
4.從繼承關係來看:一個類只能實現一個抽象類,一個類可以實現多個接口。
5.應用場景:抽象類大多用於重構,而接口用於解耦。

繼承

子類繼承父類的所有屬性包括私有屬性,只不過父類的私有屬性被隱式繼承,子類不能直接使用但是可以間接的調用。
子類默認繼承父類的無參構造,在調用自己的構造時先調用父類的構造方法,此時寫不寫super()都可以。當父類沒有無參構造必須使用super()調用父類的有參構造。

代碼塊執行順序問題

靜態代碼塊>mian方法>構造代碼塊>構造方法
普通代碼塊:在方法或者語句中定義的代碼塊
構造代碼塊:直接定義在類中沒有static修飾的代碼塊。構造代碼塊在創建對象時被調用,每次創建對象都會被調用,並且構造代碼塊的執行次序優先於類構造函數。
靜態代碼塊: static修飾的代碼塊。隨着類的加載而被執行。並且只執行一次。

重載和重寫(覆寫)

重載:發生在同一個類中,是一個類中多態的表現。方法名相同,參數必須不同,返回類型可以不同。可以有不同的修飾符,可以拋出不同的異常。
重寫(overload):發生在繼承中,方法名,參數類型,返回值都必須相同。修飾符要大於等於被重寫的方法。重寫的方法不能拋出比被重寫的方法更寬泛的異常或者新的異常。

final ,fianlly,finalize

final:被fianl修飾的類不能被繼承,所以不能修飾抽象類。被fianl修飾的方法不能被重寫。被final修飾的變量一旦初始化不能被更改即常量final修飾的引用數據類型引用不可變內容可以改變
finaly :在異常處理的時候提供一個fianly塊來執行任何的清除操作。一定被執行的語句,通常用來釋放資源。
finalize 方法名 Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。

枚舉:

enum 關鍵字定義枚舉,代替了多例
使用enum關鍵字定義枚舉默認繼承Enum抽象類。Enum類的構造是protect修飾的。依然相當於封裝

關於表達式數據類型提升的問題

1.在計算的時候byte,short,char型的值將會被提升爲int類型
2.如果有一個操作數是long類型,那麼結果是long類型
3.如果有一個操作數是float類型,那麼結果是long類型
4.如果有一個操作數是double類型,那麼結果是double類型
5.被final修飾的變量在編譯時期就被確定,是常量

public class Test {
    static byte b1=1,b2=2,b3,b6;
    static final byte b4=4,b5=6;


    public static void main(String[] args) {
        b6=b4+b5;
        b3=(byte) (b1+b2);
        System.out.println(b3+b6); 
    }

}
//b4和b5被final修飾是常量,b6在編譯期就已經爲10,b1+b2運算的時候被提升爲int ,所以要強制類型轉換

關於Integer的自動拆裝箱問題

public class Test {
    static Integer i1=59;
    static int i2=59;
    static Integer i3= Integer.valueOf(59);
    static Integer i4= new Integer(59);
    static Integer i5 = Integer.valueOf(128);
    static Integer i6 = Integer.valueOf(128);


    public static void main(String[] args) {
        System.out.println(i1==i2);
        System.out.println(i1==i3);
        System.out.println(i3==i4);
        System.out.println(i2==i4);
        System.out.println(i5==i6);

    }

}

/*輸出依次爲
true: i1 自動拆箱爲int類型,基本數據類型比較值爲true
true: 
public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
i1和i3 的數值在-128~127之間,自動裝箱之後指向同一個對象返回true
false:兩個不同的對象,比較的是地址false
true:i5自動拆箱爲int類型,基本數據類型比較值爲true
false:i5,i6不在-128~127之間,返回不同的對象,false*/

運算符的優先級

算數運算符>移位運算符>關係運算符>位運算符(& | ^ ~)>邏輯運算符(&& ||)>
三目運算符

發佈了57 篇原創文章 · 獲贊 29 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章