- 前言
在前面的學(xué)習(xí)中,我們對面向?qū)ο蟮木幊趟枷胗辛艘粋€基本的了解,并且簡單的了解了類和對象的定義.那么類和對象在Java語言中是如何表現(xiàn)的,這次,就從實際出發(fā),學(xué)習(xí)一下一下類和對象在Java語言中的使用.
-
類
那么,這里為什么要先將類,而不是像之前一樣先講對象呢,那是因為在前面的學(xué)習(xí)中,我們知道了,對象是類的一個實例.類是封裝兌現(xiàn)屬性和行為的載體,所以對象的一切都在類之中,對象的屬性,行為的調(diào)用都得先通過實例才能使用,它們是一個包含關(guān)系,對象是依賴于類的.
- 類在Java中的創(chuàng)建
我們都知道,在我們新建一個Java文件的時候,大多是這樣的.

這充分說明了在Java語言中,一切都是基于類與對象建立的.
類在Java語言中式通過class關(guān)鍵字定義的.而且還可以使用各種修飾符對其權(quán)限進行限定,關(guān)于修飾符,在前面也有講到過.
class cat{
}
- 類的成員變量與成員方法
我們通過觀察類文件的結(jié)構(gòu)可以發(fā)現(xiàn)是這樣的.

我們可以發(fā)現(xiàn):
在一個Java文件中不僅是可以聲明多個類的,還可以在類的內(nèi)部定義一個類,這可以叫做類的嵌套使用了,這種機制應(yīng)該就是Java中的內(nèi)部類的特性.我們在后面在做詳細(xì)學(xué)習(xí).
我們還可以在Structure視窗里發(fā)現(xiàn),類的結(jié)構(gòu)是由方法體和成員變量組成的.
成員變量
我們已經(jīng)了解到類封裝對象屬性和行為的載體,而對象的屬性是通過成員變量定義的,行為是通過方法創(chuàng)建的.一個類的成員變量就是封裝對象的某種屬性,成員變量也可以通過修飾符限定其使用范圍,因此有靜態(tài)變量,成員變量,局部變量,常量等區(qū)分,關(guān)于它們之間的聯(lián)系與區(qū)別,這一點在前面的Java基礎(chǔ)中應(yīng)該有講過.
- 成員方法
我們可以通過實例化一個對象,然后調(diào)用其屬性和方法.而在通常情況下,一個對象的屬性是不會在封裝類就被初始化的,只會被定義,應(yīng)為對象的屬性通常都是可變的,我們只能通過實例化對象,來確定一個具體對象的具體屬性.
那么我們應(yīng)該如何來調(diào)用到對象的屬性和設(shè)置對象的屬性呢.這時我們就會理所當(dāng)然的想到,當(dāng)然時使用方法了嘛.是的我們只需要在類中封裝獲取和設(shè)置對象屬性的方法就可以了.
而這類獲取和設(shè)置成員變量的方法就叫做成員方法.(因為其都具有很明顯的特征和作用)
// 成員方法,獲取成員變量
public boolean getindepentThing(){
return this.independentThing;
}
// 成員方法,設(shè)置成員變量
public void setindepentThing(boolean independentthing){
this.independentThing = independentthing;
}
-
類的構(gòu)造方法
構(gòu)造方法是類中的另以特殊的方法體,構(gòu)造方法是一個與類名相同的方法,對象的創(chuàng)建就是通過構(gòu)造方法來完成的.每當(dāng)類實例化一個對象時,類都會調(diào)用構(gòu)造方法,所以構(gòu)造方法其實就是相當(dāng)與實例化對象時的初始化一樣.- 構(gòu)造方法是沒有返回值的
- 構(gòu)造方法的名稱要與本類的名稱相同.
為什么構(gòu)造方法的名稱必須與類名稱相同,我們看看對象的實例化:
animal animal = new animal();
如此,我們大概明白了,之所以構(gòu)造方法的名稱和類名稱相同,是為了在對象的實例化的時候,通過new animal(),使構(gòu)造方法在對象的實例化的同時也運行了,這樣才能實現(xiàn)在實例化對象就能夠初始化對象的屬性的目的.構(gòu)造方法的存在,解決了對象的初始化問題,使得我們每次實例化的對象都擁有我們想要設(shè)定的屬性值,之后我們就可以直接調(diào)用其屬性,而不需要頻繁的使用成員方法來設(shè)定對象的值.
/**
* 構(gòu)造方法
*/
public animal(){ // 無參的構(gòu)造方法.
this.independentThing= false;
}
public animal(boolean independentthing){ // 有參的構(gòu)造方法
this.independentThing = independentthing;
}
- 類中普通的方法
在之前的學(xué)習(xí)中我們已經(jīng)了解了關(guān)于方法在Java中的定義,使用返回值類型修飾符+方法名.即可創(chuàng)建一個方法體.而我們常常會使用到的void修飾符是分特殊的,它不需要我們return一個值,void的字面意思就是空,我們治理只需要了解到void修飾的方法體,是不需要返回值的.
在類和對象的學(xué)習(xí)中,我們又了解到,類中的方法其實就是對某個對象的行為的一種封裝,所以類中最常見的方法,其實就是這種對行為封裝的方法,也可以說是我們自定義的方法,因為這種方法的所有內(nèi)容都是我們自定義的.這類方法其實才是最普遍存在于類中的.
void eat(){
System.out.println("動物的吃行為");
}
-
類的主方法
我們在前面的學(xué)習(xí)中,了解到一個類只能有一個主方法,而這個主方法是用來讓Java編譯器識別,編譯運行的.為什么要這樣設(shè)計,我們其實已經(jīng)可以分析的出來了,因為Java語言是基于類和對象的基礎(chǔ)上的一門語言,其基本的組成單位其實可以說就是眾多的類,然后由眾多的類組成的類庫組成了Java的標(biāo)準(zhǔn)類庫,我們都是基于Java標(biāo)準(zhǔn)類庫來編程的,如果不定義一個主方法用來編譯運行,那么各種類中的不計其數(shù)的方法該如何來標(biāo)記,如何知道該編譯運行哪個方法,調(diào)用哪個類.所以類的主方法的存在是必然的一個演變過程.
類的主方法是類的入口點,它定義了程序從何處開始,主方法提供程序流向的控制,Java編譯器通過主方法來執(zhí)行程序.
主方法的語法是固定的:
public static void main(String[] args){
// 方法體
}
我們從主方法的定義可以看到其具有的一些特性:
主方法是一個靜態(tài)的方法,所以如果要直接在主方法中調(diào)用其他方法,則調(diào)用的方法也必須是靜態(tài)的才行.
主方法是沒有返回值的.
主方法的形式參數(shù)是數(shù)組,其中arg[0]~arg[n]表示程序的第一個參數(shù)到第n個參數(shù).可以使用args.lenght獲取到這個值.
-
對象
我們現(xiàn)在已經(jīng)非常了解了,對象就是由類抽象出來的一個實例.比如人類中有一個叫小舍,性別為男的人.那么這個人就是從人類中實例化出來的一個對象.
-
對象的創(chuàng)建
其實我們在之前的學(xué)習(xí)中已經(jīng)或多或少的有使用到對象,我們是這樣創(chuàng)建一個對象的:
animal animal = new animal();
animal animal12 = new animal(true);
在字符串的學(xué)習(xí)中,我們使用過String類的構(gòu)造方法,創(chuàng)建一個初始化對象.
String astr3 = new String(a,0,2);
String astr4 = new String(b);
String astr5 = new String(b,0,2);
在Java語言中我們通過new操作符來創(chuàng)建對象.

