06 - 面向物件程式設計(中級部分一)
阿新 • • 發佈:2022-01-08
一、package包
包的作用
1)區分相同名字的類
2)當類很多時,可以很好的管理類
3)控制訪問範圍
包的基本語法
package com.spock;
說明:
package 關鍵字,表示打包
com.spock 表示包名
包的命名規則
只能包含數字、字母、下劃線、小圓點,但不能用數字開頭,不能是關鍵字或保留字 demo.class.exec1 //錯誤,class是關鍵字 demo.12a //錯誤,12a是數字開頭 demo.ab12.oa // 正確 包名一般是小寫字母+小圓點 com.公司名.專案名.業務模組名 com.sina.blog.user //使用者模組 com.sina.blog.order //訂單模組
常用的包
一個包下,包含很多的類,java 中常用的包有:
java.lang.* //lang 包是基本包,預設引入,不需要再引入。
java.util.* //util 包,系統提供的工具包,工具類,例如 Scanner
java.net.* //網路包,網路開發
java.awt.* //是做 Java 的介面開發,GUI
包的引入
語法:
import 包;
引入一個包的主要目的是要使用該包下的類
比如:
import java.util.Scanner; 就只是引入一個類Scanner
import java.util.*; 表示將java.util包所有類都引入
使用案例
package com.hspedu.pkg; import java.util.Arrays; //注意: //建議:我們需要使用到哪個類,就匯入哪個類即可,不建議使用 *匯入 //import java.util.Scanner; //表示只會引入 java.util 包下的 Scanner //import java.util.*; //表示將 java.util 包下的所有類都引入(匯入) public class Import01 { public static void main(String[] args) { //使用系統提供的 Arrays 完成 陣列排序 int[] arr = {-1, 20, 2, 13, 3}; //比如對其進行排序 //傳統方法是,自己編寫排序(冒泡) //系統是提供了相關的類,可以方便完成 Arrays Arrays.sort(arr); //輸出排序結果 for (int i = 0; i < arr.length ; i++) { System.out.print(arr[i] + "\t"); } } }
需要使用到哪個類,就匯入哪個類即可,不建議使用 * 匯入。
java.lang.* //lang 包是基本包,預設引入,不需要再引入。
注意事項
//package 的作用是聲明當前類所在的包,需要放在類(或者檔案)的最上面
// 一個類中最多隻有一句 package
package com.edu.pkg;
//import 指令 位置放在 package 的下面,在類定義前面,可以有多句且沒有順序要求
import java.util.Scanner;
import java.util.Arrays;
package 的作用是聲明當前類所在的包,需要放在類(或者檔案)的最上面,一個類中最多隻有一句 package。 import 指令的位置放在 package 的下面,在類定義前面,可以有多句且沒有順序要求。
二、訪問修飾符
基本介紹
Java 提供四種訪問控制修飾符號,用於控制方法和屬性(成員變數)的訪問許可權(範圍):
1) 公開級別:用 public 修飾,對外公開
2) 受保護級別:用 protected 修飾,對子類和同一個包中的類公開
3) 預設級別:沒有修飾符號,向同一個包的類公開.
4) 私有級別:用 private 修飾,只有類本身可以訪問,不對外公開
訪問範圍
訪問級別 | 訪問修飾符 | 同類 | 同包 | 子類 | 不同包 |
---|---|---|---|---|---|
公開 | Public | √ | √ | √ | √ |
受保護 | Protected | √ | √ | √ | × |
預設 | 無修飾符 | √ | √ | × | × |
私有 | Private | √ | × | × | × |
注意事項
1)修飾符可以用來修飾類中的屬性,成員方法以及類。
2)只有預設的和 public 才能修飾類,並且遵循上述訪問許可權的特點
3)成員方法的訪問規則和屬性完全一樣
三、面向物件程式設計三大特徵
面向物件程式設計有三大特徵:封裝、繼承和多型。
四、面向物件程式設計-封裝
基本介紹
封裝(encapsulation)就是把抽象出來的資料 [屬性] 和對資料的操作 [方法] 封裝在一起,資料被保護在內部,程式的其它部分只有通過被授權的操作 [方法],才能對資料進行操作。
封裝的作用
1)隱藏實現細節:方法(連線資料庫) <---- 呼叫(傳入引數)
2)可以對資料進行驗證,保證安全合理
Person {name, age}
Person p = new Person();
p.name = "jack";
p.age = 100;
封裝的實現步驟
1)將屬性進行私有化 private 【不能直接修改屬性】
2)提供一個公共的(public)set方法,用於對屬性判斷並賦值
public void setXxx(型別 引數名) {
//加入資料驗證的業務邏輯
屬性 = 引數名;
}
3)提供一個公共的(public)get方法,用於獲取屬性的值
public 資料型別 getXxx() {
return xxx;
}
使用案例
class Person {
public String name; //名字公開
private int age; //age 私有化
private double salary; //..
//構造器 alt+insert
public Person() {
}
//自己寫 setXxx 和 getXxx 太慢,我們使用快捷鍵 alt+insert
//然後根據要求來完善我們的程式碼.
public String getName() {
return name;
}
public void setName(String name) {
//加入對資料的校驗,相當於增加了業務邏輯
if(name.length() >= 2 && name.length() <=6 ) {
this.name = name;
}else {
System.out.println("名字的長度不對,需要(2-6)個字元,預設名字");
this.name = "無名人";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
//判斷
if(age >= 1 && age <= 120) {
//如果是合理範圍
this.age = age;
} else {
System.out.println("你設定年齡不對,需要在 (1-120), 給預設年齡 18 ");
this.age = 18;//給一個預設年齡
}
}
public double getSalary() {
//可以這裡增加對當前物件的許可權判斷
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
五、面向物件程式設計-繼承
基本介紹
繼承可以解決程式碼複用,讓我們的程式設計更加靠近人類思維。當多個類存在相同的屬性(變數)和方法時,可以從這些類中 抽象出父類,在父類中定義這些相同的屬性和方法,所有的子類不需要重新定義這些屬性和方法,只需要通過 extends 來宣告繼承父類即可。
繼承的基本語法
class 子類 extends 父類 {
}
1)子類會自動擁有父類定義的屬性和方法
2)父類又叫超類,基類
3)子類又叫派生類
繼承的作用
1)提高程式碼的複用性
2)提高程式碼的擴充套件性和維護性
使用案例
//Student類, 是 Pupil 和 Graduate 的父類
public class Student {
//共有屬性
public String name;
public int age;
private double score;//成績 //共有的方法
public void setScore(double score) {
this.score = score;
}
public void showInfo() {
System.out.println("學生名 " + name + " 年齡 " + age + " 成績 " + score);
}
}
//子類
public class Pupil extends Student {
public void testing() {
System.out.println("小學生 " + name + "正在考小學數學..");
}
}
//子類
public class Graduate extends Student {
public void testing() { //和 Pupil 不一樣
System.out.println("大學生 " + name + " 正在考大學數學..");
}
}
繼承的使用細節
1) 子類繼承了所有的屬性和方法,非私有的屬性和方法可以在子類直接訪問
但是私有屬性和方法不能在子類直接訪問,要通過父類提供公共的方法去訪問
2) 子類必須呼叫父類的構造器,完成父類的初始化
3) 當建立子類物件時,不管使用子類的哪個構造器,預設情況下總會去呼叫父類的無參構造器
如果父類沒有提供無參構造器,則必須在子類的構造器中用 super 去指定使用父類的某個構造器完成對父類的初始化工作
否則,編譯不會通過
public Sub() {
//無參構造器
super(); //預設呼叫父類的無參構造器,可以不寫
System.out.println("子類 Sub()構造器被呼叫....");
}
4) 如果希望指定去呼叫父類的某個構造器,則顯式的呼叫一下 : super(引數列表)
//當建立子類物件時,不管使用子類的哪個構造器
//預設情況下總會去呼叫父類的無參構造器
//如果要修改使用super指定
public Sub(String name) {
super("tom", 30);//呼叫父類兩個引數的構造器
//do nothing...
System.out.println("子類 Sub(String name)構造器被呼叫....");
}
5) super 在使用時,必須放在構造器第一行(super 只能在構造器中使用)
6) super() 和 this() 都只能放在構造器第一行,因此這兩個方法不能共存在一個構造器
7) java 所有類都是 Object 類的子類, Object 是所有類的基類
8) 父類構造器的呼叫不限於直接父類!將一直往上追溯直到 Object 類(頂級父類)
9) 子類最多隻能繼承一個父類(指直接繼承),即 java 中是單繼承機制。
思考:如何讓 A 類繼承 B 類和 C 類? 【A 繼承 B, B 繼承 C】
10) 不能濫用繼承,子類和父類之間必須滿足 is-a 的邏輯關係。xxx是一個xxx
六、super 關鍵字
基本介紹
super 代表父類的引用,用於訪問父類的屬性、方法、構造器。
基本語法
1)訪問父類的屬性,但不能訪問父類的 private屬性
super.屬性名;
2)訪問父類的方法,但不能訪問父類的 private方法
super.方法名(引數列表);
3)訪問父類的構造器
super(引數列表);
只能放在構造器的第一句,只能出現一句
Super的使用細節
1)呼叫父類的構造器的好處
(分工明確,父類屬性由父類初始化,子類的屬性由子類初始化)
2)當子類中有和父類中的成員(屬性和方法)重名時,為了訪問父類的成員,必須通過super。
如果沒有重名,使用super、this、直接訪問是一樣的效果!
3)super的訪問不限於直接父類,如果爺爺類和本類中有同名的成員,也可以使用super去訪問爺爺類的成員;
如果多個基類(上級類)中都有同名的成員,使用super訪問遵循就近原則。A->B->C,當然也需要遵守訪問許可權的相關規則。
super 和 this 的比較
NO | 區別點 | This | Super |
---|---|---|---|
1 | 訪問屬性 | 訪問本類中的屬性,如果本類沒有此屬性則從父類繼續查詢。 | 從父類開始查詢屬性。 |
2 | 呼叫方法 | 訪問本類中的方法,如果本類沒有此方法則從父類繼續查詢。 | 從父類開始查詢方法。 |
3 | 呼叫構造器 | 呼叫本類的構造器,必須放在構造器的首行。 | 呼叫父類構造器,必須放在子類構造器的首行。 |
4 | 特殊 | 表示當前物件 | 子類中訪問父類物件 |
注:本部落格引用韓順平老師Java課程
Record Our Mind