成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java面向對象(上)

liaosilzu2007 / 3560人閱讀

摘要:根據(jù)出現(xiàn)的位置,作為對象的默認引用有兩種情形構造器中引用該構造器正在初始化的對象。在構造器中代表該構造器正在初始化的對象。用于限定該對象調用它從父類得到的實例變量和方法。

子類繼承父類就可以繼承到父類的成員變量和方法。如果訪問控制允許,子類實例可以直接調用父類里定義的方法。

如果多個重載的構造器里包含了相同的初始化代碼,則可以把這些初始化代碼放置在普通代碼塊里完成,初始化塊總在構造器執(zhí)行之前被調用。

靜態(tài)初始化塊用于初始化類,在類初始化階段被執(zhí)行。

如果繼承樹里的某一個類需要被初始化時,系統(tǒng)將會同時初始化該類的所有父類。

類和對象

Static修飾的成員表明它屬于這個類本身,而不屬于該類的單個實例,因為通常把static修飾的成員變量和方法也稱為類變量,類方法。

通常把不使用static修飾的成員變量和方法也稱為實例變量和實例方法。

靜態(tài)成員不能直接訪問非靜態(tài)成員。

Static真正的作用就用于區(qū)分成員變量,方法,內部類,初始化塊這四種成員到底屬于類本身還是屬于實例。

產生的實例變量是在內存中存儲的。

引用變量里存放的僅僅是一個引用,他指向實際的對象。

This關鍵字總是指向調用該方法的對象。

根據(jù)this出現(xiàn)的位置,this作為對象的默認引用有兩種情形:

- 構造器中引用該構造器正在初始化的對象。
- 在方法中引用調用該方法的對象。

This可以代表任何對象,當this出現(xiàn)在某個方法體中時,他所代表的對象是不確定的,但它的類型是確定的:他所代表的只能是當前類的實例,只有當這個方法被調用時,他所代表的對象才被確定下來,誰在調用這個方法,this就是誰。

Static修飾的方法中不能使用this引用。

靜態(tài)成員不能訪問非靜態(tài)成員。

Java編程中不要使用對象去調用static修飾的成員變量,方法,而是應該使用類去調用static修飾的成員變量,方法。

如果確實需要在靜態(tài)方法中訪問另一個普通方法,只能創(chuàng)建對象。

如果方法中有個局部變量和成員變量同名,但程序又需要再該方法里訪問這個被覆蓋的成員變量,則必須使用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作為調用者。如果被調方法是靜態(tài)方法,則默認使用類作為調用者。

Java里方法的傳遞方式只有一種:值傳遞。所謂值傳遞就是將實際參數(shù)值的副本傳入方法內,而且參數(shù)本身不會收到任何影響。

Java中的基本類型的參數(shù)傳遞,和引用類型的傳遞都是值傳遞,對于引用類型的傳遞也是將原來的對象的地址復制一份給參數(shù),這時候就是原來對象和參數(shù)的地址是一樣的,都指向了同一個堆內存中的對象,對原來對象或者參數(shù)任何一方賦值null都不會影響另一方。

數(shù)組形式的形參可以處理形參列表的任意位置,但和數(shù)可變的形參只能處于形參列表的最后。

遞歸一定要向已知方向遞歸。

一個類中包含了兩個或者兩個以上的方法名相同而形參不同則被稱為方法重載。

如果需要調用test(String ...
books)方法,又只想傳入一個字符串參數(shù),則可采用傳入字符串數(shù)組的形式:object.test(new
String[]{“TEST”});

方法重載的要求:同一個類中方法名相同,形參列表不同。

Java中不能使用方法返回值類型作為區(qū)分方法重載的依據(jù)。

成員變量和局部變量

成員變量指的是在類里定義的變量,也就是field,局部變量就是在方法里定義的變量.

所有變量
成員變量
實例變量,不以static修飾
類變量,static修飾的
局部變量
代碼塊局部變量,在代碼塊中定義的
方法局部變量,在方法內定義
形參,方法簽名中定義的變量

類變量從該類的準備階段起開始存在,直到系統(tǒng)完全銷毀這個類,類變量的作用域與這個類的生存范圍相同;而實例變量則從該類的實例被創(chuàng)建起開始存在,知道系統(tǒng)完全銷毀這個實例,實例變量的作用域與對應實例的生存范圍相同。

