Java面向對象(四) 十一、package 關鍵字(拓展) 11.1 package 關鍵字的使用: 為了更好的實現項目中類的管理,提供包的概念 使用 package 聲明類或介面所屬的包,聲明在源文件的首行 包,屬於標識符,遵循標識符的命名規則、規範(xxxyyyzzz)、“見名知意” 一般包通 ...
Java面向對象(四)
目錄十一、package 關鍵字(拓展)
11.1 package 關鍵字的使用:
-
為了更好的實現項目中類的管理,提供包的概念
-
使用 package 聲明類或介面所屬的包,聲明在源文件的首行
-
包,屬於標識符,遵循標識符的命名規則、規範(xxxyyyzzz)、“見名知意”
一般包通常用小寫單詞標識。通常使用所在公司功能變數名稱的倒置:com.xxx.xxx
-
包對應於文件系統的目錄,package語句中,用 “.” 來指明包(目錄)的層次;
-
補充:同一個包下,不能命名同名的介面、類。
不同的包下,可以命名同名的介面、類。
-
它的格式為: package 頂層包名.子包名 ;
11.2 包的作用:
- 包幫助管理大型軟體系統;
- 將功能相近的類劃分到同一個包中。比如:MVC的設計模式 ;
- 包可以包含類和子包,劃分項目層次,便於管理;
- 解決類命名衝突的問題;
- 控制訪問許可權。
11.3 Java主要的包
- java.lang ----包含一些 Java 語言的核心類,如String、Math、Integer、 System和 Thread,提供常用功能
- java.net ----包含執行與網路相關的操作的類和介面。
- java.io ----包含能提供多種輸入/輸出功能的類。
- java.util ----包含一些實用工具類,如定義系統特性、介面的集合框架類、使用與日期日曆相關的函數。
- java.text ----包含了一些java格式化相關的類
- java.sql ----包含了java進行JDBC資料庫編程的相關類/介面
- java.awt ----包含了構成抽象視窗工具集(abstract window toolkits)的多個類,這些類被用來構建和管理應用程式的圖形用戶界面(GUI)。 B/S C/S(已經不常用了)
11.4 MVC設計模式
MVC是常用的設計模式之一,將整個程式分為三個層次:視圖模型層,控制器層,與數據模型層。
這種將程式輸入輸出、數據處理,以及數據的展示分離開來的設計模式使程式結構變的靈活而且清晰,同時也描述了程式各個對象間的通信方式,降低了程式的耦合性。
十二、import 關鍵字
-
在源文件中顯式的使用 import 結構導入指定包下的類、介面。
-
聲明在包的聲明和類的聲明之間。
-
如果需要導入多個結構,則併列寫出即可。
-
可以使用"xxx."的方式,表示可以導入xxx包下的所有結構*。
-
如果使用的類或介面是 java.lang 包下定義的,則可以省略 import 結構。
-
如果使用的類或介面是本包下定義的,則可以省略 import 結構。
-
如果在源文件中,使用了不同包下的同名的類,則必須至少有一個類需要以全類名的方式顯示。
// 例如:在 java.util 和 java.sql 包下都有 Date 的類
package ...
import java.util.*;
public class Test() {
public static void main(String[] args){
Date date = new Date(); // 使用的是 java.util 包下的類
java.sql.Date date1 = new java.sql.Date(1234L); // 以全類名的方式顯示
}
}
-
使用"xxx.*"方式表明可以調用xxx包下的所有結構。但是如果使用的是xxx子包下的結構,則仍需要顯式導入。
-
import static:導入指定類或介面中的靜態結構:屬性或方法。
package com.xxx;
import static java.lang.System.*; //註意導入的是該類或介面中的靜態結構
import static java.lang.Math.*;
public class Test {
public static void main(String[] args) {
// System.out.println("hello!");可以寫成
out.println("hello");
// long num = Math.round(123.434);
long num = round(123.434);
}
}
十三、面向對象的特征之二:繼承性
13.1 繼承性的好處:
-
多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中, 那麼多個類無需再定義這些屬性和行為,只要繼承那個類即可。減少了代碼的冗餘,提高了代碼的復用性;
-
便於功能的擴展;
-
為之後多態性的使用,提供了前提。
13.2 繼承性的格式:
- class A extends B{}
A:子類、派生類、subclass
B:父類、超類、基類、superclass
- 體現:一旦子類A繼承父類B以後,子類A中就獲取了父類B中聲明的所有的屬性和方法。
特別的,父類中聲明為private的屬性或方法,子類繼承父類以後,仍然認為獲取了父類中私有的結構。只有因為封裝性的影響,使得子類不能直接調用父類的結構而已。
-
子類繼承父類以後,還可以聲明自己特有的屬性或方法:實現功能的拓展。
子類和父類的關係,不同於子集和集合的關係。
13.3 Java中關於繼承性的規定:
-
Java只支持單繼承和多層繼承,不允許多重繼承。
-
一個類可以被多個子類繼承。
-
Java中類的單繼承性:一個類只能有一個父類。
-
-
子父類是相對的概念。
-
子類直接繼承的父類,稱為:直接父類。間接繼承的父類稱為:間接父類。
-
子類繼承父類以後,就獲取了直接父類以及所有間接父類中聲明的屬性和方法。
13.4 註意:
- 如果沒有顯式的聲明一個類的父類的話,則此類繼承於 java.lang.Object 類
- 所有的 java 類(除 java.lang.Object 類之外)都直接或間接的繼承於 java.lang.Object 類
- 意味著,所有的 java 類具有 java.lang.Object 類聲明的功能。
十四、方法的重寫 (override/overwrite)
14.1 方法重寫的定義:
-
子類繼承父類以後,可以對父類中同名同參數的方法,進行覆蓋操作。
-
重寫以後,當創建子類對象以後,通過子類對象調用子父類中的同名同參數的方法時,實際執行的是子類重寫父類的方法。
14.2 方法重寫的規定:
// 方法的聲明:
許可權修飾符 返回值類型 方法名(形參列表) throws 異常的類型{
//方法體
}
// 子類中的叫重寫的方法,父類中的叫被重寫的方法
-
子類重寫的方法的方法名和形參列表與父類被重寫的方法的方法名和形參列表相同。
-
子類重寫的方法的許可權修飾符不小於父類被重寫的方法的許可權修飾符。
特殊情況:子類不能重寫父類中聲明為private許可權的方法。
-
返回值類型:
- 父類被重寫的方法的返回值類型是void,則子類重寫的方法的返回值類型只能是void。
- 父類被重寫的方法的返回值類型是A類型,則子類重寫的方法的返回值類型可以是A類或A類的子類。
- 父類被重寫的方法的返回值類型是基本數據類型(比如:double),則子類重寫的方法的返回值類型必須是相同的基本數據類型(必須也是double)。
-
子類重寫的方法拋出的異常類型不大於父類被重寫的方法拋出的異常類型。
-
子類和父類中的同名同參數的方法要麼都聲明為非static的(即為重寫)。
要麼都聲明為static的,但不屬於方法的重寫。因為static方法是屬於類的,子類無法覆蓋父類的方法。
public class Person {
public String name;
public int age;
public String getInfo() {
return "Name: "+ name + "\n" +"age: "+ age;
}
}
public class Student extends Person {
public String school;
public String getInfo() { //重寫方法
return "Name: "+ name + "\nage: "+ age
+ "\nschool: "+ school;
}
public static void main(String args[]){
Student s1=new Student();
s1.name="Bob";
s1.age=20;
s1.school="school2";
System.out.println(s1.getInfo()); //Name:Bob age:20 school:school2
}
}
十五、super 關鍵字
15.1 super 的使用:
- super可用於訪問父類中定義的屬性。
- super可用於調用父類中定義的成員方法。
- super可用於在子類構造器中調用父類的構造器。
註意:
- 尤其當子父類出現同名成員時,可以用super表明調用的是父類中的成員。
- super的追溯不僅限於直接父類。
- super 和 this 的用法相像,this 代表本類對象的引用,super代表父類的記憶體空間的標識。
15.2 super 調用屬性和方法:
-
在子類的方法或構造器中,可以通過使用"super.屬性"或"super.方法"的方式,顯式的調用父類中聲明的屬性或方法。
但是,通常情況下,我們習慣省略"super."
-
特殊情況:當子類和父類中定義了同名的屬性時,我們要想在子類中調用父類中聲明的屬性,則必須顯式的使用"super.屬性"的方式,表明調用的是父類中聲明的屬性。
-
特殊情況:當子類重寫了父類中的方法以後,我們想在子類的方法中調用父類中被重寫的方法時,則必須顯式的使用"super.方法"的方式,表明調用的是父類中被重寫的方法。
15.3 super 調用構造器:
- 可以在子類的構造器中顯式的使用"super(形參列表)"的方式,調用父類中聲明的指定的構造器。
- "super(形參列表)"的使用,必須聲明在子類構造器的首行!所以,在類的構造器中,針對於"this(形參列表)"或"super(形參列表)"只能二選一,不能同時出現。
- 在構造器的首行,沒有顯式的聲明"this(形參列表)"或"super(形參列表)",則預設調用的是父類中空參的構造器:super()。
- 如果子類構造器中既未顯式調用父類或本類的構造器,且父類中又沒有無參的構造器,則編譯出錯。
- 在類的多個構造器中,至少有一個類的構造器中使用了"super(形參列表)",調用父類中的構造器。
15.4 this 和 super 的區別:
15.5 子類對象實例化的全過程
- 從結果上來看:(繼承性)
-
**子類繼承父類以後,就獲取了父類中聲明的屬性或方法。**
-
**創建子類的對象,在堆空間中,就會載入所有父類中聲明的屬性。**
- 從過程上來看:
-
當我們通過子類的構造器創建子類對象時,我們一定會直接或間接的調用其父類的構造器,進而調用父類的父類的構造器, 直到調用了 java.lang.Object 類中空參的構造器為止。正因為載入過所有的父類的結構,所以才可以看到記憶體中有父類中的結構,子類對象才可以考慮進行調用。
- 明確:雖然創建子類對象時,調用了父類的構造器,但是自始至終就創建過一個對象,即為new的子類對象。