摘要:根據出現的位置,作為對象的默認引用有兩種情形構造器中引用該構造器正在初始化的對象。在構造器中代表該構造器正在初始化的對象。用于限定該對象調用它從父類得到的實例變量和方法。
子類繼承父類就可以繼承到父類的成員變量和方法。如果訪問控制允許,子類實例可以直接調用父類里定義的方法。
如果多個重載的構造器里包含了相同的初始化代碼,則可以把這些初始化代碼放置在普通代碼塊里完成,初始化塊總在構造器執行之前被調用。
靜態初始化塊用于初始化類,在類初始化階段被執行。
如果繼承樹里的某一個類需要被初始化時,系統將會同時初始化該類的所有父類。
類和對象Static修飾的成員表明它屬于這個類本身,而不屬于該類的單個實例,因為通常把static修飾的成員變量和方法也稱為類變量,類方法。
通常把不使用static修飾的成員變量和方法也稱為實例變量和實例方法。
靜態成員不能直接訪問非靜態成員。
Static真正的作用就用于區分成員變量,方法,內部類,初始化塊這四種成員到底屬于類本身還是屬于實例。
產生的實例變量是在內存中存儲的。
引用變量里存放的僅僅是一個引用,他指向實際的對象。
This關鍵字總是指向調用該方法的對象。
根據this出現的位置,this作為對象的默認引用有兩種情形:
- 構造器中引用該構造器正在初始化的對象。 - 在方法中引用調用該方法的對象。
This可以代表任何對象,當this出現在某個方法體中時,他所代表的對象是不確定的,但它的類型是確定的:他所代表的只能是當前類的實例,只有當這個方法被調用時,他所代表的對象才被確定下來,誰在調用這個方法,this就是誰。
Static修飾的方法中不能使用this引用。
靜態成員不能訪問非靜態成員。
Java編程中不要使用對象去調用static修飾的成員變量,方法,而是應該使用類去調用static修飾的成員變量,方法。
如果確實需要在靜態方法中訪問另一個普通方法,只能創建對象。
如果方法中有個局部變量和成員變量同名,但程序又需要再該方法里訪問這個被覆蓋的成員變量,則必須使用this前綴。
This在構造器中代表該構造器正在初始化的對象。
實例方法必須使用對象調用。
public class A { int a = 123; public A() { System.out.println("構造A"); System.out.println(this.a); } } public class B extends A { int a = 456789; public B() { System.out.println("構造b"); System.out.println(this.a+"BBB"); } public static void main(String[] args) { new B(); } } 構造A 123 構造b 456789BBB方法詳解
同一個類的一個方法調用另一個方法時,如果被調方法是普通方法,則默認使用this作為調用者。如果被調方法是靜態方法,則默認使用類作為調用者。
Java里方法的傳遞方式只有一種:值傳遞。所謂值傳遞就是將實際參數值的副本傳入方法內,而且參數本身不會收到任何影響。
Java中的基本類型的參數傳遞,和引用類型的傳遞都是值傳遞,對于引用類型的傳遞也是將原來的對象的地址復制一份給參數,這時候就是原來對象和參數的地址是一樣的,都指向了同一個堆內存中的對象,對原來對象或者參數任何一方賦值null都不會影響另一方。
數組形式的形參可以處理形參列表的任意位置,但和數可變的形參只能處于形參列表的最后。
遞歸一定要向已知方向遞歸。
一個類中包含了兩個或者兩個以上的方法名相同而形參不同則被稱為方法重載。
如果需要調用test(String ...
books)方法,又只想傳入一個字符串參數,則可采用傳入字符串數組的形式:object.test(new
String[]{“TEST”});
方法重載的要求:同一個類中方法名相同,形參列表不同。
Java中不能使用方法返回值類型作為區分方法重載的依據。
成員變量和局部變量成員變量指的是在類里定義的變量,也就是field,局部變量就是在方法里定義的變量.
所有變量 |
成員變量 |
實例變量,不以static修飾 |
類變量,static修飾的 |
局部變量 |
代碼塊局部變量,在代碼塊中定義的 |
方法局部變量,在方法內定義 |
形參,方法簽名中定義的變量 |
類變量從該類的準備階段起開始存在,直到系統完全銷毀這個類,類變量的作用域與這個類的生存范圍相同;而實例變量則從該類的實例被創建起開始存在,知道系統完全銷毀這個實例,實例變量的作用域與對應實例的生存范圍相同。
成員變量無需顯示初始化,只要為了一個類定義了類變量或實例變量,系統就會在這個類的準備階段或者創建該類的實例時進行默認初始化,成員變量默認初始化時的賦值規則與數組動態初始化時數組元素的賦值規則完全相同。
與成員變量不同的是,局部變量除形參之外,都必須顯示初始化。必須先給方法局部變量和代碼塊局部變量指定初始值,否則不可以訪問他們。
當系統加載類或者創建該類的實例時,系統自動為成員變量分配內存空間,并在分配內存空間后,自動為成員變量指定初始值。
在程序中使用局部變量,也應該盡可能的所有局部變量的作用范圍,作用范圍越小,他在內存中停留的時間也就越短,程序運行性能就越好。
什么情況下考慮使用成員變量??
如果需要定義的變量是用于描述某個類或某個對象的固有信息,例如人的身高,因為每個人都必須具有這些信息,這時候就可以定義成成員變量,如果此變量對于這個類的所有實例都是相同的,如眼睛的數量,那么他就可以考慮定義成為類變量。
如果某個類中需要以一個變量來保存該類或者實例運行時的狀態信息,例如五子棋棋盤的數組,這種用于保存某個類或某個實例狀態信息的變量通常應該使用成員變量。
如果某個信息需要在某個類的多個方法之間進行共享,則這個信息應該使用成員變量來保存。
隱藏和封裝
為了實現良好的封裝,需要考慮兩方面
將對象的成員變量和實現細節隱藏起來,不允許外部直接訪問。
把方法暴露出來,讓方法來控制對這些成員變量進行安全的訪問和操作。
訪問控制修飾符
private:當前類訪問權限
default:包訪問權限
protected:子類訪問權限
public:公共訪問權限
訪問控制修飾符的使用原則
類里的絕大部分成員變量都應該使用private來修飾,只有一些static修飾的,類似全局變量的成員變量,才可能考慮使用public修飾,除此之外,有些方法只用于輔助實現該類的其他方法,這些工具方法也應該使用private修飾。
如果某個類型主要用作其他類的父類,該類里包含的大部分方法可能僅希望被其子類重寫,而不相被外界直接調用,則應該使用protected修飾。
希望暴露出來給其他類自由調用的方法應該使用public修飾,因此,類的構造器通過使用public修飾,從而允許在其他地方創建該類的實例。
JDK 1.5增加了靜態導入import static * ,用于導入制定類的某個靜態成員變量,方法或全部的靜態成員變量,方法。
使用import可以省略寫包名,import static 則連類名都可以省略。
深入構造器當系統開始執行構造器的執行體之前,系統已經創建了一個對象,只是這個對象還不能被外部程序訪問到,只能在該構造器中通過this來引用。當構造器的執行體執行結束后,這個對象作為構造器的返回值被返回,通常還會賦給另一個引用類型的變量,從而讓外部程序可以訪問該對象。
如果兩個構造器中有相同的代碼,可以提取相同的代碼到一個構造器,另一個構造器中用this來引用相同代碼的構造器。
類的繼承方法的重寫要遵循“兩同兩小一大”規則,兩同即方法名相同,參數列表相同,兩小即子類方法返回值類型應比父類方法返回值類型更小或相等,子類方法聲明拋出的異常類型比父類方法拋出的異常更小或相等,一大是子類方法的訪問權限應該比父類方法的訪問權限更大或相等。
在子類中調用父類中被覆蓋的方法,則可以使用super或者父類類名作為調用者來調用父類中被覆蓋的方法。
重載主要發生在同一個類的多個同名方法之間,重寫發生在子類和父類的同名方法之間。
如果需要在子類方法中調用父類被覆蓋的實例方法,則可使用super限定來調用父類被覆蓋的實例方法。
Super用于限定該對象調用它從父類得到的實例變量和方法。This和super 都不可以出現在類方法中。
如果在某個方法中訪問名為a的成員變量,但是沒有顯示指定調用者,那么系統的查找順序為:
查找該方法中是否有名為a 的局部變量
查找當前類中是否有名為a 的成員變量
查找a的直接父類中是否包含a的成員變量,依次上溯a的所有父類,未找到則編譯出錯。
當程序創建一個子類對象時,系統不僅會為該類中定義的實例變量分配內存,也會為它從父類繼承得到的所有實例變量分配內存,即使子類定義了與父類同名的實例變量。
子類調用父類構造器的情況
子類構造器顯示使用super來指定執行的父類構造器。
子類構造器中使用this來調用其它構造器,程序會執行另一個構造器之前調用父類構造器。
沒有super和this顯式調用,會默認調用父類的無參構造。
創建任何對象總是從該類所在繼承樹最頂層類的構造器開始執行,然后依次向下執行,最后才執行本類的構造器。
Java引用變量有兩種類型:一種是編譯時類型,一個是運行時類型。編譯時類型由聲明該變量時使用的類型決定。運行時類型由實際賦給該變量的對象決定,這就是所謂的多態。
對象的實例方法具有多態性,對象的實例變量則不具備多態性。
引用變量在編譯階段只能調用其編譯時類型所具有的方法,但運行時則執行他運行時類型所具有的方法。
通過引用變量來訪問其包含的實例變量時,系統總是試圖訪問他編譯時類型所定義的成員變量,而不是它運行時類型所定義的成員變量。
強制類型轉換:基本類型之間的轉換只能在數值類型之間進行,引用類型之間的轉換只能在具有繼承關系的兩個類型之間轉換。
Instanceof用于判斷前面的對象是否是后面的類。Instanceof運算符前面操作數的編譯時類型要么與后面的類相同,要么與后面的類具有父子繼承關系。A是否是B的子類。
繼承和組合繼承帶來的最大壞處就是破壞封裝。
設計父類遵循的規則
盡量隱藏父類的內部數據,盡量所有的成員變量都用private修飾,不會被子類隨意改變。
不要讓子類可以隨意訪問,修改父類的方法。父類中那些僅為輔助其他的工具方法,應該使用private修飾,如果希望被外部類調用,那么就使用public修飾,如果不希望子類重寫該方法,加final,如果允許子類重寫,那么protected。
盡量不要再父類構造器中調用將要被子類重寫的方法。
何時需要從父類派生新的子類問題??
子類需要額外增加屬性,而不僅僅是屬性值的改變。例如person 派生出student。
子類需要增加自己獨有的行為方式,包括增加新的方法或重寫父類的方法。
組合就是用一個個的類來描述一個整體的各個部分,然后用零散的類來組成一個完整的整體,對這個類進行更詳盡的描述。
用繼承還是組合??
對于Cat和Animal,繼承顯然更加合適,因為用一個動物組成一個Cat毫無意義,繼承是is-a關系,組合是has-a關系。
初始化塊初始化塊的修飾符只能是static,使用static修飾的代碼塊叫做靜態初始化塊,里面可以包含任何可執行語句。
當java創建一個對象時,系統先為該對象的所有實例變量分配內存,前提是該類已經被加載過了,接著程序開始對這些實例變量執行初始化,其初始化順序是,先執行初始化塊或者聲明實例變量時制定的初始值,在執行構造器里制定的初始值。
初始化塊總是在構造器之前執行。
實際上初始化塊是一個假象,使用javac命令編譯過后。該java類中的初始化塊會消失,初始化塊中代碼會被還原到每個構造器中,且位于構造器所有代碼的前面。
系統將會在類初始化階段執行靜態初始化塊,而不是在創建對象的時候才執行,因此靜態初始化塊總是比普通初始化塊先執行。
Java系統加載并初始化某個類時,總是保證該類的所有父類全部加載并初始化。
當JVM第一主動使用某一個類時,系統會在類準備階段為該類的所有靜態成員變量分配內存,在初始化階段則負責初始化這些靜態成員變量,初始化靜態成員變量就是執行類初始化代碼或者聲明類成員變量時制定的初始值,他們的執行順序與源代碼中的排列順序相同。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69293.html
摘要:對象既是該類事物實實在在存在的個體。類與對象的關系圖類就是汽車汽車就是堆內存中的對象。成員變量成員變量成員函數的車,輪胎數個,跑起來了對象的創建創建對象中創建對象,使用關鍵字在堆內存中開辟了空間,產生了一個實體。 聲明:本文首發于我的個人微信公眾號【Java編程社區】,查看更多文章與學習資源請移步我的公眾號Java編程社區 萬物皆對象 學習Java,我們都聽過這句話:萬物皆對象。那么什...
摘要:是一種典型的面向對象編程語言。這篇文章主要是來初步理解一下面向對象的思維為下面的內容先給一個基礎。針對面向對象編程的更多內容,會在后面的文章里面詳細解釋。他們都稱之為對象。之后,我們再用編程語言,把這種映射編寫出來,就是的面向對象編程啦。 showImg(https://segmentfault.com/img/remote/1460000012983458?w=900&h=500);...
摘要:眾多面向對象的編程思想雖不盡一致,但是無論哪種面向對象編程語言都具有以下的共通功能。原型編程以類為中心的傳統面向對象編程,是以類為基礎生成新對象。而原型模式的面向對象編程語言沒有類這樣一個概念。 什么是面向對象?這個問題往往會問到剛畢業的新手or實習生上,也是往往作為一個技術面試的開頭題。在這里我們不去談如何答(fu)好(yan)問(guo)題(qu),僅談談我所理解的面向對象。 從歷...
摘要:面向對象與面向過程的區別要知道,二者并不是非此即彼,而是相輔相成的。而面向過程,則在微觀上對對象內部進行具體的實現。面向對象的三大特性說到面向對象,就不得不說其三大特性封裝繼承和多態。封裝封裝是面向對象最基礎的特性。 作者:伯特出處:github.com/ruicbAndroid/LoulanPlan聲明:本文出自伯特的《LoulanPlan》,轉載務必注明作者及出處。 剛學習 Jav...
摘要:知識點總結面向對象知識點總結面向對象面向對象概念是相對于面向過程而言,過程其實就是函數,對象是將函數和屬性進行了封裝。指向了該對象關鍵字代表對象。靜態變量所屬于類,所以也稱為類變量成員變量存在于堆內存中。 Java知識點總結(面向對象) @(Java知識點總結)[Java, Java面向對象] [toc] 面向對象概念 是相對于面向過程而言,過程其實就是函數,對象是將函數和屬性進行了封...
摘要:最近在備戰面試的過程中,整理一下面試題。成員變量如果沒有被賦初值,則會自動以類型的默認值而賦值一種情況例外被修飾但沒有被修飾的成員變量必須顯示地賦值而局部變量則不會自動賦值。 最近在備戰面試的過程中,整理一下面試題。大多數題目都是自己手敲的,網上也有很多這樣的總結。自己感覺總是很亂,所以花了很久把自己覺得重要的東西總結了一下。 面向對象和面向過程的區別 面向過程: 優點:性能比面...
閱讀 3407·2021-11-25 09:43
閱讀 2294·2021-09-06 15:02
閱讀 3538·2021-08-18 10:21
閱讀 3340·2019-08-30 15:55
閱讀 2343·2019-08-29 17:06
閱讀 3534·2019-08-29 16:59
閱讀 962·2019-08-29 13:47
閱讀 2756·2019-08-26 13:24