面向物件(二)
1.類中的構造器
初始化物件的過程:
1)JVM會檢查類是否被載入,如果沒有,則載入類的位元組碼到方法區(有且載入一次);
2)在堆上開闢一塊區域,建立物件
3)初始化物件,給物件賦予初始值
4)呼叫構造器,重新賦值。
構造器
系統預設分配無參構造器,如果手動設定有參構造器,需要同時設定無參構造器(系統不會再預設設定);
構造器名稱與類名一直,無方法返回值,無return返回值
2.類中的關鍵字:static,final
static
1)修飾成員變數,變成類變數,可以 類名.變數名 訪問。
2)修飾方法,變成靜態方法,可以類名.方法名訪問。
可以修飾程式碼塊,變成靜態塊,通常用來初始化資料庫連線,初始化工廠。
靜態方法和靜態塊,不能訪問非靜態的成員變數和方法。這是由載入順序決定的。
類中程式碼塊包含有(普通塊,靜態塊,構造塊),載入的順序是 靜態塊>構造塊>構造器>普通塊
3)修飾類,可以變成內部類
被static修飾後,會在類第一次載入時,載入到方法區中。
final
1)修飾成員變數,變成常量,不可修改
2)修飾方法,變成不能重新的方法
3)修飾類,變成不可繼承的類
應用案例:Math類,常量類,內部是靜態方法,不能重寫方法,不能初始化,直接呼叫定義好的方法,防止方法被篡改
3.繼承中的關鍵字:extends,super,this
extends表示繼承,只能繼承一個類。
super()可以用來呼叫父類的構造方法,super.xxx可以用來呼叫父類的屬性和方法
this表示當前類,用於區分形參和成員變數,防止初始化時,採用了就近原則
4.抽象與介面
繼承是對類程式碼的複用,體現的是is-a的關係
抽象是對類的一種提煉,體現的是對方法不滿意,需要重寫。
1 public abstract class TestAbs 2 { 3 /* 4 1.抽象類有構造器,可以被例項化 5 */ 6 private String name;//姓名 7 8 /* 9 2.只要有一個方法被abstract修飾,此類即為抽象類;抽象類允許有其他屬性和方法10 */ 11 public abstract void test(); 12 13 /* 14 3.抽象類不能被final修飾,因為抽象類一定會被繼承 15 */ 16 17 public String getName() 18 { 19 return this.name; 20 } 21 }
介面是對類設定標準,體現的是has-a的關係
1 public interface ITest 2 { 3 /* 4 1.介面沒有構造器,不能例項化 5 2.public static final 公共的靜態的常量 6 可以省略,但是不建議省略 7 */ 8 public static final double PI = 3.14; 9 10 /* 11 3.public abstract 公共的抽象的方法 12 */ 13 public abstract void test(); 14 15 /* 16 4.先繼承,再實現,繼承只能繼承1個,實現可以實現多個 17 */ 18 19 /* 20 5.JDK1.8後的新特性 21 1)可以定義預設方法,解決介面升級問題; 22 例如:介面需要新增一個方法,但是實現類比較多,可以新增一個預設方法,實現類使用預設方法即可。 23 如果實現類想重新新增方法,也是允許的。如果實現類想重新的同時,還呼叫父類的方法, 24 介面.super().方法名 25 */ 26 27 default void test2() 28 { 29 30 } 31 32 /* 33 5.JDK1.8後的新特性 34 2)可以定義靜態方法,靜態方法不能重寫 35 */ 36 public static void test3() 37 { 38 39 } 40 }
5.多型的應用場景
父類或者介面作為引數或者返回值型別,實際作為引數或返回值的繼承或實現的子類。
比如簡單工廠模式,根據傳入引數,返回不同型別的子類。
向上轉型(p只能看到p和stu共同擁有的屬性和方法,方法還是stu重寫的方法)
Student stu = new Student();
Person p = stu;
向下轉型
Student stu = (Student) p;
6.類與類之間的關係
1)繼承
2)實現
3)依賴
方法中呼叫了其他類,比如:人過河,需要小船;依賴性沒有那麼強
4)關聯
方法中的成員變數是其他類,比如:老師和學生,學生和朋友
5)聚合
多個類聚合成某個群體,比如家人和家
6)組成
某個部分,不可缺失,比如大腦和人