Java中各個重要定義
繼承
子類可以繼承父類的所有方法和屬性(包括“私有的”,不管是否是final); 但是子類 不能直接調用 父類的私有方法和屬性。 通過反射,子類可以調用父類的私有方法和屬性。final
1. 數據
聲明數據為常量,可以是編譯時常量,也可以是在運行時被初始化後不能被改變的常量。
- 對於基本類型,final 使數值不變;
- 對於引用類型,final 使引用不變,也就不能引用其它對象,但是被引用的對象本身是可以修改的。
final int x = 1; x = 2; // cannot assign value to final variable ‘x‘final A y = new A(); y.a = 1;
2. 方法
聲明方法不能被子類覆蓋。
3. 類
聲明類不允許被繼承。
重載(overload)和重寫(override)
方法重寫的前提: 必須要存在繼承的關系。
方法的重寫: 子父類出了同名的函數,這個我們就稱作為方法的重寫。
什麽是時候要使用方法的重寫:父類的功能無法滿足子類的需求時。
重寫(覆蓋)的規則:
1、重寫方法的參數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是重載.
2、重寫方法的訪問修飾符一定要大於被重寫方法的訪問修飾符(public>protected>default>private)。
3、重寫的方法,子類的返回值類型必須要小於或者 等於父類的返回值類型;
4、重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致,或者是其子類;
5、被重寫的方法不能為private,否則在其子類中只是新定義了一個方法(此時也可能叫重載?),並沒有對其進行重寫;
6、靜態方法不能被重寫為非靜態的方法(會編譯出錯);
7、父類方法被final時,無論該方法被public、protected及默認所修飾,子類均不能重寫該方法。
方法的重載:在一個類中 存在兩個或者兩個 以上的同名函數,稱作為方法重載。
重載的規則:
1、在使用重載時一般是只能相同的方法名、不同的參數形式實現。不同的參數類型可以是不同的參數類型,個數,或者是順序;
也有特例是通過返回值區分,但是這種方法不是百分之百可以,例如
void f() {} int f() { return 1; } // 在int x =f()中,確實可以區分重載方法,但是直接使用f()則不行
所以我們只說區分方法重載只能是相同方法名,不同參數形式來實現。
2、不能通過訪問權限、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響。
super
代表父類對應的對象,所以用super訪問在子類中無法直接使用的父類成員和方法,不僅僅是用來調用父類的構造函數
多態
概念:向上轉型和目的是,和向下轉型和目的
前期綁定(面向過程只有前期綁定)和後期綁定(動態綁定,運行時綁定)
以下不具有多態性:
1.子類覆蓋父類的private方法
2.子類和父類具有相同名字的成員變量(具有名字的域),某個域的訪問是在編譯期進行,而任何域訪問操作都是將由編譯器解析,此時子類和父類相同名字的域實質上是兩個不同的儲存空間,所以此時子類對象轉型為父類引用時候不是多態性(實際上很少發現,因為通常父類的成員都是private,只能通過調用方法來訪問)
3.某個父類方法是靜態的,不具有多態性、
構造器和多態:構造器不具備多態性,因為實際上是static方法,此聲明是隱式的
在繼承中代碼的執行順序為:1.父類靜態對象,父類靜態代碼塊 2.子類靜態對象,子類靜態代碼塊 3.父類非靜態對象,父類非靜態代碼塊 4.父類構造函數 5.子類非靜態對象,子類非靜態代碼塊 6.子類構造函數自動拆裝箱
出處:https://www.nowcoder.com/questionTerminal/643b145a860f457d8a150869e1a17eba
自動拆裝箱JDK需在1.5上
1、基本型和基本型封裝型進行“==”運算符的比較,基本型封裝型將會自動拆箱變為基本型後再進行比較,因此Integer(0)會自動拆箱為int類型再進行比較,顯然返回true;
2、兩個Integer類型進行“==”比較,如果其值在-128至127,那麽返回true,否則返回false,
這跟Integer.valueOf()的緩沖對象有關,當然如果此時是new的一個對象如:Integer a=new Integer(1)和Integer b=new Integer(1),a==b返回的是false,因為堆中指向不同的地址值。
3、兩個基本型的封裝型進行equals()比較,首先equals()會比較類型,如果類型相同,則繼續比較值,如果值也相同,返回true
4、基本型封裝類型調用equals(),但是參數是基本類型,這時候,先會進行自動裝箱,基本型轉換為其封裝類型,再進行3中的比較。
int a=257; Integer b=257; Integer c=257; Integer b2=57; Integer c2=57; System.out.println(a==b);//true //System.out.println(a.equals(b)); 編譯出錯,基本型不能調用equals() System.out.println(b.equals(257.0));//false,先257.0進行封裝,再進行3的比較 System.out.println(b==c);//false System.out.println(b2==c2);//true
Java中各個重要定義