成員變量無需顯示初始化,只要為了一個類定義了類變量或實例變量,系統(tǒng)就會在這個類的準備階段或者創(chuàng)建該類的實例時進行默認初始化,成員變量默認初始化時的賦值規(guī)則與數(shù)組動態(tài)初始化時數(shù)組元素的賦值規(guī)則完全相同。

與成員變量不同的是,局部變量除形參之外,都必須顯示初始化。必須先給方法局部變量和代碼塊局部變量指定初始值,否則不可以訪問他們。

當系統(tǒng)加載類或者創(chuàng)建該類的實例時,系統(tǒng)自動為成員變量分配內存空間,并在分配內存空間后,自動為成員變量指定初始值。

在程序中使用局部變量,也應該盡可能的所有局部變量的作用范圍,作用范圍越小,他在內存中停留的時間也就越短,程序運行性能就越好。

什么情況下考慮使用成員變量??

如果需要定義的變量是用于描述某個類或某個對象的固有信息,例如人的身高,因為每個人都必須具有這些信息,這時候就可以定義成成員變量,如果此變量對于這個類的所有實例都是相同的,如眼睛的數(shù)量,那么他就可以考慮定義成為類變量。

如果某個類中需要以一個變量來保存該類或者實例運行時的狀態(tài)信息,例如五子棋棋盤的數(shù)組,這種用于保存某個類或某個實例狀態(tài)信息的變量通常應該使用成員變量。

如果某個信息需要在某個類的多個方法之間進行共享,則這個信息應該使用成員變量來保存。

隱藏和封裝

為了實現(xiàn)良好的封裝,需要考慮兩方面

將對象的成員變量和實現(xiàn)細節(jié)隱藏起來,不允許外部直接訪問。

把方法暴露出來,讓方法來控制對這些成員變量進行安全的訪問和操作。

訪問控制修飾符

private:當前類訪問權限

default:包訪問權限

protected:子類訪問權限

public:公共訪問權限

訪問控制修飾符的使用原則

類里的絕大部分成員變量都應該使用private來修飾,只有一些static修飾的,類似全局變量的成員變量,才可能考慮使用public修飾,除此之外,有些方法只用于輔助實現(xiàn)該類的其他方法,這些工具方法也應該使用private修飾。

如果某個類型主要用作其他類的父類,該類里包含的大部分方法可能僅希望被其子類重寫,而不相被外界直接調用,則應該使用protected修飾。

希望暴露出來給其他類自由調用的方法應該使用public修飾,因此,類的構造器通過使用public修飾,從而允許在其他地方創(chuàng)建該類的實例。

JDK 1.5增加了靜態(tài)導入import static * ,用于導入制定類的某個靜態(tài)成員變量,方法或全部的靜態(tài)成員變量,方法。

使用import可以省略寫包名,import static 則連類名都可以省略。

深入構造器

當系統(tǒng)開始執(zhí)行構造器的執(zhí)行體之前,系統(tǒng)已經創(chuàng)建了一個對象,只是這個對象還不能被外部程序訪問到,只能在該構造器中通過this來引用。當構造器的執(zhí)行體執(zhí)行結束后,這個對象作為構造器的返回值被返回,通常還會賦給另一個引用類型的變量,從而讓外部程序可以訪問該對象。

如果兩個構造器中有相同的代碼,可以提取相同的代碼到一個構造器,另一個構造器中用this來引用相同代碼的構造器。

類的繼承

方法的重寫要遵循“兩同兩小一大”規(guī)則,兩同即方法名相同,參數(shù)列表相同,兩小即子類方法返回值類型應比父類方法返回值類型更小或相等,子類方法聲明拋出的異常類型比父類方法拋出的異常更小或相等,一大是子類方法的訪問權限應該比父類方法的訪問權限更大或相等。

在子類中調用父類中被覆蓋的方法,則可以使用super或者父類類名作為調用者來調用父類中被覆蓋的方法。

重載主要發(fā)生在同一個類的多個同名方法之間,重寫發(fā)生在子類和父類的同名方法之間。

如果需要在子類方法中調用父類被覆蓋的實例方法,則可使用super限定來調用父類被覆蓋的實例方法。

Super用于限定該對象調用它從父類得到的實例變量和方法。This和super 都不可以出現(xiàn)在類方法中。

