1. 程式人生 > >Java中各個重要定義

Java中各個重要定義

erl 靜態代碼塊 rri 訪問修飾符 terminal 實現 是否 代碼塊 地址

繼承

子類可以繼承父類的所有方法和屬性(包括“私有的”,不管是否是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中各個重要定義