Java面向對象(上) 一、面向對象的思想 1、面向過程: 面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟逐一實現,使用的時候依次調用就可以了。 2、面向對象: 面向對象就是把構成問題的事物按照一定規則劃分為多個獨立的對象,然後通過調用對象的方法來解決問題。 3、面向對象的特點: (1 ...
Java面向對象(上)
一、面向對象的思想
1、面向過程:
面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟逐一實現,使用的時候依次調用就可以了。
2、面向對象:
面向對象就是把構成問題的事物按照一定規則劃分為多個獨立的對象,然後通過調用對象的方法來解決問題。
3、面向對象的特點:
(1)封裝性:封裝性是面向對象的核心思想,有兩層含義,一層含義是指吧對象的屬性和行為看成是一個密不可分的整體,將這兩者“封裝”在一起(即封裝在對象中);另一層含義是指“信息隱藏”,將不想讓外界知道的信息隱藏起來。
(2)繼承性:繼承性主要描述的是類與類之間的關係,通過繼承,可以在無需重新編寫原有類的情況下,對原有類的功能進行拓展。
(3)多態性:多態性是指在一個類中定義的屬性和方法被其他類繼承後,他們可以具有 不同的數據類型或表現出不同的行為,這使得同一個屬性和方法在不同的類中具有不同的語義。
二、類與對象
在java中,類與對象是最基本、最重要的單元。類表示某類群體的一些抽象基本特征,對象表示一個個具體的事物。
例如:學生可以是個類,而具體的一名學生,就可以稱為對象。這名具體的學生會有自己的姓名和年齡等信息,這些信息在面向對象的概念中稱為屬性;學生可以看書和打籃球,而看書和打籃球這些行為在類中就稱為方法。
1、類的定義
類是java中一個重要的引用數據類型,所有的java程式都是基於類的。
類是對象的抽象,用於描述一組對象的共同特征和行為。類中可以定義成員變數和成員方法,其中,成員變數用於描述對象的特征,成員變數也被稱為對象的屬性;成員方法用於描述對象的行為,可簡稱為方法。
類的定義格式如下:
class 類名{
成員變數;
成員方法;
}
1.2、局部變數與成員變數的不同
在java中,定義在類中的變數稱為成員變數,定義在方法中的變數稱為局部變數。如果在某一個方法中定義的局部變數與成員變數同名,這種情況是允許的,此時,在方法中通過變數名訪問到的是局部變數而非成員變數。
2、對象的創建與使用
在java程式的類中,想要使用一個類則必須要有對象。在java程式中可以使用“new 關鍵字”創建對象,具體格式如下:
類名 對象名稱 = null;
對象名稱 = new 類名 ();
具體實現的圖示如下:
從上圖可以看出,對象名稱uu(也就是Student類型變數uu)保存在棧記憶體中,而對象的屬性信息則保存在對應的堆記憶體中
(即0x0001是地址值,不存儲在棧記憶體中,它指向堆記憶體中0x0001的地址)
當我們創建完對象後(即Student uu = new Student;)可以使用對象訪問類中的某個屬性或方法,對象屬性和方法的訪問通過“.”運算符實現,具體格式如下:
對象名稱.屬性名
對象名稱.方法名
下麵我舉一個例子進行介紹:
package com.sdbi.hang;
class Student {
String name;//聲明姓名的屬性
void read() {
System.out.println("大家好,我是" + name);
}
}
public class example {
public static void main(String[] args) {
Student uu1 = new Student();//創建第一個Student對象
Student uu2 = new Student();//創建第一個Student對象
uu1.name = "小明";//為uu1對象的name屬性賦值
uu1.read();//調用對象的方法
uu2.name = "小花";//與上文一樣
uu2.read();
}
}
運行結果如圖:
從上圖可以看出,程式分別實例化了兩個Student對象uu1和uu2,分別指向其各自的堆記憶體空間(記憶體地址)
3、對象的引用傳遞
類屬於引用數據類型,引用數據類型就是指記憶體空間可以同時被多個棧記憶體引用。下麵我用一個例子來說明對象的引用傳遞。
package com.sdbi.hang;
class Student {
String name;//聲明姓名的屬性
int age;//聲明年齡屬性
void read() {
System.out.println("大家好,我是" + name + "年齡" + age);
}
}
public class example {
public static void main(String[] args) {
Student uu1 = new Student();//聲明uu1對象並實例化
Student uu2 = null;//聲明uu2對象,但不對其進行實例化
uu2 = uu1;//uu1給uu2分配空間使用權
uu1.name = "小明";//為uu1對象的name屬性賦值
uu1.age = 20;//定義uu1年齡20歲
uu2.age = 40;//定義uu2年齡40歲
uu1.read();//調用對象的方法
uu2.read();
}
}
運行的結果如下圖所示:
通過這張圖片發現,兩個對象輸出的內容是一樣的,這是因為uu2對象獲得了uu1對象的堆記憶體空間使用權。其實就是對uu1的age屬性賦值20之後,過對uu2的age屬性賦值40,之後uu2的值把uu1的值覆蓋掉,所以輸出是40。
實際上所謂的引用傳遞,就是將一個堆記憶體空間的使用權給多個棧記憶體空間使用,每個棧記憶體空間都可以修改堆記憶體空間的內容,運行結果圖的分析如下:
從以上的四幅圖中可以發現堆記憶體、棧記憶體空間的變化,在程式的最後,uu2對象將age的值修改為50,因此最終結果uu1的age屬性值是50。
4、訪問控制
針對類、成員方法和屬性,java提供了四種訪問控制許可權。這四個訪問許可權由小到大依次是:
下麵具體介紹一下控制許可權
- private:屬於私有訪問許可權。用於修飾類的屬性和方法。類的成員如果用到了private,該成員就只能在本類中進行訪問。
- default:屬於預設訪問許可權。即在類中的屬性或方法沒有任何的訪問許可權聲明時就會預設為此訪問許可權,預設的訪問許可權可以被本包之下的其他類調用,但是不能跨包調用。
- protected:屬於受保護的訪問許可權。只能被本包及不同包的子類訪問。
- public:屬於公共訪問許可權。即可以在全局範圍都可以訪問。
三、封裝性
1、為何要封裝
封裝可以被認為是一個保護屏障,防止本類的代碼和數據被外部程式隨機訪問。所以需要封裝。
2、如何封裝
類的封裝是指將對象的狀態信息隱藏在對象內部,不允許外部程式直接訪問對象的內部信息,而是通過該類提供的方法實現對內部信息的操作訪問。
在定義一個類時,將類中的屬性私有化,即使private關鍵字修飾類的屬性,被私有化的屬性只能在類中被訪問。如果外界想要訪問私有屬性,則必須通過getter和setter方法設置和獲取屬性值。
四、構造方法
我們在java中實例化一個對象後,,如果要為這個對象的屬性賦值,必須通過直接訪問對象的屬性或調用setter方法才可以實現,如果需要在實例化對象時為這個對象的屬性賦值,可以通過構造方法來實現。(構造方法也稱為構造器)
1、定義構造方法
構造方法是一個特殊的成員方法,在定義時需註意一下幾點
- 構造方法的名稱必須與類名一致、
- 構造方法名稱前不能有任何返回值類型。
- 不能再構造方法中使用return返回一個值,但是可以單獨寫return語句作為方法的結束。
2·1、構造方法的重載
在一個類中可以定義多個構造方法,只要每個構造方法的參數類型不同或參數個數不同即可。在創建對象時,可以通過調用不同的構造方法為不同的屬性賦值。
2·2、預設構造方法
在java中的每個類都至少有一個構造方法,如果在一個類中沒有定義構造方法,系統會自動為這個類創建一個預設的構造方法,這個預設的構造方法沒有參數,方法體中沒有任何代碼。
通常構造方法使用public修飾。
五、this關鍵字
在一個類中,當成員變數與局部變數重名時,需要使用到this關鍵字分辨成員變數與局部變數,java中的this關鍵字語法比較靈活,主要作用有三點
- this關鍵字調用本類中的屬性。
- this關鍵字調用成員方法。
- this關鍵字調用本類的構造方法。
六、代碼塊
簡單來說代碼塊就是用{}括起來的一段代碼。代碼塊具體可以分為四種,分別是:
- 普通代碼塊
- 構造塊
- 靜態代碼塊
- 同步代碼塊
七、static關鍵字
在定義一個類時,只是在描述某事物的特征和行為,並沒有產生具體的數據。只有通過new關鍵字創建該類的勢力對象時,柴夔開闢棧記憶體和堆記憶體,在堆記憶體中麽個對象會有自己的屬性。如果希望某些屬性被所有對象共用,就必須將其聲明為static屬性。如果屬性使用了static關鍵字進行修飾,則該屬性可以直接使用類名稱進行調用。
1、靜態屬性
如果在java程式中使用static修飾屬性,則該屬性稱為靜態屬性(也稱為全局屬性),經驗屬性可以使用類名直接訪問,訪問格式如下:
類名。屬性名
備註:
static掛年至只能修飾成員變數,不能修飾局部變數,否則編譯器會報錯。
2、靜態方法
如果想要使用類中的成員方法,就需要先將這個類實例化,而在實際開發時,如果想不創建對象的情況下,通過類名就可以直接調用某個方法,要實現這樣的效果,只需要在成員方法前加上static關鍵字,使用static關鍵字修飾的方法通常稱為靜態方法。
備註:
靜態方法只能訪問靜態成員,因為非靜態成員需要先創建對選哪個才能訪問,即隨著對象的創建,非靜態成員才會被分配記憶體。而靜態方法在被調用時可以不創建任何對象。
3、靜態代碼塊
用static關鍵字修飾的代碼塊稱為靜態代碼塊。當類被載入時,靜態代碼塊會之星,由於類只載入一次,因此靜態代碼塊只執行一次。通常使用靜態代碼塊對類的成團變數進行初始化。