代碼塊
分類:根據其位置和聲明的不一樣: 局部代碼塊,構造(初始化)代碼塊,靜態代碼塊,同步代碼塊(多線程)
加載順序老大:
靜態代碼塊:類中方法外
用來給類作初始化,加載的時候,只執行一次(.class)
應用場景:一般用於驅動,配置文件的加載
加載順序老二:
構造代碼塊(初始化塊):在類中方法外
多個構造方法中出現相同的代碼,能夠考慮放入其中,由於構造代碼塊優先執行於構造方法,每建立一次對象就執行一次
加載順序老三:(隨着調用而進棧)
局部代碼塊:
在方法中出現;限定生命週期,及早釋放內存,提升內存利用java
class Student { static { System.out.println("Student 靜態代碼塊"); } { System.out.println("Student 構造代碼塊"); } public Student() { System.out.println("Student 構造方法"); } } class Demo2_Student { static { System.out.println("Demo2_Student靜態代碼塊"); } public static void main(String[] args) { System.out.println("我是main方法"); Student s1 = new Student(); Student s2 = new Student(); } }
1: 用到哪一個類就先加載他的靜態代碼塊
2: 靜態代碼塊優先於main方法
3: 要用到Student 因此執行Student的static代碼塊
4: 執行初始化代碼塊(構造代碼塊)
5: 構造方法的局部代碼塊
**靜態代碼塊只執行一次多線程
**靜態代碼塊只執行一次(類文件只加載一次的狀況下)。ide
繼承·
關鍵字:extends
讓類之間產生關係,子父類關係
當繼承時,子類就擁有了父類的行爲和屬性
父類:也叫基類,超(super)類。
子類:也叫派生類。
##繼承的好處和弊端
好處:學習
提升了代碼的複用性
提升了代碼可維護性
壞處this
:類與類的耦合性加強了spa
開發原則:高內聚,低耦合
內聚: 本身能完成的事情
耦合: 類與類的關聯(關係)線程
##Java中類的繼承特色有哪些?
java只支持單繼承
java支持多層繼承(B繼承A ,C又繼承B) A-->B-->C C就是孫子類
學習java方法:
學習的時候看頂層
使用的時候用底層
學頂層,用底層設計
##繼承的注意事項:
子類只能繼承父類非私有的成員(屬性/方法)
子類不能繼承父類的構造方法(能夠經過super()/super(參數列表))
使用的注意事項:
不要爲了小部分功能去繼承
繼承設計原則:
若是說蘋果是一種水果,蘋果繼承水果 xxx is a code
##成員變量的關係
使用變量遵循一個「就近原則」。
局部位置有就使用,
沒有就去本類的成員位置找,
有就使用;沒有就去父類的成員位置找,有就使用,沒有就報錯。
** 從方法-->成員-->父類成員(就近原則)
** 父類的屬性沒法被覆蓋 super (開發中父子類同名變量不常見)
** this 和 super 的區別
this 和 super 分別表明什麼?
this: 當前對象的引用
super: 表明當前對象父類的引用
this 和 super 的使用區別有哪些?
this.變量名: 當前類對象的變量
super.變量名: 當前類對象的父類的變量名
構造方法:
爲何子類中的全部構造方法默認都會訪問父類中的空參構造?
其實:全部的構造方法第一行默認都是super()
this()
this(參數列表)
super(參數列表)
調用方法:
this.show()
super.show()
繼承中構造方法的注意事項有哪些?
父類沒有無參構造方法,子類怎麼辦?
Fu(String name,int age);
1:public Son(String name,int age)
{
super(name,age)
}
2:Son(){
this("張三",100);
}
3:Son(){
super("張三",100);
}
注意事項: 每一個構造方法內,默認第一句是super()
而能夠改寫成this(...) 或者 super(..) 或者this() 或者 super()
可是隻能出現其一對象
練習題:
練習題2:
1:構造子類前先構造父類
2:初始化代碼塊優先於構造方法
3:靜態代碼塊在類加載時只實行一次
繼承中不一樣名的方法:直接調用
同名的方法:稱爲方法的重寫,用子類對象直接調用的就是子類已經重寫的方法
想要調用父類的方法-->super.方法名();
##什麼是方法重寫:
子類出現瞭如出一轍的方法(注意:返回值能夠是子父類)
應用場景:
當子類須要父類的功能,而功能主體中,子類有特定的需求,能夠重寫類中的方法.
即沿襲了父類的功能,又定義了子類特有的功能
方法重寫的注意事項有哪些?
1: 私有的方法不能被重寫(連繼承都沒法繼承)
2: 子類方法的權限不能小於父類方法的權限(最好是一致)
3: 靜態只能重寫靜態
4: 重寫必定要如出一轍
Override(重寫):在子類中,方法名和參數列表還有返回值如出一轍
Overload(重載):在本類中,方法名相同,參數列表不一樣,與返回值類型無關
final 概述:
類: 不能被繼承
變量: 變量變常量(自定義常量),只能賦值一次
方法: 方法就不能被重寫
final 修飾基本數據類型和引用數據類型
基本數據類型: 其值不能被改變
引用數據類型: 地址值不能被改變,數值能夠改變
都是隻能被賦值一次
final 對成員變量初始化時機
1 : 顯式初始化
2 : 對象構造完畢前(構造方法)
##多態
多態: 一種事物的多種形態
多態的前提條件是什麼?
1: 要有繼承關係
2: 要有方法的重寫
3: 父類引用指向子類對象
多態中成員變量的訪問特色是什麼?
規則: 編譯看左邊,運行看左邊
變量: 多態中不存在覆蓋(重寫),用的就是左邊聲明的指向
結論: 成員變量只根據聲明類型找到對應的屬性值
靜態綁定(前期綁定):在編譯期作的處理.在編譯期發現錯誤,提升運行效率
多態中成員方法的訪問特色是什麼?
規則:編譯看左邊,運行看右邊
方法:爲了配合重寫,相對於變量,多了一個動態綁定(後期綁定)
動態綁定(後期綁定): 在運行時,根據具體對象的類型的方法綁定
多態中靜態成員方法的訪問特色是什麼?
靜態只與類相關,根據左邊的類型來調用
向上向下轉型:
Person p = new SuperMan(); //對於引用類型,首先要有向上轉型(父類引用指向子類對象)
(SuperMan)p; //而後向下轉型
多態的好處和弊端
弊端:沒法使用子類特有的屬性和行爲(方法和變量)
好處:提升了代碼的維護性(繼承保證)
提升了代碼的擴展性(多態保證)
能夠當作形式參數,接收子類對象
instanceof 判斷左邊引用是不是右邊的數據類型(基於父子類或是接口實現關係)
##抽象類
抽象:描述不清 abstract class AAA {}
抽象方法 public abstract void show();
抽象類和抽象方法必須用 abstract 修飾
抽象類不必定有抽象方法,有抽象方法必定是抽象類或者接口
抽象類不能被實例化
抽象類的子類要麼是抽象類, 要麼重寫類中全部抽象方法
抽象類中的成員特色是什麼?
成員變量: 能夠是變量 int i= 1;,能夠是常量 final int a =2;
: 不能夠被 abstract 修飾
成員方法: 能夠是抽象的,也能夠不是抽象的
抽象類有構造方法.
抽象方法的做用是什麼?
抽象方法: 強制要求子類作的事情
非抽象方法: 子類繼承的事情,提升代碼的複用性
思考:一個抽象類若是沒有抽象方法,可不能夠定義爲抽象類?若是能夠,有什麼意義?
能夠,這麼作的目的只有一個,就是不讓其餘類建立本類對象,交給子類完成
什麼修飾符不能和 abstract 共用
private 因爲private是私有的,子類沒法繼承,就與 abstract 須要子類實現衝突
final 被final修飾的方法沒法被重寫,就和 abstract 矛盾了
static 是經過類名.調用,而調用一個抽象方法就沒有意義
抽象中的方法:
抽象的強制子類去實現
非抽象:給本身去繼承
##接口
格式 interface 接口名{}
class 類名 implements 接口名 {}
特色:
接口不能被實例化
接口的子類能夠是:抽象類,意義不大
能夠是具體的類,要重寫(實現)全部的抽象方法
##接口的成員特色:
1:成員只能是常量,靜態,公共. public static final
2:接口沒有構造方法
3:成員方法: 只能是抽象方法 public abstract
##類與類: 繼承關係,只能單繼承,支持多層繼承
類與接口: 實現關係, 能夠單實現,也能夠多實現,而且能夠同時繼承某個類
接口與接口: 繼承關係,能夠單繼承,能夠多繼承
##接口的設計理念
抽象類被繼承體現是 "is a" 的關係. 定義該繼承體現的共性功能.
接口被實現體現的是 "like a" 的關係. 接口中定義的是該繼承體系的擴展功能.
1: middleSchool.addStudent1()//調用中學生對象,添加學生
2: middleSchool.delStu()//調用中學生對象,刪除學生
3: highSchool.addStu()//調用高中生對象,添加學生
4: highSchool.delStu()//調用高中生對象,刪除學生
//沒有用接口使用的問題: 1: 名稱不統一 2: 萬一方法沒寫使用接口的好處: 有必定的約束,產生了規則 interface InterOperator { addStu(); delStu(); } InterOperator io = new MiddleSchool();//父類引用指向子類對象 或者highSchool io.addStu(); io.delStu();