【Java】之繼承總結
1.靜態和非靜態的區別。說一下記憶體。
靜態:用static修飾的成員變數,被所有例項化的物件共享其值;
記憶體:
靜態成員變數存放的地址在方法區的常量池中,其中方法區、堆的值會被共享,其生命週期隨著類的載入完而結束
非靜態的成員變數地址在堆中,因為它是例項化物件的一部分。
註解下所有的區域性引用地址都存放在棧中。
2.成員變數和靜態變數的區別?
一般來講我們說靜態變數屬於類,而成員變數屬於例項化物件中的
靜態的變數可以稱為靜態的成員變數,只不過這個屬性的值在例項化物件之前已經初始化了,其值被所有的例項化物件共享。
3.靜態的特點以及注意事項?
修飾變數:其靜態變數,被所有例項化的物件共享
修飾方法:方法本來存放的地址就在方法區,加了靜態static修飾之後再記憶體中的地址是沒有變化的,唯一的一個區別是,非 的方法需要通過關鍵字new來例項化物件,開闢一個單獨的記憶體空間。而靜態的方法需要呼叫方法的時候只需要通過類名和點的方式進行獲取引用即可。
注意事項:
1、在成員變數中氾濫成災的用靜態的,就會導致例項化物件的時候所有的屬性的值都是共享的,就不會存在面向物件的思想了,同時其生命週期過長
2、static的值不容易控制。
3、過多的使用靜態會導致在載入類的時候對記憶體造成很大的壓力。
4.什麼時候使用靜態?
類的例項化成員有一個單一固定值的屬性,這時候需要使用靜態
為了在執行載入優化記憶體時
5.繼承的好處?
1、描述類與類之間的關係
2、降低類與類之間的重複程式碼
3、降低物件與物件之間的程式碼重複使用靜態變數
6.java改良多繼承的原因?
java的面向物件本質是多型,能更好的基於父類的基礎進行更好的拓展,減少類與類之間的重複程式碼
7.當使用一個已存在的繼承體系時,該如何更快應用
使用super呼叫基類中的特性
使用this呼叫本類中的屬性
8.什麼時候用繼承?
當 A is a B或者A has a B的時候用
9.super和this的特點?
相同點:
只能放在構造器的第一行
不能同時使用super()、this()
不同點:
this指的是當前的類
super指的是呼叫父類的特性
super.para 訪問的是子類從超類繼承過來的屬性
this.para 訪問的是子類中自己定義的同名屬性
super.func()..訪問的是父類的方法
super() 訪問的是父類的建構函式
10.覆蓋的特點,何時應用,注意事項?
覆蓋在java中的術語是重寫
這裡說明下,在沒有顯示支出繼承的狀態下,預設都是繼承的Object類
1、當繼承了一個父類,其父類的方法無法滿足子類需要時
2、繼承一個抽象類,必須重寫抽象類中的方法
3、但實現一個介面,必須重寫介面中發方法
注意:
重寫方法:方法名必須一致
必須保證引數型別,引數個數和返回型別
(備註下當返回型別是物件型別是,重寫方法返回型別可以是物件的子類型別)
11.子類的例項化過程?為什麼是這樣的例項化過程?
子類例項化的過程是:
基類先例項化,再例項化父類,其次基類(這裡舉例繼承三層,如有更多的繼承就是從基類開始一直例項化到子類)
從兩個方面來闡述說明:
反面:如果先執行子類的例項化會出現的問題是,程式找不到你呼叫的父類所有特性。
正面:在例項化的時候基類不清楚子類的任何資訊,任何需要他完成的初始化是與子類分離的,而且他可能是完成子類初始化的先決條件,因此它必須最先執行。
12.super語句,和this語句為什麼不能同時存在,super為什麼要定義在第一行?
首先這是java裡是這樣規定的,其順序為基類一直到到預設的object類
從執行的順序來分析:
super()如果子類中沒有指定任何一個建構函式,那麼程式會自動建立一個無參的建構函式,其建構函式裡第一行會預設加上super(),因為超類無法得知出子類需要自己初始化哪些值。
this(),呼叫本類的建構函式,最終還是會先呼叫基類的建構函式。
super()和this()最終都會先呼叫基類的建構函式,如果在初始化子類的時候連續兩次執行基類的建構函式不安全
super()和this()之所以放在第一行就是為了確保基類知道子類要初始化哪些特性。
13.abstract 與其他修飾符的關係:
final與abstract不能共存
abstract修飾類就是用來被繼承的,修飾方法方法就是用來被重寫的
final:修飾類代表不可以被繼承,不可以被重寫
static與abstract不能共存
static:static修飾的方法可以被類名呼叫
abstract:對於abstract修飾的方法沒有具體的實現方法,所以不能直接呼叫
private與abstract不能共存
private修飾的只能在本類使用
abstract方法是用來被子類進行重寫的