Java类与对象
類與對象
- 類與對象的定義使用
- 對象內存分析
- 對象引用分析
- 成員屬性與封裝處理
- 構造方法與匿名對象
- 匿名對象
類與對象的定義使用
如果想使用類,必須使用對象來完成,如果要產生對象,那么必須使用如下語法格式來完成:
- 聲明并實例化對象:類名稱 對象名稱 = new 類名稱();
- 分步驟完成:
- 聲明對象:類名稱 對象名稱 = null;
- 實例化對象:對象名稱 = new 類名稱();
當獲取了實例化對象后,那么就需要通過對象進行類中的調用操作,此時有兩種調用方式:
- 調用類中的屬性:實例化對象.成員屬性
- 調用類中的方法:實例化對象.方法名稱()
如下代碼:
代碼示例1
程序截圖:
如果此時程序并沒有進行屬性內容的設置,則該程序內容為其對應對應數據類型的默認值。
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();//進行方法調用 } }程序截圖:
String是引用數據類型所以默認值為null,而int為基本數據類型,默認值為0。
對象內存分析
java之中類屬于引用數據類型,引用數據類型最大的困難在于內存的管理,同時在進行操作時,也會存在內存的變化。
如果要進行內存分析,那么首先給出兩塊最常用的內存空間:
- 棧內存:保存的是一塊堆內存的地址。
- 堆內存:保存的是對象具體的信息。
如何看待他倆的區別呢,好比如說,你叫夏添,你媽讓你去掃地,你媽是讓夏添這個人去掃地,而不是讓夏添這個名字去掃地,哪怕你改名叫小添添,你媽喊你,也是讓你這個人去掃地。棧內存好比整型變量一樣,保存的是一塊堆內存的地址,通過地址找到堆內存,然后找到對象內容。
看圖說話
每個堆內存上都有一個地址編號,而找內存就是存儲對應堆內存的地址數據。
堆內存的開辟是new完成的。
在代碼示例1中分析
Person per=new Person()
Person()決定了堆內存中的具體內容。對于per,為了簡化起見,我們可以簡單地理解為:對象名稱保存在棧內存中。
per.name="夏添";
per.age=19;
代碼中如果只是聲明了對象,并沒有為對象進行實例化,是無法調用的。而因此當程序中出現NullPointerException就是在沒有堆內存開辟后時所產生的問題,并且只有引用數據類型存在有此問題。
對象引用分析
類本身屬于引用數據類型,會牽扯到內存的引用傳遞,所謂引用傳遞的本質:同一塊堆內存的地址可以被不同的棧內存所訪問。 見如下代碼:
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();//進行方法調用 } }程序截圖:
程序分析圖:
這個時候引用傳遞是直接在主方法中定義的,也可以通過方法 實現引用傳遞處理。
通過方法實現引用傳遞處理
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類的實例化對象(內存地址,數值)傳遞到了change,由于傳遞的是一個Person類型,那么change()方法接受的也是Person類型。
成員屬性與封裝處理
在類之中的組成就是屬性與方法,一般而言都是對外提供服務,所以是不會有較高安全性的,所以往往需要對其進行保護,這個時候就需要采用封裝性對屬性進行保護。
在默認情況下,對于類中的屬性是可以被其它類利用對象進行調用的。
而屬性一般封裝后外部將不能夠直接訪問,即:對外部不可見,但是對類的內部是可見的,如果想要外部可以訪問封裝的屬性,則:
設置或取得屬性可以使用setXXX(),getXXX()方法,以private String name為例:
- 設置屬性方法:public void setName(String n);
- 獲取屬性方法:public void setName();
代碼示例2
程序截圖:
在以后的任何定義類的時候一定要記住,類中的所有屬性都必須使用private封裝,提供有setter,getter方法。
構造方法與匿名對象
在代碼示例2中假如現在類中的屬性很多,這個時候調用setter方法進行內容設置,這樣的調用實在太啰嗦了,對于這種問題,專門提供有構造方法,即:可以提供構造方法實現實例化對象中的屬性初始化處理。只有在關鍵字new的時候使用構造方法,
- 構造方法名稱必須與類名稱保持一致;
- 構造方法不允許設置任何返回值類型,即:沒有返回值定義;
- 構造方法是使用關鍵字new實例化對象的時候自動調用的。
代碼示例3
對于代碼示例3中的 Person per=new Person(“夏添”,19)的Person(“夏添”,19)是調用有參構造;示例2中的 Person per1=new Person()的Person()是調用無參構造。
在java程序里面考慮到程序結構的完整性,所以所有的類都會提供有構造方法,如果你現在的類中沒有定義任何的構造方法,那么一定會默認提供一個無參的,什么都不做的構造方法,這個構造方法是程序編譯時自動創建的。
一個類至少存在一個構造方法
構造方法是不允許設置返回值類型。
如果構造方法上使用了void,那么就與普通方法的結構完全相同了。構造方法和普通方法的區別在于構造方法是在類對象實例化的時候調用的,而普通方法是在類對象實例化產生之后調用的。
在構造方法方法重載時,建議有一些定義的順序,例如,可以按照參數的個數降序(或升序)排列。
構造方法可以進行數據的設置,而對于setter也可以進行數據的設置,對于構造方法是在對象實例化的時候為屬性設置進行初始化,setter不僅可以為屬性設置進行初始化,還可以修改屬性數據。
代碼示例4
匿名對象
只通過實例化對象進行類的操作也是可以的,而這種形式的對象稱為匿名對象。
在代碼示例4上,
此時依然通過了對象進行了類中tell()方法的調用,但由于此對象沒有任何的引用名稱,所以該對象引用了一次后就將稱為我們的垃圾,然后所有的垃圾被GC進行回收和釋放。
只要是方法都可以傳遞任意的數據類型(基本數據類型,引用數據類型),例:
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(); }}總結
- 上一篇: 资源搜索技巧
- 下一篇: 汶川大地震祭(新京报【逝者特刊】卷首语)