當前位置:才華齋>計算機>java語言>

java面向物件程式設計講解

java語言 閱讀(1.18W)
  什麼是面向物件?

Object 物件,Oriendted 以…為導向的, Programming 程式設計

java面向物件程式設計講解

面向物件就是使用物件進行程式設計,簡寫成OOP。

SP和OOP對比

  面向物件的三大原則

封裝 繼承 多型

物件

物件是面向物件程式設計的核心部分,是實際存在的具體實體,具有明確定義的狀態和行為;

物件其實就是“資料”和“函式”的封裝體,其中:

資料表示自身的狀態,也稱作“屬性”或“成員資料”;

函式表示自身的功能,也稱作“方法”或“成員函式”。

人們為了更好地認識世界,將現實生活中的事物(物件)劃分成類;

同一類中的事物總是具有一些共性;

類以共同的特性和行為定義實體;

類是具有相同屬性和和行為的一組物件的集合。

屬性

事物的特性在類中用變量表示;

每個物件的每個屬性都擁有其特定的值;

屬性名稱由類的所有物件共享;

物件或實體擁有的特徵在類中表示時稱為屬性

 方法

事物的行為和動作在類中用函式表示;

每個物件都有相同的動作和行為;

物件執行的操作在類中表示為方法。

類和物件的區別

類是用來描述實體的“模板”或“原型”;

物件是實際的實體,每一個物件都是類的一個具體例項;

類用來定義物件所有的屬性和方法,同一類的所有物件都擁有相同的特徵和操作;

可以將類理解成生產產品的模具,而物件則是根據此模具生產的一個個產品。

類與結構

封裝

將某些東西包裝在一起,然後以新的完整形式呈現出來;

隱藏屬性、方法或實現細節的處理方式稱為封裝;

封裝其實就是有選擇性地公開或隱藏某些資訊,它解決了資料的安全性問題。

繼承

繼承就是重用現有的類來生成新類的一種特徵;

通俗地講就是從現有的類(即父類或基類)建立新類(子類或派生類)的過程;

現實生活中,繼承可以達到財產重用的目的,而在Java中,繼承可以使程式碼重用。

多型

多型是指同一函式在不同的類中有不同的實現;

多型的好處就是使類更靈活,更便於擴充。

這裡還有一個不得不說的的 “抽象”

抽象

把相同的或相似的物件歸為一類的這個過程就是抽象,所以,抽象就是分析問題的方法;

抽象的基本原則:

只關心主要問題,而不關心次要問題;

只關心主要矛盾,而不關心次要矛盾;

只關心相同的東西,而不關心不同的東西;

只關心問題是什麼,能夠完成什麼,而不關心怎樣去完成。

抽象的過程其實就是面向物件程式設計的核心思想。

在Java中定義類

在Java中建立物件

建立物件的語法

和陣列相似,物件也是引用資料型別,只能使用new運算子從堆中分配記憶體;

建立物件的一般語法:

類名 引用名 = new 類名();

使用已經定義好的類,建立該類物件的過程稱為“例項化”。

成員運算子 “ . ”

只有先例項化類的物件,才可以訪問到類中的成員(屬性和方法);

使用成員運算子(.)來訪問成員屬性或成員方法;

一般語法是:

物件名.成員名

如:

= 18; //為成員屬性賦值 ng(); //呼叫成員方法

訪問許可權:public和private

C語言中結構體的成員可以從任何地方進行訪問,這將給資料的安全留下極大的隱患;

為了避免從類外部直接訪問類成員而造成的資料損壞,Java對類成員的訪問制定了約束;

關鍵字public和private是訪問修飾符,用來說明某個成員是否可以從類外部進行訪問;

public修飾的成員可以在任何地方進行訪問,不受任何約束;

private修飾的成員只能夠被本類中的其它成員訪問,而不能從類的外部進行訪問。

無法從類的'外部訪問私有成員;

其它類的私有成員對於當前類也是隱藏的。

訪問許可權示例

