1. 程式人生 > 程式設計 >Java面向物件基礎,類,變數,方法

Java面向物件基礎,類,變數,方法

一、面向物件的4個基本特徵

抽象性、封裝性、繼承性和多型性。

抽象性分為過程抽象和資料抽象。

封裝性

封裝將資料以及加在這些資料上的操作組織在一起,成為有獨立意義的構件。外部無法直接訪問封裝的資料,從而保證了這些資料的正確性。
如果外部需要訪問類裡面的資料,就必須通過介面。介面規定了可對一個特定的物件發出哪些請求。

繼承性

繼承是一種聯結的層次模型,並允許和鼓勵類的重用,它提供給了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類)。

多型性

多型是指允許不同類的物件對同一訊息做出響應。

二、類

類的宣告

[類修飾符] class 類名 [extends 父類名] [implements 介面名列表]

  • class、extend、implements都是關鍵字。類名、父類名、介面名都是使用者識別符號。
  • 父類。新類必須在已有的類的基礎上構造,原有類即為父類,新類即為子類。Java每一個類都有父類,如果不含父類,預設父類為Object類。
  • 修飾符。final:最終類,它不能擁有子類。如果沒有此修飾符,則可以被子類所繼承。
    abstrat:抽象類,類中的某些方法沒有實現,必須由其子類來實現。所以這種類不能例項化。
    public:表明本類可以被所屬包以外的類訪問。
    final和abstract是互斥的,其他關鍵詞可以組合使用。eg:public final class Teacher extends Human implements Professor

注意

在定義類時,只是通知編譯器需要準備多大的記憶體空間,並沒有為它分配記憶體空間。只有用類建立了物件後,才會真正的佔用記憶體空間。

Java規定:如果成員變數沒有被顯示賦初值,系統將自動為它們賦值。

三、變數

變數型別 定義
成員變數 定義在類裡面,和方法處於同一層次
區域性變數 定義在方法裡面

1.成員變數

預設情況下,成員變數是例項變數,在外部需要物件才能操作;如果用static修飾,就成為靜態成員,也稱為類變數,可以直接操作。如果前面加上關鍵字final ,它就是一個常量。

根據訪問許可權來區分成員變數 或方法

public protected 預設 private
本類內部
同一包中的子類 ×
同一包中非子類 ×
不同包中的子類 繼承訪問 × ×
不同包中非子類 × × ×

根據是否是靜態來區分

特點
例項成員變數 1.如果所屬的物件沒有被建立,例項成員變數就不存在;2.在類的外部使用它,通過“物件名.變數名”來訪問;3.在類的內部,例項成員方法也可以直接訪問例項成員變數;4.不同物件擁有不同的例項成員變數,互不影響
靜態成員變數 1.被類的所有物件所共享,被稱為類變數;2.它不屬於某個具體物件,也不是儲存在某個物件的記憶體區域中,而是儲存在類的公共儲存單元。在類的物件被建立之前使用;3.可以通過物件名.變數名或者類名.變數名訪問;4.它是一個公共變數,無論哪個物件改變了它的值,對其他所有該類物件都有效

2.區域性變數和成員變數的區別

*區域性變數必須先定義後使用。

區域性變數沒有訪問許可權修飾符,不能用public、private、和protected來修飾。這是因為它只能在定義它的方法內部使用
區域性變數不能用static修飾,沒有“靜態區域性變數”,這是Java和C/C++的區別
系統不會自動問區域性變數賦初值,但對於成員變數,系統會自動賦初值。基本型別為0,複合型別的值為null
區域性變數的作用域僅限於定義它的方法,在方法外部無法訪問它。成員變數的作用域在整個類內部都是可見的,所有成員方法都可以使用它。如果訪問許可權允許,還可以在類的外部使用它
區域性變數的生存週期與方法的執行期相同。當方法執行到定義區域性變數的語句時,區域性變數被建立;執行到它所在的作用於的最後一條語句時,區域性變數被銷燬。類的成員變數,如果是例項成員變數,它和物件的生存期相同;靜態成員變數的生存期是整個程式執行期
在同一個方法中,不允許有同名的區域性變數;在不同的方法中,可以有同名的區域性變數,互不干涉

區域性變數可以與成員變數同名,且在使用時,區域性變數有更高的優先順序

四、方法

方法型別
例項方法 必須在類例項化後通過物件來呼叫
靜態方法(類方法) 可以在類例項化之前就使用

1.方法呼叫的形式

  • 呼叫者與被呼叫方法位於同一類中
    [this.]方法名[實際引數列表]
  • 呼叫者位於被呼叫方法所在類的外部
    物件名.方法名([實際引數列表]) 或者 類名.方法名([實際引數列表])
public class test{
 public void showMsg(){
 System.out.println("This is showMsg method.");
 }
 public void callOther(){
 showMsg();
 }
 public static void main(String args[ ]){
 test ob = new test();// ?為什麼不直接呼叫
 ob.callOther();
 }
}

