1. 程式人生 > 其它 >06 - 面向物件程式設計(中級部分一)

06 - 面向物件程式設計(中級部分一)

一、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