class Student { private String name; //姓名,私有的,不可以從類外部直接訪問 private int age; //年齡,私有的,不可以從類外部直接訪問 private float weight; //體重,私有的,不可以從類外部直接訪問 //吃飯的方法,公有的,可以從任何地方訪問 public void dining() { tln("吃飽了..."); weight++; //dining方法是類內部成員,可以直接訪問本類私有成員 } //走路的方法,公有的,可以從任何地方訪問 public void walk() { tln("走累了..."); weight--; //walk方法是類內部成員,可以直接訪問本類私有成員 } } public class Test { public static void main(String[] args) { Student std = new Student(); //例項化一個Student物件 = 18; //試圖從類外部訪問私有成員,將會報出一個錯誤 ng(); //允許訪問公有成員 } }

訪問許可權(續)

加上訪問修飾符有時候可能會給操作資料帶來不便,但可以在很大程度上保證資料的安全;

一般地,我們會將成員屬性宣告為private,而將成員方法宣告為public,但這樣做並不是絕對的;

有時候,類外部可能要操作到某些私有資料成員,那麼就可以增加一個公有的方法,再由這個方法來操作私有資料,避免因類外部的誤操作而造成的資料損壞;

因為main方法要由類外部的虛擬機器來呼叫,所以main方法必須宣告成public。

如:修改Student類

class Student { //定義學生類 private String name; //姓名,私有 private int age; //年齡,私有 private float weight; //體重,私有 public void setName(String name) { //為姓名賦值的方法,公有 = name; } public void setAge(int a) { //為年齡賦值的方法,公有 age = a; } public void setWeight(float w) { //為體重賦值的方法,公有 weight = w; } public void display() { //將所有資訊打印出來的方法,公有 tln("姓名:" + name + ",年齡:" + age + ",體重:" + weight); } public void dining() {……} //吃飯的方法,公有,程式碼略 public void walk() {……} //走路的方法,公有,程式碼略 } public class Test { public static void main(String[] args) { Student std = new Student(); //例項化學生類物件 ame("張三"); //為姓名賦值 ge(18); //為年齡賦值 eight(55); //為體重賦值 ng(); //呼叫吃飯的方法 lay(); //將資訊打印出來 } }

物件初始化

在上例中,只能逐個地為資料成員賦值,如果想在物件例項化的同時就初始化成員屬性,就使用到了構造方法;

構造方法是特殊的成員方法,它與類同名,在物件例項化時由虛擬機器自動呼叫;

請注意:構造方法沒有返回值型別,也不能有返回值。

構造方法示例:

/*定義ConstructorDemo類,對構造方法進行測試*/ class ConstructorDemo { /*構造方法,方法名與類名完全一致 無需指定返回值型別,也不能有返回值*/ public ConstructorDemo() { tln("這是構造方法"); } } /*Test類,用來容納main方法 一般將包含有main方法的類宣告為public*/ public class Test { /*main方法,程式入口*/ public static void main(String[] args) { /*例項化ConstructorDemo類的物件*/ ConstructorDemo cd = new ConstructorDemo(); } } //會輸出“這是構造方法”

構造方法

正是由於在例項化物件的同時會自動呼叫構造方法,所以構造方法一般用來給資料成員分配資源或初始化資料成員;

構造方法的一般形式:

訪問許可權 類名(形參列表) {

方法體

}

因為是由虛擬機器來呼叫構造方法,所以構造方法一般應定義成public。

如:為Student類新增構造方法

class Student { //定義學生類 private String name; //姓名,私有 private int age; //年齡,私有 private float weight; //體重,私有 //構造方法,根據傳遞進來的引數,為資料成員賦值 public Student(String n, int a, float w) { //分別為每個資料成員賦初始值 name = n; age = a; weight = w; } public void setName(String n) {……} //為姓名賦值的方法,公有,程式碼略 public void setAge(int a) {……} //為年齡賦值的方法,公有,程式碼略 public void setWeight(float w) {……} //為體重賦值的方法,公有,程式碼略 public void display() {……} //將所有資訊打印出來的方法,公有,程式碼略 public void dining() {……} //吃飯的方法,公有,程式碼略 public void walk() {……} //走路的方法,公有,程式碼略 } public class Test { public static void main(String[] args) { //利用構造方法,為資料成員指定初始值 Student std = new Student("張三", 18, 55); lay(); //將資訊打印出來 } }

構造方法(續)

每個物件在生成時都必須執行構造方法,而且只能執行一次;

如果構造方法呼叫失敗,那麼物件也無法建立;

不可以顯式地直接呼叫構造方法;

在沒有定義構造方法的情況下,類會自動產生一個無引數的預設構造方法,這個預設的構造方法什麼都不做;

一旦顯式地定義了構造方法,預設構造方法自動消失。故一般定義無參和有參兩個構造方法。

總結

物件由狀態(屬性)和行為(方法)組成; 類是具有相同屬性和方法的物件的集合; 封裝可以隱藏物件實現的具體細節; 必須先例項化類的物件,才可以訪問到其中的成員; 成員運算子用於訪問物件的成員; 成員可以定義為公有,也可以定義為私有; 構造方法一般用來初始化物件中的資料成員; 如果不定義構造方法,將有預設的構造方法,一旦定義,預設的構造方法自動消失。