如果在某個方法中訪問名為a的成員變量,但是沒有顯示指定調用者,那么系統(tǒng)的查找順序為:

查找該方法中是否有名為a 的局部變量

查找當前類中是否有名為a 的成員變量

查找a的直接父類中是否包含a的成員變量,依次上溯a的所有父類,未找到則編譯出錯。

當程序創(chuàng)建一個子類對象時,系統(tǒng)不僅會為該類中定義的實例變量分配內存,也會為它從父類繼承得到的所有實例變量分配內存,即使子類定義了與父類同名的實例變量。

子類調用父類構造器的情況

子類構造器顯示使用super來指定執(zhí)行的父類構造器。

子類構造器中使用this來調用其它構造器,程序會執(zhí)行另一個構造器之前調用父類構造器。

沒有super和this顯式調用,會默認調用父類的無參構造。

創(chuàng)建任何對象總是從該類所在繼承樹最頂層類的構造器開始執(zhí)行,然后依次向下執(zhí)行,最后才執(zhí)行本類的構造器。

Java引用變量有兩種類型:一種是編譯時類型,一個是運行時類型。編譯時類型由聲明該變量時使用的類型決定。運行時類型由實際賦給該變量的對象決定,這就是所謂的多態(tài)。

對象的實例方法具有多態(tài)性,對象的實例變量則不具備多態(tài)性。

引用變量在編譯階段只能調用其編譯時類型所具有的方法,但運行時則執(zhí)行他運行時類型所具有的方法。

通過引用變量來訪問其包含的實例變量時,系統(tǒng)總是試圖訪問他編譯時類型所定義的成員變量,而不是它運行時類型所定義的成員變量。

強制類型轉換:基本類型之間的轉換只能在數(shù)值類型之間進行,引用類型之間的轉換只能在具有繼承關系的兩個類型之間轉換。

Instanceof用于判斷前面的對象是否是后面的類。Instanceof運算符前面操作數(shù)的編譯時類型要么與后面的類相同,要么與后面的類具有父子繼承關系。A是否是B的子類。

繼承和組合

繼承帶來的最大壞處就是破壞封裝。

設計父類遵循的規(guī)則

盡量隱藏父類的內部數(shù)據(jù),盡量所有的成員變量都用private修飾,不會被子類隨意改變。

不要讓子類可以隨意訪問,修改父類的方法。父類中那些僅為輔助其他的工具方法,應該使用private修飾,如果希望被外部類調用,那么就使用public修飾,如果不希望子類重寫該方法,加final,如果允許子類重寫,那么protected。

盡量不要再父類構造器中調用將要被子類重寫的方法。

何時需要從父類派生新的子類問題??

子類需要額外增加屬性,而不僅僅是屬性值的改變。例如person 派生出student。

子類需要增加自己獨有的行為方式,包括增加新的方法或重寫父類的方法。

組合就是用一個個的類來描述一個整體的各個部分,然后用零散的類來組成一個完整的整體,對這個類進行更詳盡的描述。

用繼承還是組合??

對于Cat和Animal,繼承顯然更加合適,因為用一個動物組成一個Cat毫無意義,繼承是is-a關系,組合是has-a關系。

初始化塊

初始化塊的修飾符只能是static,使用static修飾的代碼塊叫做靜態(tài)初始化塊,里面可以包含任何可執(zhí)行語句。

當java創(chuàng)建一個對象時,系統(tǒng)先為該對象的所有實例變量分配內存,前提是該類已經被加載過了,接著程序開始對這些實例變量執(zhí)行初始化,其初始化順序是,先執(zhí)行初始化塊或者聲明實例變量時制定的初始值,在執(zhí)行構造器里制定的初始值。

初始化塊總是在構造器之前執(zhí)行。

實際上初始化塊是一個假象,使用javac命令編譯過后。該java類中的初始化塊會消失,初始化塊中代碼會被還原到每個構造器中,且位于構造器所有代碼的前面。

系統(tǒng)將會在類初始化階段執(zhí)行靜態(tài)初始化塊,而不是在創(chuàng)建對象的時候才執(zhí)行,因此靜態(tài)初始化塊總是比普通初始化塊先執(zhí)行。

Java系統(tǒng)加載并初始化某個類時,總是保證該類的所有父類全部加載并初始化。

