1. 程式人生 > >Accp8.0 S2 02使用Java實現面向物件程式設計

Accp8.0 S2 02使用Java實現面向物件程式設計

物件和封裝
類和物件
使用物件的目地:
用計算機語言描述現實世界
用計算機語言解決現實世界的問題
使用面向物件的好處:
交流更加流暢
提高設計和開發效率
怎樣實現面向物件程式設計
找出類
找出屬性(變數)
找出行為(方法)
類圖:
“+”為public 公開的
“-“為private私有的
this關鍵字,是對一個物件的預設引用,用以區分同名成員變數
this關鍵字,代表當前物件(當前成員變數)
構造方法和過載
首先物件例項化
構造方法
無參構造
語法
訪問修飾符 構造方法名(){}
作用
給成員屬性預設賦初始值
有參構造
語法
訪問修飾符 構造方法(引數列表....){}
構造方法特點
方法名與類名同名
無返回值
與反問修飾符 無關
過載
特點
方法名相同,引數列表不同(個數,型別,順序)
在同一個類
引數變數與類中的成員變數同名,必須使用this關鍵字
自定義一個列表有參構造,系統就不在預設分配無引數構造,使用無引數構造時必須手動新增無參構造的定義
static定義方法
呼叫方法
1例項化物件,物件,靜態方法
物件.靜態方法
2類名 屬性 方法
static 定義程式碼塊
靜態程式碼塊只能給static屬性賦值
執行永遠 比構造方法先執行
在程式中任何變數或者程式碼都是在編譯時由系統自動分配 記憶體儲存
靜態屬性.類變數
所謂的靜態就是指在編譯後所分配的記憶體會一直存在直到程式退出,記憶體才會釋放這個空間,也就是程式執行,那麼這程式碼塊一直存在
static的方法以下幾天限時
它們僅能呼叫其他static方法
它們僅能訪問static資料
它們不能以任何方式引用this或super
封裝
步驟
設為私有的 private
建立共有的public 的get set 方法用於屬性的讀寫
在get屬性中加入屬性控制語句
總結
現實世界是面向物件的,面向物件就是採用現實模以的方法設計和開發程式
面向物件設計是目前計算機軟體開發中最流行的技術,面向物件設計的過程就是抽象的過程
類是對某一事物的描述,是抽象的,概念上的定義。物件是實際存在的該是的個體,是具體是,現實的
如果同一個類中包含了兩個或兩個以上的方法,他們的方法名相同,方法引數個數或者型別不同則該方法成為方法的過載
構造方法用於建立類的物件構造方法的主要作用就是在建立物件時執行一些初始化操作,可以通過構造方法過載來實現多種初始化行為
封裝就是將類的成員宣告私有的,同事提供公有的方法對該屬性的存取操作
封裝的好處
隱藏類的實現細節
讓使用者只能通過程式規定的方法來訪問資料
可以方便的加入存取控制語句,限制不合理操作
繼承
什麼是繼承?
子類和父類是is-a的關係
語法
訪問修飾符 class 類名 extends 父類{}
java繼承的關鍵字 extends
c#繼承的關鍵字 :
子類訪問父類的成員
訪問父類的構造方法
super();無引數構造
super(引數); 有引數構造
訪問父類的屬性
super.屬性
訪問父類的方法
super.方法
注意:
使用super關鍵字,super代表父類物件
在子類構造方法中企鵝呼叫必須是第一句
例項化子類物件,預設會先執行父類的無引數構造,在執行子類的無引數構造
例項化子類的有引數構造時,使用super(引數)重複呼叫,父類中有引數構造,預設直接呼叫父類中有引數構造,不會呼叫父類中的無引數構造
子類不能繼承父類中私有的變數和私有方法
訪問修飾符
private 成員
子類不能繼承
子類與父類在不同包使用預設訪問許可權成員
protrcted 成員
可以修飾屬性和方法
本類 同包 子類可以訪問
public 公開的
可以修飾
在所有類中都能訪問
方法重寫
呼叫父類的方法,不能顯示子類中的屬性
子類重寫父類
構造方法不能重寫(因為不能被繼承所以不能重寫)
特點
方法名相同
引數列表相同
返回值型別相同或者是其子類
位置在子類中
super關鍵字
super只能出現在子類的方法和構造方法中
super呼叫構造方法時只能是第一句
super不能訪問父類的private成員、
final關鍵字
用final修飾的類不能在被繼承
用final修飾的方法不能在被重寫
用final修飾的變數將變成常量,只能賦值一次
抽象類和抽象方法
特點
抽象類和抽象方法都是通過abstract關鍵字來修飾
抽象類不能被例項化,抽象類中可以沒有,有一個或者多個抽象方法,甚至全部方法都是可以是抽象方法
抽象方法只有方法宣告,沒有方法實現,有抽象方法的類必須宣告為抽象類,子類必須重寫所有抽象方法才能例項化,否則子類還是一個抽象類
抽象類中可以有構造方法嗎?
抽象類中可以有構造方法,其構造方法介意被本類的其他構造方法呼叫若此,構造方法不是有private修飾,可以被本類的子類的構造方法呼叫
總結
繼承是Java中實現程式碼重用的重要手段之一,Java中只支援單繼承,就是一個類只有一個直接父類。java.lang.Object類是所有Java類的祖先
在子類中可以根據實際需求對父類繼承的方法進行重新編寫,成為方法的重寫或者覆蓋
子類中重寫的方法和父類中被重寫的方法必須具有相同的方法名,引數列表,返回值型別,必須和被重寫方法的返回值型別相同或者是子類
如果子類的構造方法中沒有通過super顯示呼叫父類的有參構造方法,也沒有通過this顯示呼叫自身的其他構造方法,則系統會預設先呼叫父類的無參構造
抽象類不能被例項化,抽象類中可以有多個零到多個抽象方法,非抽象類若繼承抽象類,則必須重寫父類的所有抽象方法
用final修飾的類,不能在被繼承,用final修飾的方法,不能被子類重寫,用final修飾的變數將變成常量,只能在初始化時進行賦值,不能在其他地方修改
多型
什麼是多型
父類引用子類成為多型
向上轉型
規則
將一個父類的引用指向一個子類物件,稱為向上轉型,自動型別轉換
此時通過父類引用變數呼叫的方法是子類覆蓋或者繼承父類方法,不是父類的方法
此時通過父類引用變數無法呼叫子類特有的方法
使用多型的兩種形式
使用父類作為方法形參實現多型
使用父類作為返回值實現多型
實現多型的條件
繼承的存在(繼承是多型的基礎,沒有繼承就沒有多型)
子類重寫父類的方法(多型下呼叫子類重寫後的方法)
父類引用變數指向子類物件(子類到父類的型別轉換)
向下轉型
將一個指向子類物件的父類引用賦給一個子類的引用,稱為向下轉型,等於強制型別轉換
instanceof運算子
語法
物件 instanceof 類或者介面
說明
用來判斷一個物件是否屬於一個類或者實現一個介面,結果為true或者是false,在強制型別轉換之前通過instanceof運算子檢查物件的真實性,在進行相應的強制型別轉換,可以提高程式碼的健壯性
總結
通過多型可以減少類中的程式碼量,可以提高程式碼的可擴充套件性和可維護性,繼承是多型的基礎,沒有繼承就沒有多型
把子類轉換為父類稱為向上轉型,自動型別轉換,把父類轉換為子類稱為向下轉型,必須強制型別轉換
向上轉型通過父類引用變數的方法覆蓋或繼承方法,通過父類引用變數無法覅用子類特有的方法
向下轉型可以訪問子類特有的方法,必須轉換為父類指向的真實子類型別,否則將出現型別轉換異常ClassCastException。
instanceof運算子用於判斷一個物件是否屬於一個類或實現一個介面
instanceof運算子通常和強制型別轉換結合使用,先通過instanceof進行型別判斷,在進行相應的強制型別轉換
使用父類作為方法形參和使用父類作為返回值型別是使用多型的常用方式
介面
什麼是介面?
介面是一種約定
介面是一種能力
介面的語法
【修飾符】 interface 介面名 extends 父介面 ,.......{//常量定義,//方法定義}
【修飾符】 extends 父類名 implements 介面1........{//類成員}
介面的特性
介面中所有的方法都是抽象方法,介面中方法都會自動用 public abstract 修飾,介面全域性抽象方法
和抽象類一樣,介面也不能例項化,介面中不能有構造方法
介面之間可以通過extends實現繼承關係,一個介面可以繼承多個介面,但介面不能繼承類
介面的實現類必須實現介面的全部方法,否則定義為抽象類
介面的方法不能私有
介面中的變數都是常量
介面是一種能力
體現在介面的方法上
繼承是is-a的關係
介面則是has-a的關係
介面是一種約定
引數,註釋,名稱
本章總結
介面中的屬性都是全域性靜態常量,介面中的方法都是全域性抽象方法,介面中沒有構造方法
類只能繼承一個父類,但是可以實現多個介面,一個類如果實現了一個介面,則必須實現介面中的全部方法,否則必須將其定義為抽象類,Java通過實現介面達到了多重繼承的效果
介面是一種約定,介面表示一種能力,介面體現了約定和實現相分離的原則
抽象類利於程式碼複用,介面利於程式碼維護
通過面向介面程式設計,可以降低程式碼見的耦合性,提高程式碼的可擴充套件性和可維護性
面向介面程式設計意味著;開發系統時主體架構使用介面,介面構成系統的骨架,這樣就可以通過更換實現介面的類來實現更換系統
C#中介面的成員主要是方法和屬性介面中不能包含常量和變數,構造方法和任何靜態成員,定義介面時顯示指定任何修飾符是非法的
異常
什麼是異常?
子程式執行過程中所發生的不正常事件
Java異常處理五個關鍵字
try catch finally throw throes
常見的異常
算術異常類:ArithmeticExecption
空指標異常類:NullPointerException
型別強制轉換異常:ClassCastException
陣列負下標異常:NegativeArrayException
陣列下標越界異常:ArrayIndexOutOfBoundsException
違背安全原則異常:SecturityException
檔案已結束異常:EOFException
檔案未找到異常:FileNotFoundException
字串轉換為數字異常:NumberFormatException
操作資料庫異常:SQLException
輸入輸出異常:IOException
示例

 

 

 


日誌
三類
sql日誌:記錄系統執行的sql語句
異常日誌:記錄系統執行中發生的異常事件
業務日誌:記錄系統執行過程
log4j是一個非常優秀的日誌記錄工具
總結
異常是由Java應用程式丟擲和處理的非嚴重錯誤,他可以分為Chencked異常和執行時異常兩類
Chencked異常必須捕獲異常或者宣告丟擲,否則無法通過編譯,執行時異常不要求捕獲或者宣告丟擲
Java的異常處理是通過五個關鍵字 try catch finally throw throws
即使try塊 catch塊中存在return語句finally塊中語句也會被執行,finally塊中語句不被執行的唯一情況是,在異常處理程式碼中執行system.exit(1);
可以在一個try語句後面跟多個catch語句塊,分別處理不同異常,但排列順序必須是從特殊到一般,最後一個一個為Exceotion類
log4j是一個優秀的日誌記錄工具,常用使用方式是配置log4j.properties檔案,從而控制日誌的輸出級別,目的地和輸出格式
集合框架
Java集合框架包含的內容
Java集合框架分為兩大類
Collection和Map
collection分為
set和list
set 介面:儲存唯一,無序的物件
list介面:儲存不唯一,有序的物件
collection介面儲存一組不唯一,無序的物件
Map介面:儲存一組成對的鍵值對應,提供key到value的對映,Map中的要求不重複,有序,value不要求有序 允許重複
list介面
ArrayList
ArrayList集合儲存資料的方式和陣列相同
方法
boolen add(Object o) 在列表末尾順序新增元素,起始索引位置從0開始
void add(int index,Object o) 指定索引位置新增元素
int size( ) 返回列表中元素個數
Object get(int index) 返回指定索引位置處的元素
boolean contains(Object o) 判斷列表中是否存在指定元素
boolean remove(Oject o ) 從列表中刪除元素
Object trmove(int index) 從列表中刪除制定位置元素,起始位置從0開始
linkedList
linkedList採用連結串列儲存方式,優點在於插入,刪除元素時效率比較高,它提供了額外的addFirst (),addLast()....方法
linkedList特殊方法
void addFirst 在列表的首部新增元素
void addLast 在列表的末尾新增元素
Object getFirst 返回列表中的第一個元素
Object getLast 返回列表中的最後一個元素
Object removeFirst 刪除並且返回列表中的第一個元素
Obect removeLast 刪除並且返回列表的最後一個元素
Map介面
Map介面儲存成對一組的鍵-值物件
Map的常用方法
Object put 已鍵值對的方式進行儲存,注意:鍵必須是唯一的
Object get 根據鍵返回相關聯的值,若不存在指定的鍵,則返回null
Object remove 刪除指定的鍵對映的鍵值對
int size 返回元素個數
Set keySet 返回鍵的集合
Collection values 返回值的集合
boolean containsKey 若存在指定的鍵對映的鍵值對則返回true
void clear 從此對映中移除所有對映關係
迭代器iterator
Collection 介面的itertor方法返回一個iterator有兩個方法組成
boolean hasNext();判斷是否存在另一個可訪問元素
Object next(); ;返回要訪問的下一個元素
泛型集合
jdk1.5中通過泛型有效解決問題增加泛型的支援
總結
集合彌補了陣列的缺陷,它比陣列更加靈活更加實用,可大大提高了軟體的開發效率,而且不同的集合可適用於不同的場合
集合框架為表示和操作集合而規定的一種統一的標準體系結構。集合框架包含三大塊內容,對外的介面,介面實現和對集合運算的演算法
通常說Java的集合框架中有兩大雷介面,即Collenction 和Map。其中Collenction有兩個子介面,即list和set,
區別
collenction 介面儲存一組不唯一,無序的物件
set介面繼承collenction介面,儲存一組唯一,無序的物件
list介面繼承collenction介面,儲存一組不唯一,有序的物件
Map介面儲存一組成對的鍵值物件,提供key到valu的對映,key不要求有序,不允許重複,value同樣不要求有序,但允許重複
ArrayList和陣列採用相同的儲存方式,它的優點在於遍歷元素和隨機訪問元素的效率比較高,LinkedList採用連結串列儲存方式,優點在於插入,刪除元素時效率比較高
HashMap是最常見的Map實現類,它的儲存方式是雜湊表,優點是查詢指定元素效率高
iterator為集合而生,專門實現集合的遍歷,他隱藏了各種集合實現類的內部細節,提供了遍歷集合的統一程式設計介面
使用泛型集合在建立集合物件時指定集合中元素的型別沒在從集合中取出元素時無需進行型別強制型別轉換,避免了classCaseException異常
Java中共有八個包裝類:byte short integder long float double boolean character
多執行緒
程序:
應用程式的執行例項,有獨立的記憶體空間和系統資源(動態的,併發執行,獨立單位)
執行緒
CPU排程和分派單位,程序中執行執行的最小單位,真正在CPU的執行的是執行緒
兩者關係
執行緒在程序裡面執行緒是程序內部執行單元,多個任務稱為多執行緒;程序能跑多個執行緒(搶佔資源)在同一個時刻只有一個執行緒執行!一個執行緒可以建立一個執行緒也可以刪除一個執行緒稱之為排程。
使用多執行緒的好處
合理的使用執行緒
減少開發和維護的成本
改善複雜應用程式的效能
充分利用CPU的資源
簡化程式設計模型
帶來良好的使用者體驗
執行緒的分類
1, 系統執行緒(知道就行)
2, 使用者執行緒(重點)
建立執行緒的兩種分類
繼承java.lang.Thread包
實現java.lang.Runnable介面
繼承
建立執行緒的步驟
定義一個執行緒
建立執行緒物件
啟動執行緒
終止執行緒
主執行緒
main方法即為主執行緒入口
產生其子執行緒的執行緒
必須最後完成執行
介面
定義在java.lang.Runnable包中,宣告一個抽象方法run
步驟
定義介面,實現介面,重寫run方法
建立物件
建立Thread物件
啟動執行緒
執行緒的狀態
五種
建立 就緒 執行 阻塞 死亡
建立(建立Thread物件)
就緒(啟動執行緒)
執行(輸出)
阻塞(sleep方法)
死亡(終止)
阻塞狀態的條件
由於執行緒優先順序比較低,因此不能獲取CPU資源
使用sleep方法使執行緒休眠
通過呼叫wait方法,使執行緒等待
通過呼叫yield方法,執行緒顯示出讓CPU控制權
執行緒由於等待一個檔案;I/O事件被阻塞
執行緒的排程
優先順序
優先順序從1~10 1表示最低,10為最高 預設值是5
優先順序高的執行緒優先執行效率概率更加的高
執行緒的休眠
執行緒休眠使用sleep方法
public static void sleep(毫秒);
執行緒的強制執行
使用join方法
語法
public final void join();
public final void join(long miils);
public final void join(long mills ,int nanos);
執行緒禮讓
使用yield()方法;
語法
public static void yield ();
可以暫停當前執行緒執行
執行緒同步
語法
訪問修飾符 synchronize 返回值型別 方法名(引數列表){//方法體}
synchronize 訪問修飾符 返回值型別 方法名(引數列表){//方法體}
方法體
synchronize(this){}
synchronize 塊中的程式碼必須獲得物件synchronize的鎖才能執行,具體機制與同步方法一致
執行緒安全型別
將Array物件中新增資料
將索引指加1,即為集合擴容,確保可裝入新元素
在新增位置存放資料
對比hashtable和hasMap
繼承關係不同
兩者都實現了Map介面
是否執行緒安全
是否允許出現null值
效率比較
對比String和StringBuilder
都是用來儲存字串的變數,是可變的物件,區別是StringBuilder的執行緒更加的安全
總結
多執行緒允許程式設計師編寫最大程度利用CPU的高效程式
在Java程式啟動時,一個執行緒立刻執行,該執行緒通常稱為程式執行緒的主執行緒。主執行緒的重要性體現在
他是產生其它子執行緒的執行緒
通常它必須最後完成執行,因為它執行各種關閉動作
可通過兩種方式建立執行緒
宣告一個繼承Thread類的子類,在此子類中實現Thread類的run方法
宣告一個實現Runnable介面的類,然後實現run方法
每一個執行緒建立和死亡之前,均會處於,建立,就緒,執行,阻塞,死亡狀態之一
在Java實現的多執行緒應用程式中,可以通過呼叫Thread類中的方法來實現對執行緒物件的操作
調整執行緒的優先順序:Java執行緒有優先順序,在同等情況下,優先順序高的執行緒會獲得較多的執行機會,Java執行緒的優先順序用1~10的整數表示
執行緒睡眠:sleep方法使執行緒轉到阻塞狀態
執行緒的強制執行:join方法可以強制某一執行緒執行
執行緒禮讓:yield方法,暫停當前正在執行的執行緒物件,把執行機會給相同或者更高優先順序的執行緒
當執行緒物件操縱同一共享資源時,要使用synchronized關鍵字來進行資源的同步處理,可以使同步方法和同步程式碼塊來實現執行緒同步
File/IO
檔案
使用File類操作檔案或者目錄
Java中了 java.io包提供了一些介面和類
File物件既可以表示檔案也可以表示目錄
建立File檔案物件語法
File file =new File(path);
File類中最常用的方法
exists 判斷檔案或者目錄是否存在
isFile 判斷是否是檔案
isDirectory 判斷是否是目錄
getPath 表示檔案的相對路徑
getAbsoutePath 表示檔案的絕對路徑
getName 表示檔案或者目錄的名稱
delect 表示物件指定的檔案或者目錄
length 表示檔案的長度,單位為位元組
Java中的流
什麼是流?
把指定檔案中的資料讀取或者寫入到記憶體中
Java中的輸出主要是由outputsream 和Writer 輸入主要是由inputstream 和reader作為基類
位元組流建議用於二進位制,字元流用於文字
四個基類都是抽象類
讀寫文字檔案
使用位元組流讀取文字檔案
位元組輸入流inputstream類
步驟
引入相關的類 如 File file =new File(“D:\\我的世界.txt”);
建立一個檔案輸入流物件 如: Inputstream ist=new FileInputstream(file);
利用檔案輸入流的方法讀取文字檔案的資料 如:ist.read();//讀取檔案的資料
關閉流 如:ist.close();
使用位元組流寫入文字檔案
位元組輸出流outputstream類
步驟
引入相關的類 如 : File file =new File(“D:\\我的世界.txt”);
建立一個檔案輸出流物件
檔案輸出流的方法把資料寫入文字檔案中
關閉流
使用字元流讀取文字檔案
字元輸入流是reader類
步驟
引入相關類
建立一個FileReader物件
利用FileReader類的方法讀取文字檔案的資料
關閉相關流
使用FileReader和BufferedReader讀取文字檔案
步驟
引入相關類
創就按一個BufferedReader物件
利用BufferedReader類的方法讀取文字檔案的數
關閉相關流
使用字元流寫入文字檔案
字元輸出流Writer類
步驟
引入相關類
創就按FileWriter物件
利用FileWriter類的方法寫文字檔案
關閉相關流
使用BufferedWriter和FileWriter寫文字檔案
步驟
引入相關類
構造一個BufferedWriter物件
利用方法寫文字檔案
關閉相關流
二進位制檔案的讀寫
使用DateinputStream讀二進位制
步驟
引入相關類
構造一個數據輸入流物件
利用資料輸入流物件讀取二進位制的資料
關閉資料輸入流
使用DateOutputStream寫二進位制
步驟
引入相關類
構造一個數據寫入流物件
利用資料輸出流物件寫入二進位制的資料
關閉資料輸出流
總結
File類用於訪問檔案或目錄的屬性
流是指一連串流動的字元,是以先進先出的方式傳送資訊的通道,程式和資料來源之間是通過流聯絡起來的
流可以分為輸入流和輸出流,也可以分為位元組流和字元流
FileInputstream和FileOutputStream以位元組流的方式讀寫文字
BufferedReader和BufferedWriter以字元流的方式讀寫文字檔案而且效率更加的高
DateInputstream和DateOutputStream可用於讀寫二進位制檔案
---------------------
作者:Max小灰灰
來源:CSDN
原文:https://blog.csdn.net/weixin_42327164/article/details/85276288
版權宣告:本文為博主原創文章,轉載請附上博文連結!