面向對象程序設計的一個一個重要特點是:封裝性。
這里的封裝性有兩方面含義:一是將有關的數據和操作代碼封裝在一個對象中形成一個基本單位,各個對象之間相互獨立互不干擾,二是將對象中某些部分對外隱蔽,即隱蔽其內部細節只留下少量接口以便與外界聯系,接收外界的信息。這種隱蔽的做法稱為信息隱蔽。
程序設計者的任務包括兩個方面:一是設計所需要的各種類和 對象,即決定把哪些數據和操作封裝在一起,二是考慮怎樣向有關對象發送消息,已完成所需要的任務。
對象=算法+數據結構
程序=(對象+對象+對象+……)+消息,消息的作用就是對對象的控制。
類的定義形式為
[public][final][abstract]class<類名>[extends<父類名>][implements<接口名列表>]
{<成員名>}
[]中的內容都不是必需的,<>中的內容是必需的。
public
表示該類可以為所有類使用,還有一種是默認訪問權限,只對同一個包中的類可見。(修飾外部類的就只有這兩種訪問權限)
final
表示該類為終結類,即不允許被其他任何類繼承而派生出子類。即不能成為父類。
abstract
表示該類是一個抽象類。在抽象類中,允許所定義的方法只有聲明沒有定義,抽象類一定是作為一個父類使用,被其他相關的類繼承,然后在子類中實現沒有實現的方法。一般類中的方法必須是有定義的。
extends<父類名>
給出所定義的類需要繼承的父類,父類名是一個已經存在的一個類的標識符。
implements<接口名列表>
給出所定義的類需要實現的接口列表,若接口列表中超過一個接口名,則前后接口名之間必須要用逗號隔開。
類體(花括號內的部分)包含成員和方法。成員用來反映類的屬性,方法用來反映類的行為。
類中成員的定義格式:
[<訪問權限>][static][final]<數據類型><變量名列表>;//同樣<>內是必選項
數據成員有四種可選擇的訪問權限(訪問屬性),其中三種分別用關鍵字public,protected,private表示,剩余一種訪問權限不需要關鍵字,為默認(缺省,隱含)的訪問權限。不同的訪問權限對應著不同的訪問范圍。
public
數據成員為共有訪問權限,能被所有的類訪問
protected
數據成員為保護訪問權限,能夠被同一包中的類和繼承于本類的派生類(無論是否在同一個包中)所訪問
privated
數據成員為私有訪問權限,只能被本類成員所訪問,不能被其他任何類中的成員所訪問
缺省
數據成員能夠被本類和同一包中的其他任何類中的成員所訪問
包類似文件夾
總結:無論是何種訪問屬性都能被本類中的任何成員訪問,默認權限還能夠被同一包中的任何類所訪問,保護訪問權限時更進一步能夠被不同包中的任何子類所訪問,公有訪問權限時可以被所有的類訪問。
訪問范圍從小到大的順序為:私有<默認<保護<共有
需要注意的是保護修飾的數據不僅不同包中的子類可以訪問,同一個包中的所有類都是可以訪問的。
如果想要了解更多可以移步去看大佬的博客,有更加詳細的解釋:傳送門
如果被final
修飾,則必須對該成員進行初始化(包含在構造函數中賦值),并且之后不能再被修改(相當于C++中的const
)
若一個數據成員帶有關鍵字static
修飾,則表示他是類的靜態成員類中的靜態成員對所有對象都是公共的,共享一個存儲空間。而實例成員變量則是互相獨立的。
類中函數成員的定義格式為
[<訪問權限>][abstract][static][final]<返回類型><函數名>(<參數列表>){<函數體>}
函數成員的訪問權限與數據成員相同:public
為公有訪問權限,能夠被所有的類訪問。protected
為保護訪問權限,能夠被本包中的類和子類訪問。private
為私有訪問權限,只能夠被本類訪問。缺省:此函數成員能夠被本包中的類訪問。
abstract
表示為抽象成員函數,這樣的函數只有函數頭沒有函數體,在函數頭末尾使用分號表示結束定義。抽象成員函數只能出現在抽象類的定義中。
static
表示靜態成員函數,可以直接通過類名進行訪問而不用進行實例化。在靜態成員函數中只能訪問靜態成員變量和調用靜態成員函數,不允許訪問實例成員變量和函數。
final
表示終結性成員函數,該函數不允許被繼承類中的成員函數所覆蓋,也就是說不能被繼承類重新定義,不允許有多態性。
類中的構造函數是特殊的成員函數,作用是為創建的對象初始化,該函數名與類名相同,不帶返回值類型,只允許使用訪問權限的修飾符,不允許使用其他任何修飾符。
當類中沒有定義任何構造函數時,系統將隱含定義個一個默認的構造函數,函數體將初始化成員變量為默認值,具體的講,將數值和字符變量初始化為0,邏輯變量初始化為false,對類對象成員初始化為null。如果有自己定義的構造函數系統將不會再自動定義一個構造函數。
如果類的訪問權限是public,則默認構造函數的訪問權限是public,如果沒有采用public修飾,則默認構造函數的訪問權限是friendly。
可以有多個成員函數名字相同,但是參數列表必須不同,這種現象叫做函數的重載。
我們可以用類來定義和創建對象,具體格式為:
<類名標識符><對象標識符>[=<初值表達式>];//需要通過new操作符得到地址
new運算符為一元運算符,操作數是調用該類的構造函數,在內存中生成一個存儲對象并進行初始化,以返回該存儲對象的首地址作為運算結果。
沒有被new的對象是沒有意義的。相當于一個空指針。
創建對象以后就可以通過點運算符訪問成員變量和成員函數。點運算符具有最高的優先級。
對于靜態成員整個類對應同一個存儲空間,所以允許通過類名來直接訪問。(當然也可以通過對象訪問),對于實例成員只能通過對象進行訪問。
Java類中的程序是由類所構成的,每個類可以是一個獨立的編譯單元。也可以把及各類的定義保存在同一個程序文件中共同成為一個編譯單元,編譯后每個類都有對應各自的字節碼文件,即拓展名為.class的文件。
當一個Java程序中包含多個類的定義時,只允許包含主方法main的類被指定為公有類,即在類定義的開始用public修飾,其他的類必須是缺省訪問權限的類,也就是說一個Java程序文件中不管包含多少個類的定義,不能同時出現兩個及以上的類為public類
對于成員變量其作用域為整個類,所以變量具有類作用域,成員函數中形參變量作用域為整個函數。對于成員函數中頂一個局部變量,其作用域為從定義點開始到所在的語句塊結束。在同一個作用域中不能出現重名,作用域范圍小的變量一般不能與包含他的作用域大的變量重名。(否則小范圍的會覆蓋大范圍的)允許函數參數和函數體中的變量與成員變量重名,但是在訪問成員變量時應該加上this.前綴表示是類的成員變量。
函數的形參和實參必須對應,或者實參的類型可以被系統自動轉換成形參的類型。特殊的,對于類中的構造函數是通過new操作符進行調用而不是通過點運算符進行調用。當形參為數組類型或者類(對象)類型時對形參的改變也會改變實參(很顯然,因為實際傳遞的是指針)。
封裝可被理解為一種改用做保護的包裝器,以防止代碼和數據被包裝器外部所定義的其他代碼任意訪問。Java使用訪問權限控制來實現封裝。
讓可訪問性盡可能的低是促成封裝的原則之一,即盡可能采用可行狀態下最高的訪問權限(最小的訪問范圍)。
final在Java中并不常用,但是他給我們提供了定義常量的功能。而且final還可以控制成員、方法或者類不可以被覆寫或者繼承。
在定義變量時在前面加上final關鍵字,對于基本類型來講就是其值不可改變,對于對象來講就是引用不可改變,即一直指向同一個對象。只能在定義或者構造函數中進行賦值,而且只能任選其一。