main()方法是一個靜態方法,它由系統來呼叫,系統在呼叫它的時候,並沒有建立一個test的物件,而callOther()和showMsg()方法都是例項方法,它們被呼叫時,都必須有物件的存在。所以必須在main()中先建立一個物件才能呼叫這兩個方法。而callOther()本身就是例項方法,它在執行時,一定有物件存在的。基於這個前提,callOther()可以直接呼叫showMsg()方法。

**要注意實參和形參的區別。

2.構造方法

一般形式

 構造方法名([引數列表]){
 [this([引數列表]);] | [super([引數列表])];
 語句序列
 }
 *其中this是呼叫其他的構造方法,super是呼叫父類的構造方法,它們都必須放在其他語句的前面。

注意事項

構造方法名字必須和類名字完全相同
除了訪問權修飾符之外,不能有其他任何修飾符,也就不能有返回值
儘管沒有返回值,但不能用“void”修飾
構造方法不能用static和final來修飾。一般也不用private修飾,這會導致無法在外部建立物件
構造方法不能由物件顯示呼叫。一般通過new關鍵字來呼叫,或者用this,super來呼叫
構造方法的引數列表可以為空,也可以有引數,根據引數的有無,可以將構造方法分為無引數的構造方法和帶引數的構造方法
使用者定義的類可以擁有多個構造方法,但要求引數列表不同
如果使用者定義的類未提供任何構造方法時,系統會自動為其提供一個無引數的構造方法

構造方法的呼叫

  • 隱式呼叫:類名 物件名 = new 類名(引數);
  • 顯示呼叫:this([引數列表])
    使用this時需要注意: 1)用this呼叫構造方法是,該語句只能用在構造方法中 2)this語句必須是構造方法的第一條語句 3)和new不同,this雖然可以呼叫構造方法,但它只是執行方法中的語句,並不會建立物件

構造方法的過載

Java允許定義帶引數的構造方法,而且這種帶參的構造方法還可以多個,前提是引數列表有區別,這種現象稱為構造方法的過載。

如果程式設計師至少定義了一個構造方法,那麼系統不會再提供不帶參的構造方法。

3.靜態方法(類方法)

一般形式

 [訪問許可權修飾符]static 返回值型別 方法名([引數列表]){
 語句序列
 }

與例項方法區別

  • 例項方法必須在類例項化以後通過物件來呼叫,而靜態方法可以在例項化之前就使用。
  • 在外部呼叫靜態方法時,可以使用“類名.方法名”的方式,也可以使用“物件名.方法名”的方式;而例項方法只有後面這種形式。也就是說,呼叫靜態方法無需建立物件。
  • 靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問例項成員變數和例項方法;例項方法則無限制。
  • 靜態方法中也不能使用關鍵字this。

4.靜態程式碼塊

一般形式

 static{
 語句序列
 }

注意事項

靜態程式碼塊只能定義在類裡面,它獨立於任何方法,不能定義在方法裡面
靜態程式碼塊裡面的變數都是區域性變數,只在本塊內有效
靜態程式碼塊會在類被載入時自動執行,而無論載入者是JVM還是其他類
如果靜態程式碼塊所在的類被建立了多個物件例項,只有第一個物件被建立時才執行靜態程式碼塊
一個類中允許定義多個靜態程式碼塊,執行順序根據定義順序進行
靜態程式碼塊只能訪問類的靜態成員,而不允許訪問例項成員

五、其他補充

一、關於變數

  • 在類體中的變數定義部分所定義的變數稱為類的成員變數,在方法體中定義的變數和方法的引數稱為區域性變數。成員變數在整個類內有效,區域性變數只在定義它的方法內有效。定義類的成員變數時可賦初值,但對成員變數的操作只能在方法內進行。
  • 成員變數又分為例項成員變數(例項變數)和類成員變數(類變數)。如果成員變數的型別前面加上關鍵字static,則該成員變數稱做類變數或靜態成員變數。
  • 當局部變數的名字與成員變數的名字相同時,則成員變數被隱藏。此時如果想在該方法中使用成員變數,必須使用關鍵字this。
  • 通過new建立類物件時,例項變數被分配記憶體空間,且不同的例項變數將分配不同的記憶體空間。類中的成員變數為類變數時,則所有類物件的這個類變數都分配同一處記憶體,改變其中一個物件的這個類變數將會影響其他物件的這個類變數,即一個類所有的物件共享類變數。
  • 程式執行時,類的位元組碼載入到記憶體,如果該類沒有建立物件,類的例項成員變數不會被分配記憶體。但類中的類變數在該類被載入到記憶體時就分配了記憶體空間。
  • 類變數的記憶體空間直到程式退出執行時才釋放所佔有的記憶體。
  • 類變數可通過類名加“.”直接訪問,但例項變數必須通過例項名加“.”訪問(因為程式載入時例項變數並未分配記憶體空間)。
  • 對於私有成員變數或方法(宣告為private的),只有在本類中建立該類的物件時,這個物件才能訪問自己的私有成員變數和類中的私有方法。
  • 對於共有成員變數和方法(宣告為public的),可在另外的類中通過建立的物件進行訪問。
  • 受保護的成員變數和方法(宣告為protected的),可通過同一個包中的類建立物件進行引用。
  • 友好變數和方法(不用public,private,protected宣告的),可通過同一個包中的類建立物件進行引用。
  • 如果一個成員變數宣告為final,則它就是常量。
  • 如果子類想使用被子類隱藏了的父類的成員變數,可使用關鍵字super來引用。

