Java面向對象總結

1.封裝

(1)作用:屬性封裝(private),即包裝,不給外部看見。
(2)被封裝的屬性必須用setter 和getter方法來設置和取得內容。
(3)可以用setter設置屬性,限制。(比如setAge,年齡限制在多少)

2.繼承

(1)作用:解決代碼重複(重用)的問題。
(2)格式:class 子類 extends 父類{}
擴充一個類已有的功能,比如子類擴充了父類所沒有的屬性 和方法,實際上將父類定義的更加具體化,比如:樹和百年老樹,父類表示的範圍大,子類表示的範圍小。
(3)限制:①Java不允許多重繼承,但允許多層繼承。(單繼承侷限)
即,一個子類只能有一個父類,一個父類可以有多個子類,子類的子類叫孫子類。
class A{}
class B extends A{}
class C extends B{} (多層繼承,最多不要超過三層)
②子類只能繼承父類的公有屬性,private屬性不能繼承,只能利用setter或getter方法進行間接訪問。
③實例化子類對象時會默認先執行父類構造(默認使用無參構造),調用父類構造的方法體先執行,再實例化子類對象並且調用子類的構造方法。(對於子類構造來說,相當於隱含super())

 class A{
  public A(){
     System.out.println("A類構造方法!"); }}
class B extends A{
  public B(){
     System.out.println("B類構造方法!"); }}    //這裏隱含了super()方法;
public class Test(){
     public static void main(String args[]){
	new B(); 
	}} 
//執行結果 A類構造方法!  B類構造方法!
特別說明:當父類提供有無參構造方法時,是否編寫super()方法沒有區別。但是如果父類中沒有
	無參構造方法時,則必須明確使用super()方法來調用父類指定參數的構造方法。

(4) 在繼承中super與this的用法與區別。
this用於調用屬性 調用方法 調用構造方法。

| super使用注意事項: | this使用注意事項: |
|①super必須出現在子類的方法或構造方法中。 --|-①通過this調用構造方法,僅僅在類的構造方法中才能使用。-|
|②用於訪問父類成員,例如父類的屬性 方法 構造方法。 | ②函數參數或函數中的局部變量和成員變量同名時, 則需要用"this.成員變量"來引用成員。 |
|③訪問權限有限制,無法通過super訪問private成員| | ③引用該函數當前對象時,直接用this。|

			super()與this()的不同
						super:													this:
 1.功能      子類調用父類構造 父類方法 父類屬性。              調用本類構造 本類方法 本類屬性。
 2.形式      不查找子類,直接調用父類操作。                          先查找本類中是否存在有指定的調用結構,如果有則直接調用,沒有則調用父類定義。
 3.特殊      ————                                        		表示本類的當前對象。
簡單來說,就是super()認準父類,只查找父類。this()認準本類,優先查找本類,沒有再調用父類。

3.覆寫(分爲方法的覆寫和屬性的覆蓋,下面只說方法的覆寫)

(1)作用:繼承性的主要特徵是子類可以根據情況對父類進行擴充,當子類發現父類方法名稱功能不足時可以考慮覆寫。
(2)格式:子類定義方法時,定義的方法名與父類的方法名同名。
B和A必須具有相同的方法名,相同的參數列表,返回值類型相同。
一個類可能會產生多個子類,每個子類都可能會覆寫父類中的方法,這樣一個方法就會根據不同的子類有不同的實現效果。
(3)順序:觀察實例化的時那個類,觀察這個實例化的類裏面調用的方法是否已經被覆寫過,如果沒被覆寫過則調用父類。
(4)限制:被子類覆寫過的方法不能擁有比父類更嚴格的訪問控制權限。
方法的重載和覆寫的區別
發生範圍: 重載發生在一個類裏面,覆寫發生在繼承關係裏面。
定義:重載方法名稱相同,參數的類型及個數不同。 覆寫方法名稱,參數的類型和個數相同,方法返回值相同。
權限:重載方法沒有權限的限制。 覆寫 被覆寫的方法不能擁有比父類更爲嚴格的訪問控制權限。

4.final關鍵字

(1)final:在Java中final被稱爲終結器,在Java裏面可以使用final定義類,方法和屬性。
(2)作用: (類中)使用final定義的類不能再有子類,即:任何類都不能繼承以final聲明的父類。
(方法中) 使用final定義的方法不能被子類所覆寫。
(屬性)使用final定義的變量就成爲了常量,常量必須在定義的時候設置好內容,並且不能修改。(常量名稱使用全部大寫的形式)
(3)全局變量: public + static + final 聯合定義的常量。 如:public static final String MSG=“HELLO”; (公共常量)

5.多態性

