文章目錄
- 包
- 包 (package) 是組織類的一種方式.
- 代碼案例(列印陣列):
- 附圖(缺少的那句代碼,作用就是匯入一個包,從包中拿出你需要的類)
- 圖1
- 圖2
- 經由上面一個簡單的程式附圖2,引申出一格問題: 什么是 package 和 import?
- 在java里,包肯定不止一個,那么就意味著 一個 類,可能有在不同包里都有它,只不過實作的功能不同,選擇對應包中的類,編譯器會自動幫你匯入所需包中的類
- 例1
- 例2
- 既然知道包是怎么匯入它當中的類,那么該如何使用? new它!
- 實體1(匯入(包中的類)情況)
- 實體2(不匯入(包中的類)情況)
- 前者都是匯入包中的類,在程式中就可以使用該類,那我們只匯入包呢?在程式中我們還可以使用它里面的類嗎?
- 我們再來看看 用特殊的方法 匯入一個類
- 示例
- 疑問:util包中 有很多類,難道 “ impor java.util.*; ” 是一下子全部 都匯入嗎?
- 那么 “ impor java.util.*; ” 和 “ impor java.util.具體的類名; ” ,那個更好?
- 拿 前面 例子中 Date 舉例,
- import static - 靜態匯入
- 實體
- 使用包的主要目的是保證類的唯一性
- 在此之前,我們先來看包是如何創建的(包名 必須小寫)
- 把類放進包里
- 使用我們自己創建的包中的類
- 包的訪問權限控制
- 常見的包(系統包)
- 面向物件的基本特征:
- 封裝:不必要公開的資料成員和方法,使用private關鍵字進行修飾,意義:安全性,
- 繼承:對共性的抽取,使用extends關鍵字進行處理的, 意義:可以對代碼進行重復使用,
- 先來通過代碼了解一些知識點,為了我們了解繼承做鋪墊
- 講這些共有的特性抽離出來
- 繼承的語法規則
- 基本語法
- 總結
- super關鍵字的用法,this的用法可以看這篇[文章 類與物件](https://blog.csdn.net/DarkAndGrey/article/details/121039002?spm=1001.2014.3001.5501)
- ·子類繼承父類,子類在記憶體中的情況
- 特殊情況 ( 子類的實體中, 也包含著父類的實體. 可以使用 super 關鍵字得到父類實體的參考 )
- protected 關鍵字
- 訪問權限圖( private | default | protected | public)
- 同一個包中的同一個類
- 同一個包中的不同類
- 不同包的子類(類的繼承需要兩個類都是public的類)
- 不同包的非子類
- 上面這些情況中,呼叫的成員變數都是有public修飾的,也就是說 只要我們 欄位/屬性/成員變數是被public 所修飾的,就意味著在哪里都能使用,
- 我們主要還是講 protected,因為其他的,在前面都講了,
- 同一個包中的同一個類
- 同一個包中的不同類
- 不同包的子類(前面protected 和 public幾乎一樣,但下面兩點就是public 和 protected 的區別)
- 不同包的非子類
- 總結
- final 關鍵字
- 組合
- 多型 - 這里 只是鋪墊,開個頭,講一個部分,
- 向上轉型:
- 什么情況下會發生向上轉型?
- 1. 直接賦值
- 2. 函式的引數
- 3.作為函式的回傳值
- 動態系結(多型的基礎)
- 動態系結的條件:
- 重寫 /覆寫 / 覆寫
- 代碼1
- 代碼2 (動態系結)
- 再來通過以下圖片 來進一步了解 多型系結
- 重寫的注意事項
- 方法不可以是 static 方法
- 子類的訪問修飾限定的訪問范圍一定要大于等于 父類 的 訪問修飾限定
- private 方法 不能被重寫
- 方法 被 final修飾 ,也不能被重寫
- 方法的回傳值不一樣,也能被重寫( 協變型別 )
- 特殊情況
- 重寫 與 多載的區別
- 編譯時多型:利用多載來實作多型,在同一個類中定語多個同名的不同方法來實作多型
- 向下轉型
- 再介紹一個坑(在構造方法中呼叫重寫的方法)
- 本文結束
包
包 (package) 是組織類的一種方式.
包里存的基本上都是類,而這些類都是別人寫好的,我們只需要拿著用,前提是匯入對應的包
代碼案例(列印陣列):
import java.util.Arrays;// 匯入包util包中的 Arrays 類, 圖 1
public class ObjectOrientedProgramming {
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
System.out.println(Arrays.toString(array));
在輸入 Arrays 的途中,編譯器會給出提示,只要我們選擇就能自動匯入對應包中的類,
// Arrays 是一個類,而toString 由類 來呼叫的,說明toString 是一個靜態方法 (圖2)
// 也就是說所有通過類呼叫的方法都是 靜態的
}
}
附圖(缺少的那句代碼,作用就是匯入一個包,從包中拿出你需要的類)

