摘要:因為通常把不使用修飾的成員變量和方法也稱為實例變量實例方法。形參個數(shù)可變的方法允許定義形參個數(shù)可變的參數(shù),從而允許為方法指定數(shù)量不確定的形參。方法返回值類型修飾符等,與方法重載沒有任何關(guān)系。
類和對象 定義類
面向?qū)ο蟮某绦蛟O(shè)計過程中有兩個重要概念:類(class)和對象(object,也被稱為實例,instance),其中類是某一批對象的抽象,可以把類理解成某種概念;對象才是一個具體存在的實體。
[修飾符] class 類名 { 零個到多個構(gòu)造器定義... 零個到多個成員變量... 零個到多個方法... }
修飾符可以是public、final、abstract或者完全忽略。
如果從程序的可讀性方面來看,Java類名必須由一個或多個有意義的單詞連綴而成的,每個單詞首字母大寫,其他字母全部小寫,單詞與單詞之間不要使用任何分隔符。
構(gòu)造器是一個類創(chuàng)建對象的根本途徑,如果一個類沒有構(gòu)造器,這個類通常無法創(chuàng)建實例。如果程序員沒有為一個類編寫構(gòu)造器,則系統(tǒng)會為該類提供一個默認的構(gòu)造器。一旦程序員為一個類提供了構(gòu)造器,系統(tǒng)將不再為該類提供構(gòu)造器。
定義成員變量static修飾的成員不能訪問沒有static修飾的成員。
成員變量用于定義該類或該類的實例所包含的狀態(tài)數(shù)據(jù),方法則用于定義該類或該類的實例的行為特征或者功能實現(xiàn)。構(gòu)造器用于構(gòu)造該類的實例,Java語言通過new關(guān)鍵字來調(diào)用構(gòu)造器,從而返回該類的實例。
[修飾符] 類型 成員變量名 [=默認值]
修飾符:public、protected、private三個最多只能出現(xiàn)其中之一,可以與static、final組合起來修飾成員變量。
類型:基本類型和引用類型
成員變量名:如果從程序的可讀性方面來看,Java類名必須由一個或多個有意義的單詞連綴而成的,第一個單詞首字母小寫,后面每個單詞首字母大寫,其他字母全部小寫,單詞與單詞之間不要使用任何分隔符。
默認值:定義成員變量還可以指定一個可選的默認值。
定義方法[修飾符] 方法返回值類型 方法名(形參列表) { //由零條到多條可執(zhí)行性語句組成的方法體 }
修飾符:public、protected、private三個最多只能出現(xiàn)其中之一,可以與static、final組合起來修飾成員變量。
方法返回值類型:基本類型和引用類型如果聲明了方法返回值類型,則方法體內(nèi)必須與此處聲明的類型匹配。如果一個方法沒有返回值,則必須使用void來聲明沒有返回值。
形參列表:形參列表用于定義該方法可以接受的參數(shù),形參列表由零組到多組“參數(shù)類型 形參名”組合而成,多組參數(shù)之間以英文逗號(,)隔開,形參類型和形參名之間以英文空格隔開。
staticstatic是一個特殊的關(guān)鍵字,可用于修飾方法、成員變量等成員。static修飾的成員表明它屬于這個類本身,而不屬于該類的單個實例,因為通常把static修飾的成員變量和方法也稱為類變量、類方法。不使用static修飾的普通方法、成員變量則屬于該類的單個實例,而不屬于該類。因為通常把不使用static修飾的成員變量和方法也稱為實例變量、實例方法。
static修飾的成員變量和方法稱為靜態(tài)變量和靜態(tài)方法,把不使用static修飾的成員變量和方法稱為非靜態(tài)變量和非靜態(tài)方法。靜態(tài)方法不能直接訪問非靜態(tài)成員。
有static修飾的成員屬于類本身,沒有static修飾的成員屬于該類的實例。
構(gòu)造器構(gòu)造器是一個特殊的方法,定義構(gòu)造器的語法格式與定義方法的語法格式很像,定義構(gòu)造器的語法格式如下:
[修飾符] 構(gòu)造器名(形參列表) { //由零條到多條可執(zhí)行性語句組成的構(gòu)造器執(zhí)行體 }
修飾符:public、protected、private
構(gòu)造器名:構(gòu)造器名必須和類同名
形參列表:和定義方法形參列表的格式完全相同。
構(gòu)造器既不能定義返回值類型,也不能使用void聲明構(gòu)造器沒有返回值。
static修飾的方法和成員變量,既可通過類來調(diào)用,也可通過實例來調(diào)用;沒有使用static修飾的普通方法和成員變量,只可通過實例來調(diào)用。
對象、引用和指針變量實例實際上是一個引用,它被存放在棧內(nèi)存里,指向?qū)嶋H的類對象;而真正的類對象則存放在堆內(nèi)存中。棧內(nèi)存里的引用變量并未真正存儲對象的成員變量,對象的成員變量數(shù)據(jù)實際存放在堆內(nèi)存里;而引用變量只是指向該堆內(nèi)存里的對象。
對象的this引用this關(guān)鍵字總是指向調(diào)用該方法的對象。根據(jù)this出現(xiàn)位置的不同,this作為對象的默認引用有兩種情形。
構(gòu)造器中引用該構(gòu)造器正在初始化的對象。
在方法中引用調(diào)用該方法的對象。
對于static修飾的方法而言,則可以使用類來直接調(diào)用該方法,如果在static修飾的方法中使用this關(guān)鍵字,則這個關(guān)鍵字就無法指向合適的對象。所以,static修飾的方法中不能使用this引用。由于static修飾的方法不能使用this引用,所以static修飾的方法不能訪問不使用static修飾的普通成員,因此Java語法規(guī)定:靜態(tài)成員不能直接訪問非靜態(tài)成員。
普通方法訪問其他方法、成員變量時無須使用this前綴,但如果方法里有個局部變量和成員變量同名,但程序又需要在該方法里訪問這個被覆蓋的成員變量,則必須使用this前綴。this引用也可以用于構(gòu)造器中作為默認引用,由于構(gòu)造器是直接使用new關(guān)鍵字來調(diào)用,而不是使用對象來調(diào)用的,所以this在構(gòu)造器中代表該構(gòu)造器正在初始化的對象。
方法詳解 方法的所屬性Java語言里方法的所屬性主要體現(xiàn)在如下幾個方面:
方法不能獨立完成,方法只能在類體里定義。
從邏輯意義上來看,方法要么屬于該類本身,要么屬于該類的一個對象。
永遠不能獨立執(zhí)行方法,執(zhí)行方法必須使用類或?qū)ο笞鳛檎{(diào)用者。
同一個類的一個方法調(diào)用另一個方法時,如果被調(diào)用方法是普通方法,則默認使用this作為調(diào)用者;如果被調(diào)方法是靜態(tài)方法,則默認方法類作為調(diào)用者。
方法的參數(shù)傳遞機制聲明方法時包含了形參聲明,則調(diào)用方法時必須給這些形參指定參數(shù)值,調(diào)用方法時實際傳給形參的參數(shù)值也被稱為實參。
形參個數(shù)可變的方法Java允許定義形參個數(shù)可變的參數(shù),從而允許為方法指定數(shù)量不確定的形參。如果在定義方法時,在最后一個形參的類型后增加三點(...),則表明該形參可以接受多個參數(shù)值,多個參數(shù)值被當(dāng)成數(shù)組傳入。
public statci void test(int a, String ... books)
數(shù)組形式的形參可以處于形參列表的任意位置,但個數(shù)可變的形參只能處于形參列表的最后。也就是說一個方法中最多只能有一個長度可變的形參。
遞歸方法一個方法體內(nèi)調(diào)用它自身,被稱為方法遞歸。方法遞歸包含了一種隱式的循環(huán),它會重復(fù)執(zhí)行某段代碼,但這種重復(fù)執(zhí)行無限循環(huán)控制。
希望遍歷某個路徑下的所有文件,但這個路徑下文件夾的深度是未知的,那么就可以使用遞歸來實現(xiàn)這個需求。系統(tǒng)可定義一個方法,該方法接受一個文件路徑作為參數(shù),該方法可遍歷當(dāng)前路徑下的所有文件和文件路徑——該方法中再次調(diào)用該方法本身來處理該路徑下的所有文件路徑。
方法重載Java允許同一個類里定義多個同名方法,只有形參列表不同就行。如果同一個類中包含了兩個或兩個以上方法的方法名相同,但形參列表不同,則被稱為方法重載。
方法重載三個因素:
調(diào)用者,也就是方法的所屬者,既可以是類,也可以是對象。
方法名,方法的標識。
形參列表,當(dāng)調(diào)用方法時,系統(tǒng)將會根據(jù)傳入的實參列表匹配。
兩同一不同:同一個類中方法名相同,參數(shù)列表不同。方法返回值類型、修飾符等,與方法重載沒有任何關(guān)系。
成員變量和局部變量 成員變量成員變量指的是類里定義的變量,也就是前面所介紹的field;局部變量指的是方法里定義的變量。
成員變量:一個類不能定義兩個同名的成員變量。
static修飾的類變量。類變量從該類的準備階段起開始存在,直到系統(tǒng)完全銷毀這個類,類變量的作用域與這個類的生存范圍相同;而實例變量則從該類的實例被創(chuàng)建起開始存在,直到系統(tǒng)完全銷毀這個實例,實例變量的作用域與對應(yīng)實例的生存范圍相同。
成員變量無須顯式初始化,只要為一個類定義了類變量或?qū)嵗兞浚到y(tǒng)就會在這個類的準備階段或創(chuàng)建該類的實例時進行默認初始化,成員變量默認初始化時的賦值規(guī)則與數(shù)組動態(tài)初始化時數(shù)組元素的賦值規(guī)則完全相同。
局部變量:一個方法里不能定義兩個同名的方法局部變量,方法局部變量與形參也不能同名;同一個方法中不同代碼塊內(nèi)的代碼塊局部變量可以同名;如果先定義代碼塊局部變量,后定義方法局部變量,前面定義的代碼塊局部變量與后面定義的方法局部變量也可以同名。
形參(方法簽名中定義的變量) 作用域在整個方法內(nèi)有效 必須顯式初始化
方法局部變量(在方法內(nèi)定義) 作用域從定義該變量的地方生效,到該方法結(jié)束時失效 必須顯式初始化
代碼塊局部變量(在代碼塊內(nèi)定義) 作用域從定義該變量的地方生效,到該代碼塊結(jié)束時失效 無須顯式初始化
Java允許局部變量和成員變量同名,如果方法里的局部變量和成員變量同名,局部變量會覆蓋成員變量,如果需要在這個方法里引用被覆蓋的成員變量,則可使用this(對于實例變量)或類名(對于類變量)作為調(diào)用者來限定訪問成員變量。
成員變量的初始化和內(nèi)存中的運行機制當(dāng)系統(tǒng)加載類或創(chuàng)建該類的實例時,系統(tǒng)自動為成員變量分配內(nèi)存空間,并在分配內(nèi)存空間后,自動為成員變量指定初始值。
局部變量的初始化和內(nèi)存中的運行機制局部變量定義后,必須經(jīng)過顯式初始化后才能使用,系統(tǒng)不會為局部變量執(zhí)行初始化。這意味著定義局部變量后,系統(tǒng)并未為這個變量分配內(nèi)存空間,直到等到程序為這個變量賦初始值時,系統(tǒng)才會為局部變量分配內(nèi)存,并將初始值保存到這塊內(nèi)存中。
變量的使用規(guī)則定義一個成員變量時,成員變量將被放置到堆內(nèi)存中,成員變量的作用域?qū)U大到類存在范圍或者對象存在范圍,這種范圍的擴大有兩個害處。
增大了變量的生存時間,這將導(dǎo)致更大的內(nèi)存開銷。
擴大了變量的作用域,這不利于提供程序的內(nèi)聚性。
應(yīng)該考慮使用成員變量的情況:
如果需要定義的變量是用于描述某個類或某個對象的固有信息。
如果在某個類中需要以一個變量來保存該類或者實例運行時的狀態(tài)信息。
如果某個信息需要在某個類的多個方法之間進行共享,則這個信息應(yīng)該使用成員變量來保存。
即使在程序中使用局部變量,也應(yīng)該盡可能地縮小局部變量的作用范圍,局部變量的作用范圍越小,它在內(nèi)存里停留的時間就越短,程序運行性能就越好。因此,能用代碼塊局部變量的地方,就堅決不要使用方法局部變量。
隱藏和封裝 理解封裝封裝指的是將對象的狀態(tài)信息隱藏在對象內(nèi)部,不允許外部程序直接訪問對象內(nèi)部信息,二世通過該類所提供的方法來實現(xiàn)對內(nèi)部信息的操作和訪問。
對一個類或?qū)ο髮崿F(xiàn)良好的封裝,可以實現(xiàn)以下目的。
隱藏類的實現(xiàn)細節(jié)
讓使用者只能通過事先預(yù)定的方法來訪問數(shù)據(jù),從而可以在該方法里加入控制邏輯,限制對成員變量的不合理訪問。
可進行數(shù)據(jù)檢查,從而有利于保證對象信息的完整性。
便于修改,提高代碼的可維護性。
為了實現(xiàn)良好的封裝,需要從兩個方面考慮:
將對象的成員變量和實現(xiàn)細節(jié)隱藏起來,不允許外部直接訪問。
把方法暴露出來,讓方法來控制對這些成員變量進行安全的訪問和操作。
使用訪問控制符private → default → protected → public
訪問控制級別由小到大
private(當(dāng)前類訪問權(quán)限):使用它來修飾成員變量就可以把成員變量隱藏在該類的內(nèi)部。
default(包訪問權(quán)限):defaulte訪問控制的成員或外部類可以被相同包下的其他類訪問。
protected(子類訪問權(quán)限):成員既可以被同一包中的其他類訪問,也可以被不同包中的子類訪問。通常,如果使用protected來修飾一個方法,是希望其子類來重寫這個方法。
public(公共訪問權(quán)限):成員或外部類可以被所以類訪問,不管訪問類和被訪問類是否處于同一包中,是否具有父子繼承關(guān)系。
private default protected public 同一個類中 √ √ √ √ 同一個包中 √ √ √ 子類中 √ √ 全局范圍內(nèi) √
外部類只能有兩種訪問控制級別:public和default,外部類不能用private和protected修飾,因為外部類沒有處于任何類內(nèi)部,也就沒有其所在類的內(nèi)部、所在類的子類的兩個范圍。
如果一個Java類的每個實例變量都被使用private修飾,并為每個實例變量都提供了public修飾setter和getter方法,那么這個類就是一個符號JavaBean規(guī)范的類。因此,JavaBean總是一個封裝良好的類。
進行程序設(shè)計時,應(yīng)盡量避免一個模塊直接操作和訪問另一個模塊的數(shù)據(jù),模塊設(shè)計追求高內(nèi)聚(盡可能把模塊的內(nèi)部數(shù)據(jù)、功能實現(xiàn)細節(jié)隱藏在模塊內(nèi)部獨立完成,不允許外部直接干預(yù))、低耦合(僅暴露少量的方法給外部使用)。
訪問控制符的使用的基本原則:
類里的絕大部分成員變量都應(yīng)該使用private,只有一些static修飾的、類似全局變量的成員變量,才可能考慮使用public修飾。除此之外,有些方法只用于輔助實現(xiàn)該類的其他方法,這些方法被稱為工具方法,工具方法也應(yīng)該使用private修飾。
如果某個類主要用作其他類的父類,該類里包含的大部分方法可能僅希望被其子類重寫,而不想被外界直接調(diào)用,則應(yīng)該使用protected修飾這些方法。
希望暴露出來給其他類自由調(diào)用的方法應(yīng)該使用public修飾。因此,類的構(gòu)造器通過public修飾,從而允許在其他地方創(chuàng)建該類的實例。因為外部類通常都希望被其他類自由使用,所以大部分外部類都使用public修飾。
package、import和import static如果希望把一個類放到指定的包結(jié)構(gòu)下,應(yīng)該在Java源程序的第一個非注釋行放置如下格式的代碼:
package packageName;
一旦在Java源文件中使用了這個package語句,就意味著該源文件里定義的所有類都屬于這個包。位于包中的每個類的完整類名都應(yīng)該是包名和類名的組合,如果其他人需要使用該包下的類,也應(yīng)該使用包名加類名的組合。
同一個包中的類不必位于相同的目錄下,例如有l(wèi)eePerson和LeePersonTest兩個類,它們完全可以一個位于C盤下某個位置,一個位于D盤下某個位置,只要讓CLASSPATH環(huán)境變量里包含這兩個路徑即可。虛擬機會自動搜索CLASSPATH下的子路徑,把它們當(dāng)成同一個包下的類來處理。也應(yīng)該把Java源文件放在與包名一致的目錄結(jié)構(gòu)下。通常建議將源文件和class文件分開存放,以便管理。
從可讀性規(guī)范角度來看,包名應(yīng)該全部是小寫字母,而且應(yīng)該由一個或多個有意義的單詞連綴而成。
package語句必須作為源文件的第一條非注釋性語句,一個源文件只能指定一個包,即只能包含一條package語句,該源文件中可以定義多個類,則這些類將全部位于該包下。如果沒有顯式指定package語言,則處于默認包下。
同一個包下的類可以自由訪問,無須添加包前綴。
父包和子包之間確實表示了某種內(nèi)在的邏輯關(guān)系。但父包和子包在用法上不存在任何關(guān)系,如果父包中的類需要使用子包中的類,則必須使用子包的全名,而不能省略父包部分。
//調(diào)用構(gòu)造器時需要在構(gòu)造器前添加包前綴 lee.sub.Apple a = new lee.sub.Apple();import關(guān)鍵字
import可以向某個Java文件中導(dǎo)入指定包層次下某個類或全部類,import語句應(yīng)該出現(xiàn)在package語句之后(如果有)、類定義之前。一個Java源文件只能包含一個package語句,但可以包含多個import語句,多個import語句用于導(dǎo)入多個包層次下的類。java.lang包下的所有類默認導(dǎo)入。
//使用import語句導(dǎo)入單個類 import package.subpackage...ClassName; //使用import語句導(dǎo)入指定包下全部 import package.subpackage.*
星號()只能代表類,不能代表包。因此使用import.lee.;語句時,它表明導(dǎo)入lee包下的所有類,而lee包下sub子包內(nèi)的類則不會被導(dǎo)入。如需導(dǎo)入lee.sub.Apple類,則可以使用impor.lee.sub.*;語句來導(dǎo)入lee.sub包下的所有類。
一旦在Java源文件中使用import語句來導(dǎo)入指定類,在該源文件中使用這些類時就可以省略包前綴,不再需要使用類全名。
靜態(tài)導(dǎo)入import static
import static package.subpackage..ClassName.fieldName|methodName; field:靜態(tài)成員變量;methodName:靜態(tài)方法。 使用import可以省略寫包名;使用import static則可以連類名都省略。
Java源文件的大致結(jié)構(gòu):
package語句 //0個或1個,必須放在文件開始 import | import static 語句 //0個或多個,必須放在所有類定義之前 public classDefinition | interfaceDefinition | enumDefinition //0個或1個public類、接口或枚舉定義 classDefinition | interfaceDefinition | enumDefinition //0個或多個普通類、接口或枚舉定義Java的常用包
Java.lang:核心類,如String、Math、System和thread類等,使用這個包下的類無須使用import語句導(dǎo)入,系統(tǒng)會自動導(dǎo)入這個包下的所有類。 java.util:Java的大量工具類/接口和集合框架類/接口,例如Arrays和List、Set等 java.net:一些Java網(wǎng)絡(luò)編程相關(guān)的類/接口 java.io:一些Java輸入/輸出編程相關(guān)的類/接口 java.text:一些Java格式化相關(guān)的類 java.sql:Java進行JDBC數(shù)據(jù)庫編程的想相關(guān)類/接口 java.awt:抽象窗口工具集的相關(guān)類/接口,這些類主要用于構(gòu)建圖形用戶界面GUI程序 java.swing:Swing圖形用戶界面編程的相關(guān)類/接口,這些類可用于構(gòu)建平臺無關(guān)的GUI程序
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66847.html
摘要:面向?qū)ο笏季S方式將復(fù)雜的問題簡單化。給對象起個名字。是類類型的變量。通過已有的對象調(diào)用該對象的功能。格式對象對象成員可以該對象的屬性賦值。這時會有兩個引用同時指向堆中的同一個對象。對象,用于描述現(xiàn)實中的個體,它是類的實例。 01面向?qū)ο蠛兔嫦蜻^程的思想 * A: 面向過程與面向?qū)ο蠖际俏覀兙幊讨校帉懗绦虻囊环N思維方式 * a: 面向過程的程序設(shè)計方式,是遇到一件事時,思考我該...
摘要:面向?qū)ο笈c面向過程的區(qū)別要知道,二者并不是非此即彼,而是相輔相成的。而面向過程,則在微觀上對對象內(nèi)部進行具體的實現(xiàn)。面向?qū)ο蟮娜筇匦哉f到面向?qū)ο螅筒坏貌徽f其三大特性封裝繼承和多態(tài)。封裝封裝是面向?qū)ο笞罨A(chǔ)的特性。 作者:伯特出處:github.com/ruicbAndroid/LoulanPlan聲明:本文出自伯特的《LoulanPlan》,轉(zhuǎn)載務(wù)必注明作者及出處。 剛學(xué)習(xí) Jav...
摘要:面向?qū)ο笏枷敫攀隽私饷嫦驅(qū)ο箝_發(fā)就是不斷的創(chuàng)建對象,使用對象,指揮對象做事情。面向?qū)ο笤O(shè)計其實就是在管理和維護對象之間的關(guān)系。建議文件名稱和測試類名稱一致。 1.面向?qū)ο笏枷敫攀?了解) A:面向?qū)ο箝_發(fā)就是不斷的創(chuàng)建對象,使用對象,指揮對象做事情。 B:面向?qū)ο笤O(shè)計其實就是在管理和維護對象之間的關(guān)系。 C:面向?qū)ο筇卣鞣庋b(encapsulation)、繼承(inheritance...
摘要:面向?qū)ο缶幊趟枷朊嫦驅(qū)ο螅唵蝸碚f就是由動作的執(zhí)行者變?yōu)閯幼鞯牟倏卣摺C嫦驅(qū)ο笫窍鄬τ诿嫦蜻^程的。面向?qū)ο笕筇卣髅嫦驅(qū)ο笥腥筇卣鳎捶庋b繼承和多態(tài)。接口和抽象類接口接口名方法方法,默認修飾符為,不能用其他修飾符修飾接口。 面向?qū)ο缶幊趟枷?面向?qū)ο螅唵蝸碚f就是由動作的執(zhí)行者變?yōu)閯幼鞯牟倏卣摺=Y(jié)合具體例子來說就是使用某個人或者工具所具有的功能而不用去管功能的具體實現(xiàn)方式。例如現(xiàn)實中...
摘要:眾多面向?qū)ο蟮木幊趟枷腚m不盡一致,但是無論哪種面向?qū)ο缶幊陶Z言都具有以下的共通功能。原型編程以類為中心的傳統(tǒng)面向?qū)ο缶幊蹋且灶悶榛A(chǔ)生成新對象。而原型模式的面向?qū)ο缶幊陶Z言沒有類這樣一個概念。 什么是面向?qū)ο螅窟@個問題往往會問到剛畢業(yè)的新手or實習(xí)生上,也是往往作為一個技術(shù)面試的開頭題。在這里我們不去談如何答(fu)好(yan)問(guo)題(qu),僅談?wù)勎宜斫獾拿嫦驅(qū)ο蟆?從歷...
閱讀 1376·2021-11-04 16:11
閱讀 3036·2021-10-12 10:11
閱讀 2969·2021-09-29 09:47
閱讀 1608·2021-09-22 15:40
閱讀 1007·2019-08-29 15:43
閱讀 2798·2019-08-29 13:50
閱讀 1572·2019-08-29 13:28
閱讀 2685·2019-08-29 12:54