當JVM第一主動使用某一個類時,系統(tǒng)會在類準備階段為該類的所有靜態(tài)成員變量分配內存,在初始化階段則負責初始化這些靜態(tài)成員變量,初始化靜態(tài)成員變量就是執(zhí)行類初始化代碼或者聲明類成員變量時制定的初始值,他們的執(zhí)行順序與源代碼中的排列順序相同。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/69293.html

相關文章

  • Java學習筆記——面向對象

    摘要:對象既是該類事物實實在在存在的個體。類與對象的關系圖類就是汽車汽車就是堆內存中的對象。成員變量成員變量成員函數(shù)的車,輪胎數(shù)個,跑起來了對象的創(chuàng)建創(chuàng)建對象中創(chuàng)建對象,使用關鍵字在堆內存中開辟了空間,產生了一個實體。 聲明:本文首發(fā)于我的個人微信公眾號【Java編程社區(qū)】,查看更多文章與學習資源請移步我的公眾號Java編程社區(qū) 萬物皆對象 學習Java,我們都聽過這句話:萬物皆對象。那么什...

    DoINsiSt 評論0 收藏0
  • 7. 初步理解面向對象 【連載 7】

    摘要:是一種典型的面向對象編程語言。這篇文章主要是來初步理解一下面向對象的思維為下面的內容先給一個基礎。針對面向對象編程的更多內容,會在后面的文章里面詳細解釋。他們都稱之為對象。之后,我們再用編程語言,把這種映射編寫出來,就是的面向對象編程啦。 showImg(https://segmentfault.com/img/remote/1460000012983458?w=900&h=500);...

    keelii 評論0 收藏0
  • 談談我所理解的面向對象

    摘要:眾多面向對象的編程思想雖不盡一致,但是無論哪種面向對象編程語言都具有以下的共通功能。原型編程以類為中心的傳統(tǒng)面向對象編程,是以類為基礎生成新對象。而原型模式的面向對象編程語言沒有類這樣一個概念。 什么是面向對象?這個問題往往會問到剛畢業(yè)的新手or實習生上,也是往往作為一個技術面試的開頭題。在這里我們不去談如何答(fu)好(yan)問(guo)題(qu),僅談談我所理解的面向對象。 從歷...

    avwu 評論0 收藏0
  • 夯實Java:從面向對象說起

    摘要:面向對象與面向過程的區(qū)別要知道,二者并不是非此即彼,而是相輔相成的。而面向過程,則在微觀上對對象內部進行具體的實現(xiàn)。面向對象的三大特性說到面向對象,就不得不說其三大特性封裝繼承和多態(tài)。封裝封裝是面向對象最基礎的特性。 作者:伯特出處:github.com/ruicbAndroid/LoulanPlan聲明:本文出自伯特的《LoulanPlan》,轉載務必注明作者及出處。 剛學習 Jav...

    hearaway 評論0 收藏0
  • Java知識點總結(面向對象

    摘要:知識點總結面向對象知識點總結面向對象面向對象概念是相對于面向過程而言,過程其實就是函數(shù),對象是將函數(shù)和屬性進行了封裝。指向了該對象關鍵字代表對象。靜態(tài)變量所屬于類,所以也稱為類變量成員變量存在于堆內存中。 Java知識點總結(面向對象) @(Java知識點總結)[Java, Java面向對象] [toc] 面向對象概念 是相對于面向過程而言,過程其實就是函數(shù),對象是將函數(shù)和屬性進行了封...

    itvincent 評論0 收藏0
  • 超詳細的Java面試題總結(一)之Java基礎知識篇

    摘要:最近在備戰(zhàn)面試的過程中,整理一下面試題。成員變量如果沒有被賦初值,則會自動以類型的默認值而賦值一種情況例外被修飾但沒有被修飾的成員變量必須顯示地賦值而局部變量則不會自動賦值。   最近在備戰(zhàn)面試的過程中,整理一下面試題。大多數(shù)題目都是自己手敲的,網上也有很多這樣的總結。自己感覺總是很亂,所以花了很久把自己覺得重要的東西總結了一下。 面向對象和面向過程的區(qū)別 面向過程:  優(yōu)點:性能比面...

    vpants 評論0 收藏0

發(fā)表評論

0條評論

liaosilzu2007

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<