(1)多態性:1.方法的多態性與2.對象的多態性。
1.重載:同一個方法名稱相同,根據不同的參數類型及個數完成不同的功能。
覆寫:同一個方法名稱相同, 根據實例化的子類對象不同,所完成的功能也不同。

2.對象的多態性:父子類對象的轉換。(看new的是誰(
向上轉型: 子類對象變爲父類對象,格式 : 父類 父類對象 = 子類實例 , 自動轉換; A a= new B();
向下轉型: 父類對象變爲子類對象, 格式 : 子類 子類對象 = (子類) 父類實例 , 強制轉換; B b = (B) a; (父類調用子類方法)
向下轉型前必須發生向上轉向纔可以向下轉型。(int和long)

(2)多態:同一個引用類型,使用不同的實例而執行不同操作。(同一種事物,由於條件不同,產生的結果也不同)
(3)多態產生的條件:繼承、方法重寫、父類的聲明和子類的實例化。
(4)作用:對象向上轉型的主要意義在於參數的統一,向下轉型指的是父類調用子類的個性化操作方法。
instanceof關鍵字(判斷某個對象是否是指定類的實例)
對象 instanceof 類 返回 boolean型 (判斷向下轉型)

6.抽象類

(1)抽象類:指在普通類的結構裏面增加抽象方法的組成部分,抽象方法指的是沒有方法體的方法,同時抽象方法還必須使用abstract關鍵字進行定義。擁有抽象方法的類一定屬於抽象類,抽象類要使用abstract聲明。
(2)作用:利用抽象類可以明確定義子類需要覆寫的方法。
(3)普通方法與抽象方法的區別: 普通方法有 "{}"來表示方法體, 有方法體的方法一定可以被對象直接調用。
抽象方法沒有方法體,聲明時不需要加 “{}”,但是必須有abstract聲明。 public abstract void A();
(4)使用原則:抽象類不能直接實例化對象。
原因:因爲抽象方法沒有方法體,而沒有方法體的方法如何調用,不能調用如何產生實例化對象。
①抽象類必須有子類,即每一個抽象類一定要被子類所繼承(使用extends)關鍵字,
因爲Java的單繼承侷限,所以一個子類只能夠繼承一個抽象類。
②抽象類的子類(子類不是抽象類)必須覆寫抽象類中的全部抽象方法(強制子類覆寫 );
③依靠對象的向上轉型概念,可以通過抽象類的子類完成抽象類的實例化對象操作。
(5)限制:①抽象類不能使用final定義,因爲抽象類必須有子類,而final定義的類不能有子類。

②抽象類中可以沒有任何抽象方法,但只要是抽象類,就不能直接使用關鍵字new實例化對象。

③抽象類中依然可以定義內部的抽象類,而實現的子類也可以根據需要選擇是否定義內部類來繼承抽象內部類。(P233 範例4-40)

④外部抽象類不允許使用static聲明,而內部的抽象類允許使用static聲明,此時內部抽象類就相當於是一個外部抽象類,
繼承的時候使用 “外部內.內部類”的形式表示類名稱。(static 定義的是類)

⑤在抽象類中,如果定義了static屬性或方法,就可以在沒有對象的時候直接調用。(此時可以沒有子類)

7.接口

(1)接口:接口是一種約定(標準)和能力。interface聲明接口,implements實現接口。
接口與接口之間只能繼承 不能實現。接口作爲標準用於解耦合以及不同層之間的連接橋樑。
(2)定義:接口作爲一個特殊的類,這個類裏面只有抽象方法與全局變量。
interface A{
( public static final )String MSG= “HELLO”;
public (abstract) void fun();
}

(3)使用:①接口必須要有子類,但是此時一個子類可以使用implements關鍵字實現多個接口,避免單繼承侷限。
(子類可以實現多個接口,但是子類只能夠繼承一個抽象類)多個接口: class X implements A,b

②接口的子類(如果不是抽象類),必須要覆寫接口中的全部抽象方法。

③接口的對象可以利用子類對象的向上轉型進行實例化操作。

④如果一個子類既要繼承抽象類又要實現接口,那麼應該採用先繼承(extends)後實現接口(implements)的順序完成。
class X extends C implements A,B

⑤一個抽象類可以繼承一個抽象類或者實現若干個接口,但是反過來,一個接口卻不能繼承抽象類。一個接口可以使用extends關鍵字
同時繼承多個父接口。(接口多繼承)

(4)抽象類與接口的區別(優先考慮接口)
抽象類 接口
①關鍵字: abstract class interface

②組成: 構造 普通 抽象 static 方法 常量 變量 抽象方法 全局變量

③子類使用: class 子類 extends 抽象類 class 子類 implements 接口,接口,……

④關係:一個抽象類只能繼承一個抽象的父類,抽象類可以實現多個接口。而接口不能繼承抽象類,但一個接口可以繼承(用extends)多個父接口。

⑤權限: 可以使用各種權限 只能使用public權限

⑥限制: 單繼承侷限 沒有單繼承侷限

⑦子類: 抽象類和接口都必須有子類,子類必須要覆寫全部的抽象方法。

⑧實例化對象: 都是依靠子類的向上轉型進行對象的實例化。

一個子類只能繼承一個抽象類,卻可以實現多接口。(接口主要用於解決單繼承侷限)
抽象類要被子類繼承,接口要被類實現。

(5)接口的應用1.——工廠設計模式(解決代碼耦合帶來的問題)
代碼編寫標準:①客戶端(即主方法)調用簡單,不需要關注具體細節;
②程序代碼的修改,不影響客戶端的調用,即使用者可以不去關心代碼的變更。
解決new所帶的的代碼耦合度問題。

interface Person{
	public void act();}
class Eat implements Person{
	public void act(){
	System.out.println("吃飯");}}
class Drink implements Person{
	public void act(){
	System.out.println("喝水");}}

class Factory {				//工廠類
	public static Person getInstance(String className){
		if("eat".equals(className)){
			return new Eat();
		}else if("drink".equals(className)){
			return new Drink();
		}else {
			return null;}}}

public class Test{
	public static void main(String args[]){
		Person p = Factory.getInstance("eat");
	p.act();}}

本程序在客戶端的操作上取消了new的使用,而使用 Facatory.getInstance()方法根據指定子類標記取得接口實例化,
這時客戶端不再需要關注具體子類,也不需要關注Factory類是怎樣處理的只需要關注如何取得接口對象並操作。

2.——代理設計模式
代理設計是指一個代理主題來操作真實主題,真實主題執行具體的業務操作,而代理主題負責其他相關業務的處理。
代理設計模式的格式:①接口②真實主題 ③ 代理主題 ④主類(客戶端)

interface Network{						//接口
	public void browse();
}
class Real implements Network{				//真實主題
	public void browse(){
		System.out.println("上網瀏覽");
	}
}
class Proxy implements Network{				//代理主題
	private Network network;
	public Proxy(Network network){			//設置代理的真實操作
		this.network=network;			//設置代理的子類
	}
	public void check(){					//與具體上網相關的操作
		System.out.println("檢查用戶是否合法");
	}
	public void browse(){						
		this.check();					//可以同時調用多個與具體業務相關的操作
		this.network.browse();				//調用真實上網操作
	}
}
	
	public class Test2{
		public static void main(String args[]){
			Network net =new Proxy(new Real());	//定義接口對象實例化對象,同時傳入代理的真實操作
			net.browse();			//客戶只關心上網一個功能
	}
}

在本程序中,真實主題實現類完成的只是上網的最基本功能,而代理主題要做比真實主題更多的相關業務操作。

	區分 對象 類 抽象類 接口 繼承 實現(P253)

回答:接口是在類之上的標準。

8.static用法

static可以用來修飾屬性、方法和代碼塊

static修飾的屬性和方法稱爲類屬性(類變量)、類方法

不使用static修飾的屬性和方法,屬於單個對象,通常稱爲實例屬性(實例變量)、實例方法

static修飾的變量和方法可以通過類名和對象名訪問,而不用static修飾的變量和方法只能通過對象名訪問

接口中定義的屬性都是默認static final的常量

9.修飾符

1) private
類中限定爲private的成員,只能被這個類本身訪問。
如果一個類的構造方法聲明爲private,則其它類不能生成該類的一個實例。
2) friendly
類中不加任何訪問權限限定的成員屬於缺省的(friendly)訪問狀態,可以被這個類本身和同一個包中的類所訪問。
3) protected
類中限定爲protected的成員,可以被這個類本身、它的子類(包括同一個包中以及不同包中的子類)和同一個包中的所有其他的類訪問。
可以修飾屬性和方法
本類、同包、子類可以訪問
4) public
類中限定爲public的成員,可以被所有的類訪問。
訪問修飾符總結 本類 同包 子類 其他
private √
默認(friendly) √ √
protected √ √ √
public √ √ √ √

10.包——解決類的同名問題

包的作用:1.文檔分門別類,易於查找。2.易於管理。3.不同內容的文檔可以放在不同的袋子中,擁有相同的名字,避免衝突
創建包:使用package聲明包,以分號結尾
包命名規範:包名由小寫字母組成,不能以圓點開頭或結尾

分別創建包和類:
創建項目→創建包→創建類

創建類的過程中創建類所在的包
創建項目→創建包和類

導入包:爲了使用不在同一包中的類,需要在Java程序中使用import關鍵字導入這個類

發佈了33 篇原創文章 · 獲贊 1 · 訪問量 4697
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章