類和對象
定義類
類和對象(object,也被稱為實例,instance),類是抽象的,用來模擬現(xiàn)實事物,可理解為某種概念,而“對象”是類的具體實例。對象是具體的,根據(jù)類的描述創(chuàng)造出來的。
對于一個類定義,可以包含三個最常見的成員:構(gòu)造器、成員變量、方法。類里各成員之間的定義順序無影響,各成員之間可以相互調(diào)用,注意:static修飾的成員不能訪問沒有static修飾的成員。
成員變量用于定義該類或該類的實例所包含的狀態(tài)數(shù)據(jù);
方法用于定義該類或該類的實例的行為特征或者功能實現(xiàn);
構(gòu)造器用于構(gòu)造該類的實例,java通過new關(guān)鍵字來調(diào)用構(gòu)造器,從而返回該類的實例。構(gòu)造器是一個類創(chuàng)建對象的根本途徑,如果一個類沒有構(gòu)造器,這個類將無法創(chuàng)建實例。因此java默認為一個類提供無參構(gòu)造器,但是如果程序員手動提供了構(gòu)造器,系統(tǒng)將不再為該類提供默認構(gòu)造器。
定義成員變量的格式:
[修飾符] 類型 成員變量名 [=默認值];
注:
- 修飾符可以省略,也可以是public、protected、private、static、final,其中public、protected、private只能用其中一個,可以與static、final組合用
定義
定義方法的格式:
[修飾符] 方法返回類型 方法名(形參列表){
//方法體
}
注:
- 修飾符可以省略,也可以是public、protected、private、static、final,其中public、protected、private只能用其中一個,可以與static、final組合用
- 如果聲明了返回類型,方法體中必須有一個有效的return語句,該語句返回一個變量或一個表達式,且類型需要與聲明的返回類型一致;
果果沒有返回類型,需要使用void聲明
定義構(gòu)造器:
[修飾符] 構(gòu)造器名(形參列表){
//構(gòu)造器執(zhí)行體
}
注:
- 修飾符:可以省略,也可以是public、protected、private之一
- 構(gòu)造器名:必須和類名相同
- 形參列表:和定義方法的形參列表要求一樣
- 構(gòu)造器不能定義返回值類型,也不能使用void聲明沒有返回值,否則Java會把構(gòu)造器當(dāng)成方法來處理,就不再是構(gòu)造器了。
實際上,構(gòu)造器是有返回值的,當(dāng)使用new關(guān)鍵字來掉用構(gòu)造器時,構(gòu)造器返回該類的實例??梢园堰@個類的實例當(dāng)成構(gòu)造器的返回值,因此構(gòu)造器的返回值總是當(dāng)前類,無須定義返回值類型。注意:無需顯式地使用return來返回當(dāng)前類的對象,構(gòu)造器的返回值時隱式的
對象的產(chǎn)生和使用
先創(chuàng)建一個Person類,Person.java
public class Person {
//定義兩個成員變量
public String name;
public int age;
//定義一個say方法
public void say(String content) {
System.out.println(content);
}
}
PersonTest.java
//使用Person類定義一個Person類型的變量
Person p;
//通過new調(diào)用Person類的構(gòu)造器,返回一個Person實例
//將該實例賦給p變量
p = new Person();
//也可以簡寫成
//Person p = new Person();
注:new Person()這里的括號指的是調(diào)用構(gòu)造器,形參為無參。
類名 對象名=new 類名();
類名 對象名: 這個的解釋是創(chuàng)建名稱為“對象名”的“類名”類
new :這個的解釋是實例化對象
類名() :這個的解釋是無參數(shù)構(gòu)造方法;
new 類名(),就是說以無參數(shù)構(gòu)造方法實例化對象;
類名 對象名=new 類名():用指針的解釋就是以無參數(shù)構(gòu)造方法實例化對象并將這個對象的內(nèi)存引 用賦給“類名”類的“對象名”[引用變量]`
創(chuàng)建對象后可以使用了,主要有:
- 訪問對象的實例變量
- 調(diào)用對象的方法(調(diào)用時必須為形參賦值)
注意:static修飾的方法和成員變量,通過類和實例可以調(diào)用;沒有static修飾,只能通過實例調(diào)用
對象、引用和指針
Person p = new Person();
這行代碼產(chǎn)生了兩部分,p變量,Person對象。在內(nèi)存中,Person類型的變量實際上是一個引用,存在棧內(nèi)存中,指向?qū)嶋H的Person;真正的Person對象存在堆內(nèi)存中。
當(dāng)一個對象被創(chuàng)建成功后,存放在堆內(nèi)存中,java不允許直接訪問堆內(nèi)存中的對象,只能通過該對象的引用操作該對象。Java里的引用相當(dāng)于c里的指針,只是Java把指針進行了封裝,避免開發(fā)者進行繁瑣的指針操作。
堆內(nèi)存里的對象可以有多個引用,即多個引用指向同一個對象。
//將p變量的值賦值給p2變量。這樣p2、p均指向同一個對象
Person p2 = p;
對象的this引用
this關(guān)鍵字總是指向調(diào)用該方法的對象。根據(jù)this出現(xiàn)位置的不同,this作為對象的默認引用,有兩種情形:
- 構(gòu)造器中引用該構(gòu)造器正在初始化的對象
- 在方法中引用調(diào)用該方法的對象
this關(guān)鍵字最大的作用是,讓類中一個方法,訪問該類的另一個方法或?qū)嵗兞俊?br> 示例:Dog.java
public class Dog {
public void jump() {
System.out.println("正在執(zhí)行jump方法");
}
//run方法需要借助jump方法
public void run() {
//使用this引用調(diào)用run方法對象
//this可以省略
this.jump();
System.out.println("正在執(zhí)行run方法");
}
}
其他對象的一個方法依賴另一個方法的案例,如吃飯方法依賴使用筷子等,java允許對象的一個成員直接調(diào)用另一個成員,也可以省略this前綴。
但是對于static修飾的方法而言,可以使用類來直接調(diào)用,如果使用this關(guān)鍵字,則無法指向合適的對象。即:靜態(tài)成員不能直接訪問非靜態(tài)成員。
`注意:這里要聯(lián)合思考。static是允許用類名和對象調(diào)用的,但實際上不應(yīng)該允許這樣做。在編程中注意不要使用對象實例調(diào)用static修飾的成員變量、方法等,而應(yīng)該使用類
3、創(chuàng)建實例
public static void main(String[] args) {
Teacher gzhu = new Teacher("George Zhu", 30, 10000);
System.out.println("Teacher: " + gzhu.getName());
System.out.println("\tAge: " + gzhu.getAge());
System.out.println("\tSalary: " + gzhu.getSalary());
}
main()方法是Java應(yīng)用程序的入口點,每個Java應(yīng)用程序都是從main()方法開始運行的。作為程序入口的main()方法必須同時符合以下幾個條件:
. 用public static修飾;
. 返回類型為void;
. 方法名為main;
. 參數(shù)類型為String[];
包含main方法的類又叫主程序類。
類創(chuàng)建好之后,通過new關(guān)鍵字創(chuàng)建具體對象。它有以下作用:
. 為對象分配內(nèi)存空間,將對象的實例變量自動初始化為其變量類型的默認值;
. 如實例變量顯示初始化,將初始化值賦給實例變量;
. 調(diào)用構(gòu)造方法;
. 返回對象的引用;