這里其實有一點小疏忽,一般情況下,類的成員變量一般不會設(shè)置成公開的,需要使用private修飾符將其修飾為私有的,然后通過成員方法來訪問和設(shè)置它的值.
private boolean independentThing;
System.out.println(animal.getindepentThing());
animal1.setindepentThing(false);
我們實例化了對象之后,我們就可以通過對象來調(diào)用其屬性和行為(就是方法)了
animal.eat();
System.out.println(animal.independentThing);
- 對象的引用
在Java語言中,盡管一切都可以看作對象,但實際上的操作標(biāo)識符是一個引用,那么引用在Java中是怎么體現(xiàn)的.
// 類名 對象引用名稱,
animal animal;
實際上,引用并不一定要有一個對象相關(guān)聯(lián),引用和對象相關(guān)連的語法是:
animal animal = new animal();
new就是創(chuàng)建對象的操作符,整個語句相當(dāng)于創(chuàng)建一個引用animal類的對象,這就是實例化對象的過程.
-
對象的比較
我們知道在程序的實際中經(jīng)常會使用到比較判斷,而我們在前面的基礎(chǔ)數(shù)據(jù)類型和運算符的學(xué)習(xí)中知道了,==符是用來比較兩個數(shù)據(jù)的.那么我們現(xiàn)在又知道了對象在Java中的地位是舉足輕重的,并且會時長用到,那么對象的比較是否也可以使用==符來比較呢.
System.out.println("字符串是否和abc相等:"+mstr.equals("abc"));
System.out.println("字符串是否和abc相等:"+(mstr=="abc"));
顯然,是不行的,因為我們在前面字符串的比較時就簡單的了解到,==號是不能用來比較兩個String類型的值的,需要通過String類的equals()方法比較.對象的比較是通過其相應(yīng)類的equals()方法進行比較的.而不能使用==符比較,這是因為==比較的是兩者引用的地址是否相等.而equals方法比較的才是比較兩個對象引用的內(nèi)容是否相等.
- 對象的銷毀
每個對象都有聲明周期,當(dāng)生命周期結(jié)束的時候,對象就會被銷毀,其分配的內(nèi)存就會被回收,在其他一些語言中,對象的內(nèi)存回收可能會需要手動銷毀回收,但在Java語言中,擁有一整套完整的垃圾回收機制,可以根據(jù)對象的生命周期來回收其內(nèi)存,Java的垃圾回收機制也不單單運用在對象上,它對于Java的內(nèi)存回收有一整個控制回收機制.我們在這里就簡單的了解一下就行.
- 后記
類和對象可以說是Java語言的基礎(chǔ)之基礎(chǔ),重中之重,理解清楚面向?qū)ο笏枷牒蛯W(xué)明白Java類和對象的機制是學(xué)習(xí)Java語言的必不可缺的階段,在理解它們的基礎(chǔ)上學(xué)習(xí)Java能夠達(dá)到事半功倍的地步.因為可以說Java語言的一切幾乎都是建立在類和對象上的,當(dāng)你把類和對象理解透徹了,在其基礎(chǔ)上學(xué)習(xí)其它知識怎會不更加簡易呢.?
更新時間:
2019-4-8
21:04