二、關於方法

  • Java語言中寫一個方法和c語言中寫一個函式完全類似。類中的方法可分為例項方法和類方法(方法型別前面加關鍵字static)。
  • 方法過載是指一個類中可以有多個方法具有相同的名字,但方法的引數必須不同,即或者是引數的個數不同,或者是引數的型別不同。
  • 構造方法是一種特殊的方法,它的名字必須與它所在的類的名字完全相同,並且不返回任何資料型別,即它是void型的(void可以省略不寫)。
  • 例項方法既能對類變數操作,也能對例項變數操作。而類方法(帶static)只能對類變數進行操作。例項方法可以呼叫類方法,類方法不能呼叫例項方法。
  • 使用new運算子和類的構造方法為宣告的物件分配記憶體,如果類中沒有構造方法,系統會呼叫預設的構造方法(無引數的)。  
  • 當類的位元組碼檔案載入到記憶體時,類中的類方法就分配了相應的入口地址,類方法可被該類建立的任何物件呼叫(可通過類名呼叫),類方法的入口地址直到程式退出才被取消。
  • 當類的位元組碼檔案載入到記憶體時,類中的例項方法不會分配入口地址,當該類建立物件後才分配。例項方法可以被該類建立的任何物件呼叫。類所建立的所有物件的例項方法的入口地址相同,當所有的物件不存在時,例項方法的入口地址才被取消。
  • 無論是類方法或例項方法,當其被呼叫時,方法中的區域性變數才被分配記憶體空間,方法呼叫完畢,區域性變數即刻釋放所佔的記憶體。
  • this關鍵字可以出現在類的例項方法中,代表使用該方法的當前物件。
  • 如果一個方法宣告為final,則這個方法不能被重寫。
  • 如果一個類中含有abstract方法,那麼這個類必須用abstrct來宣告。
  • 子類不能繼承父類的構造方法,如果子類要使用父類的構造方法,必須在子類的構造方法中使用(使用關鍵字super表示父類),且必須在第一條語句中使用。
  • 如果子類想使用被子類隱藏了的父類的方法,可使用關鍵字super來引用。

三、關於類

  • 當前程式可呼叫當前包中的友好類(類宣告前無public修飾的)。
  • 不能用protected和private來宣告類。
  • 訪問許可權的級別從高到低排列:public,protected,友好的,private。
  • 關於類的繼承:子類和父類在同一個包中時,子類自然繼承了其父類中不是private的成員變數和方法作為自己的成員變數和方法。如果子類和父類不在同一個包中,那麼子類繼承了父類的protected、public宣告的成員變數和方法,不能繼承父類的友好變數和友好方法。
  • 如果一個類的宣告中沒有使用extends關鍵字,這個類被系統預設為是Object的子類。Object是包java.lang中的類。
  • 如果一個類宣告為final,則它不能被繼承。
  • abstrct類不能用new運算建立物件,必須產生其子類,由子類建立物件。如果一個類是abstrct類的子類,由它必須具體實現父類的abstract方法。一個abstract類只關心它的子類是否具有某種功能,並不關心功能的具體行為,功能的具體行為由子類負責實現。
  • Java不支援多繼承性,即一個類只能有一個父類。

四、關於介面

  • 介面(interface)包含常量定義和方法定義兩部分,介面體中只進行方法的宣告,不提供方法的實現。
  • 一個類通過使用implements關鍵字宣告自己使用的介面,多個介面名之間用逗號隔開。如“class A implements I1,I2”。
  • 如果一個類使用了某個介面,那麼這個類必須實現該介面的所有方法。介面中的方法預設為public的。
  • 如果介面的方法返回的型別不是void的,則在類中實現該介面方法時,方法體中至少要有一個return語句。如果是void型的,類體可以無任何語句(只有“{ }”)。
  • 一個Java原始檔就是由類和介面組成的。
  • 如果一個類沒有實現介面中的所有方法,那麼這個類必須是abstrct類。
  • public宣告的介面可被所有的類使用,友好介面類(無public修飾)只能被同一個包中的類使用。

到此這篇關於Java面向物件基礎,類,變數,方法的文章就介紹到這了,更多相關Java面向物件基礎內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!