day03-面對對象2

多態再談

java創建對象的四種方法
1. 使用new關鍵字)(構造方法構造)
2. 使用反射  Class.forName.newInstance()(構造方法構造)
3. 使用clone()方法,對象.clone() ,生成對象和原對象並不是同一個。(非構造方法構造)
4. 反序列化(非構造方法構造)
java四大特性

在這裏插入圖片描述

* 抽象:抽象是將一類對象的共同特 徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。
* 繼承:繼承是從已有類得到繼承信息創建新類的過程。提供繼承信息的類被稱爲父類(超類、基類) ;得到繼承信息的類被稱爲子類(派生類].繼承讓變化中的軟件系統有了一定的延續性 ,同時繼承也是封裝程序中可變因素的重要手段。
* 封裝:通常認爲封裝是把數據和操作數據的方法綁定起來,對數據的訪問只能通過已定義的接口。面向對象的本質就是將現實世界描給成一系列完全自治封閉的對象。我們在類中編寫的方法就是對實現細節的一種封裝;我們編寫一個類就是對數據和數據操作的封裝。可以說,封裝就是隱藏- -切可隱藏的東西,只向外界提供最簡單的編程接口。
* 多態性是指允許不同子類型的對象對同一消息作出不同的響應。
訪問修飾符權限

在這裏插入圖片描述

final與static

在這裏插入圖片描述
final好處:

final關鍵字提高了性能。JVM 和Java應用都會緩存final 變量。
final變量可以安全的在多線程環境下進行共享,而不需要額外的同步開銷。
使用final關鍵字, JVM會對方法、變量及類進行優化。

static方法是否可以覆蓋?

static方法不能被覆蓋,因爲方法覆蓋是基於運行時動態綁定的,而static方法是編譯時靜態綁定的。static 方法跟類的任何實例都不相關,所以概念上不適用。

多態
* 方法重載:實現的是編譯時的多態性(也稱前綁定)
* 方法重寫:實現的是運行時的多態(也稱後綁定),運行時的多態是面向對象最爲精髓的東西
* 實現多態要做兩件事:1.方法重寫2.對象造型(父類型引用子類型對象,這樣同樣的引用調用同樣的方法就會根據子類對象的不同而表現出不同的行爲)
* 項目中的多態:舉一個簡單的例子,在物流信息管理系統中,有兩種用戶:訂購客戶和賣房客戶,兩個客戶都可以登錄系統,他們有相同的方法Login,但登陸之後他們會進入到不同的頁面,也就是在登錄的時候會有不同的操作,兩種客戶都繼承父類的Login方法,但對於不同的對象,擁有不同的操作。
繼承的優缺點
好處: 
1. 子類能自動繼承父類的接口
2. 創建子類的對象時,無須創建父類的對象
壞處:
1. 破壞封裝,子類與父類之間緊密耦合,子類依賴於父類的實現,子類缺乏獨立性
2. 支持擴展,但是往往以增加系統結構的複雜度爲代價
3. 不支持動態繼承。在運行時,子類無法選擇不同的父類
4. 子類不能改變父類的接口
Java 中是否可以覆蓋(override)一個 private 或者是 static 的方法?
Java 中 static 方法不能被覆蓋,因爲方法覆蓋是基於運行時動態綁定的,而 static 方法是編譯時靜態綁定的。static 方法跟類的任何實例都不相關,所以概念上不適用。
java 中也不可以覆蓋 private 的方法,因爲 private 修飾的變量和方法只能在當前類中使用,如果是其他的類繼承當前類是不能訪問到 private 變量或方法的,當然也不能覆蓋

內部類

內部的訪問特點:
A:內部類可以直接訪問外部類的成員,包括私有。
B:外部類要訪問內部類的成員,必須創建對象。
內部類位置
成員位置:在成員位置定義的類,被稱爲成員內部類。	
局部位置:在局部位置定義的類,被稱爲局部內部類。
局部內部類訪問局部變量的注意事項?
局部內部類訪問局部變量必須用final修飾。因爲局部變量是隨着方法的調用而調用,隨着調用完畢而消失。而堆內存的內容並不會立即消失。所以,我們加final修飾。加入final修飾後,這個變量就成了常量。既然是常量。
匿名內部類
就是內部類的簡化寫法。前提是存在一個類或者接口,這裏的類可以是具體類也可以是抽象類。本質是什麼呢?是一個繼承了該類或者實現了該接口的子類匿名對象。
按照要求,補齊代碼要求在控制檯輸出”HelloWorld”
interface Inter { 
	void show(); 
}
class Outer { 
	//補齊代碼	
}
class OuterDemo {
	public static void main(String[] args) {
		  Outer.method().show();
	  }
}
/*
1:Outer.method()可以看出method()應該是Outer中的一個靜態方法。
2:Outer.method().show()可以看出method()方法的返回值是一個對象。又由於接口Inter中有一個show()方法,所以我認爲method()方法的返回值類型是一個接口。
*/
//答案:
class Outer { 
	//補齊代碼
	public static Inter method() {
		//子類對象 -- 子類匿名對象
		return new Inter() {//在此處重寫接口
			public void show() {
				System.out.println("HelloWorld");
			}
		};
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章