圖1

圖2

?
經由上面一個簡單的程式附圖2,引申出一格問題: 什么是 package 和 import?
package (包)
指:類所在的包
import (引入包中的類)
引入在類中需要的類(我們寫的程式就是一個類,import 的作用就是 在我們寫程式的時候, 引入我們所需要的類)
?
在java里,包肯定不止一個,那么就意味著 一個 類,可能有在不同包里都有它,只不過實作的功能不同,選擇對應包中的類,編譯器會自動幫你匯入所需包中的類

例1

例2

?
既然知道包是怎么匯入它當中的類,那么該如何使用? new它!
實體1(匯入(包中的類)情況)

?
實體2(不匯入(包中的類)情況)

?
前者都是匯入包中的類,在程式中就可以使用該類,那我們只匯入包呢?在程式中我們還可以使用它里面的類嗎?

由結果得知: 不能,在Java中 只能匯入一個具體的類,不能帶入一個具體的包,
?
我們再來看看 用特殊的方法 匯入一個類
import java.util.*; // * 在該代碼中 表達的意識是 通配符,
這么寫是什么意思?
匯入這個包里所有類,
示例

?
疑問:util包中 有很多類,難道 “ impor java.util.*; ” 是一下子全部 都匯入嗎?
不是的,Java 處理的時候,需要哪個類,它才會給你那個類,
就是說:Java不會提前給你任何類,當你需要某個類的時候,再給你,而且是要一個,給一個,
不會說要一個,給你一大堆,
這也是 Java 和 C 的區別之一,
假設 include<stdio.h>
C 通過 include 關鍵字,將 stdio.h 頭檔案里面的內容全部都拿過來,匯入程式,
這就好比 古時 朝廷 發賑災款 給 某位大臣,這批錢,你怎么用都行,
而不是 先排大臣過去,碰到一項需要開支的地方,再向朝廷申請 合適的 撥款數目
如果你要問:Java 和 C 那個匯入方式好,肯定是java,因為 Java 是用一個,給一個,用不到的,絕對不會給你,省空間,
不像C一樣,一股腦的全給你,管你用不用,這樣就會造成空間的浪費,

?
那么 “ impor java.util.*; ” 和 “ impor java.util.具體的類名; ” ,那個更好?
impor java.util.具體的類名; 更好!
拿 前面 例子中 Date 舉例,

由圖我們發現 Date這個類, 在很多包中 都有,如果我們 同時使用兩個包中的Date,且使用 通配符的匯入模式,會怎么樣?
?

import static - 靜態匯入
使用 import static 可以匯入包中的 靜態的 方法 和 欄位
方法:
import static java.lang.具體的類.*;
實體

但是這種方法用的不多,雖然代碼簡單,但是閱讀性不高,不建議這么寫,(了解)
?
使用包的主要目的是保證類的唯一性

但是 如果一個專案很大,有50多人參與這個專案,有可能會出現 類名相同的情況,
此時包的作用就體現出來了,
?
在此之前,我們先來看包是如何創建的(包名 必須小寫)





把類放進包里
方法:
和我們平常在src目錄下,新建clas檔案(類)一樣,直接反鍵new就行了,

?
使用我們自己創建的包中的類


