面向對象的本質就是:以類的方式組織代碼,以對象的組織(封裝)數據
創建與初始化對象
使用new關鍵字創建的時候,除了分配內存空間之外,還會給創建好的對象進行默認的初始化以及對類中構造器的調用
構造器
作用
實例化初始值
//有參構造:一旦定義了有參構造,無參就必須顯示定義
-
使用new關鍵字,本質是在調用構造器
-
用來初始化值
//alt+insert 生成構造器 ok:有參 第二個無參
特點
和類名相同
沒有返回值
this.當前對象
屬性
字段Field 成員變量
默認初始化:
數字: 0 0.0
char:u0000
Boolean:false
引用:null
修飾符 屬性類型 屬性名 = 屬性值!
屬性賦值的先后順序:
-
默認初始化 //只能賦值一次
-
顯示初始化 //只能賦值一次
-
構造器中賦值 //只能賦值一次
-
通過“對象.方法”或:對象。屬性“的方式,賦值 //可以賦值多次
順序:1-2-3-4
封裝
get/set
封裝的意義
-
提高程序的安全性,保護數據
-
隱藏代碼的實現細節
-
統一接口
-
系統可維護增加了
屬性私有get/set
繼承
extends
子類繼承父類就會擁有父類的全部方法
CTRL + H (找到繼承樹)
Java中類只有單繼承,沒有多繼承
super
調用父類的構造器,必須要在子類構造器的第一行。
注意點
-
super調用父類的構造方法,必須在構造方法的第一個
-
super必須只能出現在子類的方法或者構造方法中!
-
super和this不能同時調用構造方法
對比this
代表的對象不同:
this:本身調用者這個對象
super:代表父類對象的應用
前提
this:沒有繼承也可以使用
super:只能在繼承條件下才可以使用
構造方法
this();調用本類的構造
super();調用父類的構造
一個類有n個構造器,最多有n-1個this。剩的那個是super。也就是說在一個類的構造器中至少有一個super
方法的重寫
重寫都是方法的重寫,和屬性無關//重名屬性保留基類的,重名方法保留子類的
父類引用指向子類
方法分調用只和左邊,定義的數據類型有關。
靜態方法和非靜態方法區別很大。
注
重寫產生於父類和子類之間,是指子類將父類的方法進行重寫而重載是指同一個類中,可以因不同的參數類型,參數個數等可以寫出多個相同名字的方法。
重寫:需要有繼承關系,子類重寫父類的方法!
-
方法名必須相同
-
參數列表必須相同
-
修飾符:范圍可以擴大但不能縮小: Public》Protected》Default》Private
-
拋出的異常:范圍,可以被縮小,但不能擴大
-
重寫,子類的方法和父類必要一致;方法體不同!
-
子類不能重寫父類中private的方法
為什么需要重寫:
父類的功能,子類不一定需要,或者不一定滿足!
Alt + Insert ; override;
父類被重寫的方法的返回值類型是void,則子類重寫的方法的返回值類型只能是void
父類被重寫的方法的返回值類型是A類型,則子類重寫的方法的返回值類型可以是A類或A 類的子類
父類被重寫的方法的返回值類型是基本數據類型(比如:double,則子類重寫的方法的返回值類型必須是相同的基本數據類型
多態
何為多態性:
對象的多態性:父類的引用指向子類的對象
多態的使用:當調用子父類同名同參數的方法時,實際執行的是子類重寫父類的方法---虛擬方法的調用
:有了對象的多態性以后,我們在編譯期,只能調用父類中聲明的方法,但在運行期,我們實際執行的是子類重寫父類的方法。
編譯看左邊,運行看右邊
多態的使用前提:
-
類的繼承
-
方法的重寫
對象的多態性,只適應於方法,不適用於屬性
(類型轉換異常:ClassCastException)
instanceof關鍵字的使用
格式:a instanceof A:判斷對象a是否是類A的實例。如果是,返回ture;如果不是,返回false。
使用情景:為了避免在向下轉型時出現ClassCastException的異常,我們在向下轉型之前,先進行instanceof的判斷,一旦返回true,就進行向下轉型。如果返回false,不進行向下轉型。
如果 a instanceof A返回true,則a instanceof B也返回true。
其中,類B是類A的父類。
===================================================================
若子類重寫了父類方法,就意味着子類里定義的方法徹底覆蓋了父類里的同名方法,系統將不可能把父類里的方法轉移到子類中:編譯看左邊,運行看右邊
對於實例變量和則不存在這樣的現象,即使子類里定義了與父類完全相同的實例變量,這個實例變量依然不可能覆蓋父類中定義的實例變量:編譯運行都看左邊。
equals
== 和equals()的區別:
== :運算符
-
可以使用在基本數據類型變量和引用數據類型變量中
-
如果比較的是基本數據類型變量:比較兩個變量保存的數據是否相等。(不一定類型要相同)
-
如果比較的是引用數據類型變量:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體。
equals()方法的使用:
-
是一個方法,而非運算符
-
只能適用於引用數據類型
-
Object類中定義的equals()和==的作用是相同的
-
像String、Date、File、包裝類等都重寫了Object類中的equals()方法。重寫以后,比較的不是兩個引用的地址是否相同,而是比較兩個對象的“實體內容”是否相同。
-
通常情況下,我們自定義的類如果使用equals()的話,也通常是比較兩個對象的“實體內容”是否相同。那么,我們就需要對Object類中的equals()進行重寫
重寫規則,比較兩個對象的實體內容是否相同
toString
-
當我們輸出一個對象的引用時,實際上就是調用當前對象的toString()
-
Object類中toString()的定義:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
} -
-
像String、Date、File、包裝類等都重寫了Object類中的toString()方法。
使得在調用對象的toString()時,返回“實體內容”信息
-
自定義類也可以重寫toString()方法,當調用此方法時,返回對象的“實體內容”
包裝類
包裝類的使用:
-
Java提供了8種基本數據類型對應的包裝類,使得基本數據類型的變量具有類的特征
-
掌握的:基本數據類型、包裝類、String三者之間的相互轉換
基本數據類型、包裝類---》String類型:調用String重載的valueOf(Xxx xxx)
String類型---》基本數據類型、包裝類:調用包裝類的parseXxxx(Strig s)
static
static關鍵字的使用
-
static:靜態的
-
static可以用來修飾:屬性、方法、代碼塊、內部類
-
使用static修飾屬性:靜態變量
- 屬性,按照是否使用static修飾,又分為:靜態屬性和非靜態屬性(實例變量)
實例變量:我們創建了類的多個對象,每個對象都獨立的擁有一套類中的非靜態屬性。當修改其中一個對象中的非靜態屬性時,不會導致其他對象中同樣的屬性值的修改。
靜態變量:我們創建了類的多個對象,多個對象共享同一個靜態變量。當通過某一個對象修改靜態變量時,會導致其他的對象調用此靜態變量時,是修改過了的。
-
static修飾屬性的其他說明:
靜態變量隨着類的加載而加載。可以通過“類.靜態變量”的方式進行調用
靜態變量的加載要早於對象的創建
由於類只會加載一次,則靜態變量在內存中也只會存在一份:存在方法區的靜態域中
-
使用static修飾方法:靜態方法
靜態方法中,只能調用靜態的方法或屬性
非靜態方法中,既可以調用非靜態的方法或屬性,也可以調用靜態的方法或屬性
-
static注意點:
在靜態的方法內,不能使用this關鍵字、super關鍵字
-
開發中,如何確定一個屬性是否要聲明為static
屬性是可以被多個對象所共享的,不會隨着對象的不同而不同的
類中的常量也常常聲明為static
開發中,如何確定一個方法是否要聲明為static
操作靜態屬性的方法,通常設置為static的
工具類中的方法,習慣上聲明為static的