Java类与对象
類與對象
- 類與對象的定義使用
- 對象內(nèi)存分析
- 對象引用分析
- 成員屬性與封裝處理
- 構(gòu)造方法與匿名對象
- 匿名對象
類與對象的定義使用
如果想使用類,必須使用對象來完成,如果要產(chǎn)生對象,那么必須使用如下語法格式來完成:
- 聲明并實例化對象:類名稱 對象名稱 = new 類名稱();
- 分步驟完成:
- 聲明對象:類名稱 對象名稱 = null;
- 實例化對象:對象名稱 = new 類名稱();
當(dāng)獲取了實例化對象后,那么就需要通過對象進(jìn)行類中的調(diào)用操作,此時有兩種調(diào)用方式:
- 調(diào)用類中的屬性:實例化對象.成員屬性
- 調(diào)用類中的方法:實例化對象.方法名稱()
如下代碼:
代碼示例1
程序截圖:
如果此時程序并沒有進(jìn)行屬性內(nèi)容的設(shè)置,則該程序內(nèi)容為其對應(yīng)對應(yīng)數(shù)據(jù)類型的默認(rèn)值。
class Person{ String name; int age; public void tell(){ System.out.println("姓名:"+name+",年齡:"+age); } } public class Main { public static void main(String[] args) { Person per=new Person();//聲明實例化對象 per.tell();//進(jìn)行方法調(diào)用 } }程序截圖:
String是引用數(shù)據(jù)類型所以默認(rèn)值為null,而int為基本數(shù)據(jù)類型,默認(rèn)值為0。
對象內(nèi)存分析
java之中類屬于引用數(shù)據(jù)類型,引用數(shù)據(jù)類型最大的困難在于內(nèi)存的管理,同時在進(jìn)行操作時,也會存在內(nèi)存的變化。
如果要進(jìn)行內(nèi)存分析,那么首先給出兩塊最常用的內(nèi)存空間:
- 棧內(nèi)存:保存的是一塊堆內(nèi)存的地址。
- 堆內(nèi)存:保存的是對象具體的信息。
如何看待他倆的區(qū)別呢,好比如說,你叫夏添,你媽讓你去掃地,你媽是讓夏添這個人去掃地,而不是讓夏添這個名字去掃地,哪怕你改名叫小添添,你媽喊你,也是讓你這個人去掃地。棧內(nèi)存好比整型變量一樣,保存的是一塊堆內(nèi)存的地址,通過地址找到堆內(nèi)存,然后找到對象內(nèi)容。
看圖說話
每個堆內(nèi)存上都有一個地址編號,而找內(nèi)存就是存儲對應(yīng)堆內(nèi)存的地址數(shù)據(jù)。
堆內(nèi)存的開辟是new完成的。
在代碼示例1中分析
Person per=new Person()
Person()決定了堆內(nèi)存中的具體內(nèi)容。對于per,為了簡化起見,我們可以簡單地理解為:對象名稱保存在棧內(nèi)存中。
per.name="夏添";
per.age=19;
代碼中如果只是聲明了對象,并沒有為對象進(jìn)行實例化,是無法調(diào)用的。而因此當(dāng)程序中出現(xiàn)NullPointerException就是在沒有堆內(nèi)存開辟后時所產(chǎn)生的問題,并且只有引用數(shù)據(jù)類型存在有此問題。
對象引用分析
類本身屬于引用數(shù)據(jù)類型,會牽扯到內(nèi)存的引用傳遞,所謂引用傳遞的本質(zhì):同一塊堆內(nèi)存的地址可以被不同的棧內(nèi)存所訪問。 見如下代碼:
class Person{ String name; int age; public void tell(){ System.out.println("姓名:"+name+",年齡:"+age); } } public class Main { public static void main(String[] args) { Person per1=new Person();//聲明實例化對象 per1.name="夏添"; per1.age=19; Person per2=per1;per2.age=20;per1.tell();//進(jìn)行方法調(diào)用 } }程序截圖:
程序分析圖:
這個時候引用傳遞是直接在主方法中定義的,也可以通過方法 實現(xiàn)引用傳遞處理。
通過方法實現(xiàn)引用傳遞處理
class Person{ String name; int age; public void tell(){ System.out.println("姓名:"+name+",年齡:"+age); } } public class Main { public static void main(String[] args) { Person per1=new Person();//聲明實例化對象 Person per=new Person();per.name="夏添";per.age=19;change(per);per.tell();} public static void change(Person temp) { temp.age=20;} }程序截圖:
與之前最大差別地方在于,此時程序是將Person類的實例化對象(內(nèi)存地址,數(shù)值)傳遞到了change,由于傳遞的是一個Person類型,那么change()方法接受的也是Person類型。
成員屬性與封裝處理
在類之中的組成就是屬性與方法,一般而言都是對外提供服務(wù),所以是不會有較高安全性的,所以往往需要對其進(jìn)行保護(hù),這個時候就需要采用封裝性對屬性進(jìn)行保護(hù)。
在默認(rèn)情況下,對于類中的屬性是可以被其它類利用對象進(jìn)行調(diào)用的。
而屬性一般封裝后外部將不能夠直接訪問,即:對外部不可見,但是對類的內(nèi)部是可見的,如果想要外部可以訪問封裝的屬性,則:
設(shè)置或取得屬性可以使用setXXX(),getXXX()方法,以private String name為例:
- 設(shè)置屬性方法:public void setName(String n);
- 獲取屬性方法:public void setName();
代碼示例2
程序截圖:
在以后的任何定義類的時候一定要記住,類中的所有屬性都必須使用private封裝,提供有setter,getter方法。
構(gòu)造方法與匿名對象
在代碼示例2中假如現(xiàn)在類中的屬性很多,這個時候調(diào)用setter方法進(jìn)行內(nèi)容設(shè)置,這樣的調(diào)用實在太啰嗦了,對于這種問題,專門提供有構(gòu)造方法,即:可以提供構(gòu)造方法實現(xiàn)實例化對象中的屬性初始化處理。只有在關(guān)鍵字new的時候使用構(gòu)造方法,
- 構(gòu)造方法名稱必須與類名稱保持一致;
- 構(gòu)造方法不允許設(shè)置任何返回值類型,即:沒有返回值定義;
- 構(gòu)造方法是使用關(guān)鍵字new實例化對象的時候自動調(diào)用的。
代碼示例3
對于代碼示例3中的 Person per=new Person(“夏添”,19)的Person(“夏添”,19)是調(diào)用有參構(gòu)造;示例2中的 Person per1=new Person()的Person()是調(diào)用無參構(gòu)造。
在java程序里面考慮到程序結(jié)構(gòu)的完整性,所以所有的類都會提供有構(gòu)造方法,如果你現(xiàn)在的類中沒有定義任何的構(gòu)造方法,那么一定會默認(rèn)提供一個無參的,什么都不做的構(gòu)造方法,這個構(gòu)造方法是程序編譯時自動創(chuàng)建的。
一個類至少存在一個構(gòu)造方法
構(gòu)造方法是不允許設(shè)置返回值類型。
如果構(gòu)造方法上使用了void,那么就與普通方法的結(jié)構(gòu)完全相同了。構(gòu)造方法和普通方法的區(qū)別在于構(gòu)造方法是在類對象實例化的時候調(diào)用的,而普通方法是在類對象實例化產(chǎn)生之后調(diào)用的。
在構(gòu)造方法方法重載時,建議有一些定義的順序,例如,可以按照參數(shù)的個數(shù)降序(或升序)排列。
構(gòu)造方法可以進(jìn)行數(shù)據(jù)的設(shè)置,而對于setter也可以進(jìn)行數(shù)據(jù)的設(shè)置,對于構(gòu)造方法是在對象實例化的時候為屬性設(shè)置進(jìn)行初始化,setter不僅可以為屬性設(shè)置進(jìn)行初始化,還可以修改屬性數(shù)據(jù)。
代碼示例4
匿名對象
只通過實例化對象進(jìn)行類的操作也是可以的,而這種形式的對象稱為匿名對象。
在代碼示例4上,
此時依然通過了對象進(jìn)行了類中tell()方法的調(diào)用,但由于此對象沒有任何的引用名稱,所以該對象引用了一次后就將稱為我們的垃圾,然后所有的垃圾被GC進(jìn)行回收和釋放。
只要是方法都可以傳遞任意的數(shù)據(jù)類型(基本數(shù)據(jù)類型,引用數(shù)據(jù)類型),例:
class Message{ private String title; public Message(String t){ title=t; } public String getTitle() { return title; } public void setTitle(String t) { title = t; }} class Person{ private String name; private int age; public void tell(){ System.out.println("姓名:"+name+",年齡:"+age); } public Person(Message msg,int a){ name=msg.getTitle(); age=a; } public Message getInfo(){ return new Message(name); } public class Main { public static void main(String[] args) { Message msg=new Message("mldn"); Person per=new Person(msg,20); msg= per.getInfo(); per.tell(); }}總結(jié)
- 上一篇: 资源搜索技巧
- 下一篇: java美元兑换,(Java实现) 美元