?
包的訪問權限控制
我們已經了解了類中的 public 和 private. private 中的成員只能被類的內部使用.
如果某個成員變數不包含 public 和 private 關鍵字(不加任何的訪問修飾限定詞的時候), 這個成員變數就具有包的的權限,
此時這個成員變數可以在包內部的其他類使用, 但是不能在包外部的類使用該成員變數


?
常見的包(系統包)
1. java.lang:系統常用基礎類(String、Object),此包從JDK1.1后自動匯入,
2. java.lang.reflect:java 反射編程包;
3. java.net:進行網路編程開發包,
4. java.sql:進行資料庫開發的支持包,
5. java.util:是java提供的工具程式包,(集合類等) 非常重要
6. java.io:I/O編程開發包,
?
面向物件的基本特征:
封裝:不必要公開的資料成員和方法,使用private關鍵字進行修飾,意義:安全性,
繼承:對共性的抽取,使用extends關鍵字進行處理的, 意義:可以對代碼進行重復使用,
先來通過代碼了解一些知識點,為了我們了解繼承做鋪墊

?
講這些共有的特性抽離出來





?
繼承的語法規則
基本語法
class 子類 extends 父類 {
}
總結
使用 extends 指定父類.
子類會繼承父類的所有 public 的欄位和方法.
Java 中一個子類只能繼承一個父類 (而C++/Python等語言支持多繼承).

對于父類的 private 的欄位和方法, 子類中是無法訪問的.

子類構造的同時,要 先 幫助父類來進行構造

super關鍵字的用法,this的用法可以看這篇文章 類與物件

·子類繼承父類,子類在記憶體中的情況

特殊情況 ( 子類的實體中, 也包含著父類的實體. 可以使用 super 關鍵字得到父類實體的參考 )

相當于 上圖 wing,是鳥類自帶的屬性,不會被父類的構造方法的初始化所影響,
?
protected 關鍵字
剛才我們發現, 如果把欄位設為 private, 子類不能訪問. 但是設成 public, 又違背了我們 "封裝" 的初衷.
兩全其美的辦法就是 protected 關鍵字.
對于類的呼叫者來說, protected 修飾的欄位和方法是不能訪問的
對于類的 子類 和 同一個包的其他類 來說, protected 修飾的欄位和方法是可以訪問的

?
訪問權限圖( private | default | protected | public)
| No | 范圍 | private | default(包權限) | protected | public |
|---|---|---|---|---|---|
| 1 | 同一個包中的同類 | ok | ok | ok | ok |
| 2 | 同一個包中的不同類 | no | ok | ok | ok |
| 3 | 不同包中的子類 | no | no | ok | ok |
| 4 | 不同包中的非子類 | no | no | no | ok |
private: 類內部能訪問, 類外部不能訪問
默認(也叫包訪問權限): 類內部能訪問, 同一個包中的類可以訪問, 其他類不能訪問.
protected: 類內部能訪問, 子類和同一個包中的類可以訪問, 其他類不能訪問.
public : 類內部和類的呼叫者都能訪問
?
同一個包中的同一個類

同一個包中的不同類

不同包的子類(類的繼承需要兩個類都是public的類)

?
不同包的非子類

上面這些情況中,呼叫的成員變數都是有public修飾的,也就是說 只要我們 欄位/屬性/成員變數是被public 所修飾的,就意味著在哪里都能使用,
?
我們主要還是講 protected,因為其他的,在前面都講了,
同一個包中的同一個類

同一個包中的不同類


不同包的子類(前面protected 和 public幾乎一樣,但下面兩點就是public 和 protected 的區別)

不同包的非子類

