面向對象(繼承,多態)
二維數組的定義格式:
第一種:直接給定了每一個一維數組中數組長度
數據類型[][] 數組名稱 = new 數據類型[m][n]
第二種:給定了多少個一維數組,長度動態給定
數據類型[][] 數組名稱 = new 數據類型[m][] ;
第三種:二維數組中直接給定元素值
數據類型[][] 數組名稱 = {{元素1,元素2},{元素1,元素2}…}
如何遍歷二維數組
int [][] arr = {{11,22},{33,44},{55,66}} ;
外層循環:控制的是二維數組長度,內存循環,一維數組長度
代碼塊
在Java中,{}括起來,統稱為代碼塊
構造代碼塊:在每次執行構造方法之前,優先執行構造代碼塊
優先級:靜態代碼塊>構造代碼塊>構造方法
MYSQL數據庫.. JDBC(Java連接數據庫)
繼承
class Zi extends Fu{…}
A. 繼承的好處:
1)提高代碼的復用性
2)提高代碼的維護性
3)它是多態的前提
B. 繼承的特點:
繼承不能多繼承,只能單繼承,但是可以多層繼承..
C.註意事項:
1)子類繼承父類,可以繼承父類所有的東西(除過構造方法),私有的(private),不能直接 訪問,所有需要提供公共的方法…
3)子類繼承父類,子類的構造方法(有參/無參)都會默認的訪問父類的無參構造方法, 優先讓父類的數據進行初始化.
D. 假如:父類沒有無參構造方法?會怎麽樣?如何解決?
會出現編譯錯誤;
解決方法如下:
1)可以提供無參構造
2)通過super(父類的帶參構造)..
3)通過this(),通過本類的無參構造,再通過無參構造間接的去訪問父類的代碼帶參構 造..
E.成員變量,
1) 如果子類繼承父類,子類中的成員變量和父類中的成員變量名稱不一致,分別輸出
2)名稱一致的情況:先在子類的局部位置找,找到,就輸出
F.成員方法
子類繼承父類,子類的成員方法名和父類的名一致,
先子類中找,有就調用,沒有就會到父類中調用
方法重寫:override
方法重載:overload
子類聲明了一個和父類一模一樣的方法聲明,其目的是為覆蓋父類的方法,完成自己 的功能…
4.多態:
同一時刻,體現出來的不同狀態
A.多態的前提:
1)必須有繼承關系
2)必須有方法重寫
3)父類的引用指向子類對象(向上轉型)
B.多態的成員訪問特點:
構造方法:都是對對象進行初始化的
成員變量:編譯看左,運行看左
成員方法(非靜態):編譯看左,運行看右(存在方法重寫)
靜態的成員方法:不能算方法重寫,和類有關系: 編譯看左,運行看左
C.多態的好處:
提高代碼復用性(由繼承保證)
提高代碼的擴展性(由多態保證)
D.多態的弊端:不能子類特有功能;
解決方法:
向下轉型:將父類的引用強制轉換為子類的引用
Fu f = new Zi() ;
//向下轉型
Zi z= (Zi)f ;
E. 向下轉型容易出現的問題:
使用不當-ClassCastException:類轉換異常
解決方案:自己分析,內存的指向問題…
5.抽象類
A.抽象類:(抽象類有抽象類多態的形式。。)
將類中的功能抽象化,類變成抽象類
關鍵字:abstract
抽象類的特點:不能實例化 -不能創建對象
抽象了的子類是具體類才是研究課題:由於具體類所有抽象類通過他子類進行實例化
B.抽象類的成員特點:
成員變量:可以是常量,也可以是變量
構造方法:有參/無參
成員方法:可以是抽象的,也可以是非抽象的
(有抽象方法的類一定是抽象類,抽象類中不一定有抽象方法)
6.接口
A. 接口:
給一些類提供一些額外的功能(擴展功能),定義接口
關鍵字:interface
class 子實現類(後面加impl,做到見名知意) implements(實現) 接口{.......}
B.接口中的成員特點:
成員變量:此變量是一個常量:public static final :默認的修飾符
構造方法:接口沒有構造方法
成員方法:都是抽象方法
C.抽象類和接口的區別?從三個方向去答
1) 成員的區別
成員變量:
抽象類:既可以常量,也可以是變量
接口:只能是常量,默認的修飾符:public static final
構造方法:
抽象類:有構造方法,無參/有參 (給對象進行初始化的)
接口:沒有構造方法
成員方法:
抽象類:可以有抽象方法,也可以有非抽象方法
接口:只能是抽象方法 :默認的修飾符:public abstract
2)類與類/類與接口關系的區別
類與類之間的關系:
繼承關系,只支持單繼承,不支持多繼承,但是可以多層繼承
類與接口的關系:
實現關系,一個類繼承另一個類的同時,還可以實現多個接口...
接口與接口的關系:
是一種繼承關系,既可以單繼承,也可以多繼承...
接口1 extends 接口2,接口3...
3)設計原則的 區別
(1)抽象類: 是有繼承關系---->體現的是一種"is a"的關系 (A是B的一種或者B是A的 一種)
(2)接口:類和接口:實現關系--->體現的是一種" like a"的關系(擴展功能) :跳高貓 像 貓
-
形式參數和返回值問題
A.形式參數是引用類型的情況:
具體類: 需要傳遞的是該類 對象
抽象類:需要傳遞是該抽象類的子類對象
接口:需要傳遞是該接口的子實現類 (還可以匿名內部類的方式)
B.返回值的問題:
具體類:返回該該具體類的對象
抽象類:返回的是該抽象類的子類對象(間接的:抽象類多態…)
接口:返回的是該接口的子實現類對象(間接:接口多態) -
內部類:
A.成員內部類和局部內部類的寫法
B.外部類訪問成員內部類,局部內部類中的 成員使用的方式….
1) 成員內部類是非靜態的,外部類訪問內部類的成員
外部類名.內部類名 對象名 = 外部類對象.內部對象;
2) 如果成員內部類是靜態的,外部類訪問內部類的成員
外部類名.內部類名 對象名 = new 外部類名.內部類名() ;
內部類訪問外部類的成員變量可直接訪問,靜態的內部類訪問外部類的數據,該數據 必須static修飾,和當前靜態內部類的成員方法是否為靜態還是非靜態“ 沒有關系”C.匿名內部類:
前提:接口或者抽象類(可以抽象類也可以普通類)
new 接口名/類名(){
重寫功能(){…}
}
本質:繼承了該類或者是實現了該接口的子類對象.. - final關鍵字特點:
final是一個修飾符,可以修飾類,方法和變量‘
被final修飾的類是一個最終類不可以被繼承;
被final修飾的方法是一個最終的方法.不可以被覆蓋;
被final修飾的變量是一個常量,只能被賦值一次;
10.面試題
A. 方法重寫和方法重載的區別?
方法重載:Overload
方法名相同,返回值類型相同,但是參數不同(參數類型不同,或者參數個數不同)
方法重寫:Override
方法重寫是相對於繼承而言
重寫的方法名,返回類型,參數類型,參數個數都要求和父類中一樣.
B.final關鍵字的面試題?(final,finally,finalize有什麽區別)
final用於聲明屬性,方法和類,分別表示屬性不可改變,方法不可覆蓋,類不能繼承
finally是異常處理語句結構的一部分,表示總是執行
finalize是object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法, 供垃圾收集時的其他資源回收,例如關閉文件等;
面向對象(繼承,多態)