?
總結
protected 的出現為了防止繼承的時候,非子類也能呼叫父類當中成員變數和方法,
讓父類資料,不會被隨意呼叫,造成不可預料的效果,(就好比我舉的例子,狗和鳥,狗不會飛,但是你讓狗去繼承鳥的翅膀,可能嗎?)
protected 還有一個,一個好處: 即使不同類不同包,只要是子類,就可以去呼叫父類的資料
時刻牢記, 我們寫的類是現實事物的抽象. 而我們真正在公司中所遇到的專案往往業務比較復雜, 可能會涉及到一
系列復雜的概念, 都需要我們使用代碼來表示, 所以我們真實專案中所寫的類也會有很多. 類之間的關系也會更加復雜.
但是即使如此, 我們并不希望類之間的繼承層次太復雜. 一般我們不希望出現超過三層的繼承關系. 如果繼承層次太多, 就需要考慮對代碼進行重構了 .
如果一個類不想被繼承, 就可以使用 final 關鍵字.對其進行修飾
?
final 關鍵字
曾經我們學習過 final 關鍵字, 修飾一個變數或者欄位的時候, 表示 常量 (不能修改)
現在拓展一下:
final 關鍵字也能修飾類, 此時表示被修飾的類就不能被繼承.

final 關鍵字的功能是 限制 類被繼承
“限制” 這件事情意味著 “不靈活”. 在編程中, 靈活往往不見得是一件好事. 靈活可能意味著更容易出錯.
是用 final 修飾的類被繼承的時候, 就會編譯報錯, 此時就可以提示我們這樣的繼承是有悖這個類設計的初衷的.
?
組合

和繼承類似, 組合也是一種表達類之間關系的方式, 也是能夠達到代碼重用的效果
你可以理解為 a part of 一部分
例如:
學生 和 老師 是 學校的一部分
組合并沒有涉及到特殊的語法(諸如 extends 這樣的關鍵字), 僅僅是將一個類的實體作為另外一個類的欄位.
這是我們設計類的一種常用方式之一.
組合表示 has - a 語意 : the school hava students and teachers,
在剛才的例子中, 我們可以理解成一個學校中 "包含" 若干學生和教師.
繼承表示 is - a 語意 : dog is animal
在上面的 "動物和貓" 的例子中, 我們可以理解成一只貓也 "是" 一種動物
?
多型 - 這里 只是鋪墊,開個頭,講一個部分,
字面上理解: 語文層次: 一種食物多種形態, 但是這句話不要跟面試官,直接gg,這里只是 讓你對多型先有個初步了解,
?
向上轉型:
子類物件 給 父類 的 參考
什么情況下會發生向上轉型?
1. 直接賦值


?
2. 函式的引數

?
3.作為函式的回傳值

?
動態系結(多型的基礎)
當子類和父類中出現同名方法的時候, 再去呼叫會出現什么情況呢?
?
動態系結的條件:
1.父類 參考 子類的物件
2.通過父類這個參考 呼叫 父類 和 子類 同名的覆寫(重寫) 方法
?
重寫 /覆寫 / 覆寫
1.方法名相同
2. 引數的 個數 和 型別 相同
3. 最好回傳值相同(協變型別:回傳值可以不同,回傳值的關系為父子類關系)
4. 父子類的關系
代碼1

?
代碼2 (動態系結)

?
再來通過以下圖片 來進一步了解 多型系結





?
重寫的注意事項
方法不可以是 static 方法

子類的訪問修飾限定的訪問范圍一定要大于等于 父類 的 訪問修飾限定
重寫中子類的方法的訪問權限 不能低于 父類的方法訪問權限

private 方法 不能被重寫

方法 被 final修飾 ,也不能被重寫

方法的回傳值不一樣,也能被重寫( 協變型別 )

特殊情況

?
重寫 與 多載的區別
多載可 通過這篇文章進行參考方法的使用
1.方法名相同
2. 引數的 個數 和 型別 必須有一個不同(重寫:引數的型別和個數都相同)
3. 回傳值可以不同 (重寫:協變型別可以回傳值不同,一般情況回傳值是一樣)
4. 多載涉及靜態系結(重寫:動態系結)

?
編譯時多型:利用多載來實作多型,在同一個類中定語多個同名的不同方法來實作多型

?
向下轉型
向上轉型: 父類參考 參考 子類物件
那么向下轉型:子類參考 參考 父類物件
你可以這么去理解:父類 參考子類物件,子類b格提升,稱為向上轉型
子類 參考 父類 ,父類b格降級,稱為向下轉型



但是不建議大家去寫 向下轉型!


處理方法

再介紹一個坑(在構造方法中呼叫重寫的方法)

本文結束
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/357103.html
標籤:java
