深入淺出分析Java 類和對(duì)象
一、什么是類
類(Class)是面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP,Object-Oriented Programming)實(shí)現(xiàn)信息封裝的基礎(chǔ)。類是一種用戶自定義的引用數(shù)據(jù)類型,也稱類類型。每個(gè)類包含數(shù)據(jù)說明和一組操作數(shù)據(jù)或傳遞消息的函數(shù),類的實(shí)例稱為對(duì)象
類的實(shí)質(zhì)是一種引用數(shù)據(jù)類型,類似于 byte,short,int,char,long, float, double等基本數(shù)據(jù)類型,不同的是它是一種復(fù)雜的數(shù)據(jù)類型。因?yàn)樗谋举|(zhì)是數(shù)據(jù)類型,而不是數(shù)據(jù),所以不存在于內(nèi)存中,不能被直接操作,只有被實(shí)例化為對(duì)象時(shí),才會(huì)變得可操作。
二、Java的類和C語言的結(jié)構(gòu)體異同
我們可以發(fā)現(xiàn)Java中的類其實(shí)和C語言中的結(jié)構(gòu)體很像,那么他們有什么區(qū)別呢?
1.打包的對(duì)象不同
C 語言的結(jié)構(gòu)體是對(duì)數(shù)據(jù)的打包。把一堆概念上相互關(guān)聯(lián)的數(shù)據(jù)打包到一起,方便整體處理。外界可以隨意讀寫這些數(shù)據(jù)
Java的對(duì)象可以是對(duì)數(shù)據(jù)的打包,也可以是對(duì)職責(zé)的打包
2. 存放的位置不同
C 語言的結(jié)構(gòu)體可以存放在棧上,也可以存在堆上
Java的對(duì)象只能存在堆上
三、類和類的實(shí)例化
類的成員可以包含以下:字段、方法、代碼塊、內(nèi)部類和接口等
可以形象的理解為類是一個(gè)模板,類的實(shí)例化就是通過這個(gè)模板來創(chuàng)建對(duì)象(一個(gè)模板可以創(chuàng)建無數(shù)的對(duì)象)
聲明一個(gè)類其實(shí)就相當(dāng)于是在自定義一種新的類型,引用類型
類的聲明
基本形式:
class 類名 {
字段(成員變量/屬性);
方法(成員方法);
}
這里的 class 就是類的關(guān)鍵字
類中的元素:屬性(在類里面,方法的外面)
類中的方法:成員方法
如下示例:
public class Dog { public String name; public int age; public void bark() { System.out.println("汪汪"); } }
通過以上代碼這就創(chuàng)建了一個(gè)狗這個(gè)類,有姓名和年齡兩個(gè)屬性,行為就是叫
屬性前面的public是訪問修飾符
成員方法前面不加 static
實(shí)例化的對(duì)象,成員遵循默認(rèn)值規(guī)則
默認(rèn)值規(guī)則:0 的變形
特殊的:
引用類型:null? ? ? ? ?
boolean:false? ? ?
char:'\u0000' (空字符)
類的實(shí)例化
class Dog { public String name; public int age; public boolean are; public static int a; public void bark() { System.out.println("汪汪"); } } public class Practice { public static void main(String[] args) { Dog dog = new Dog(); // 實(shí)例化一個(gè)對(duì)象 System.out.println(dog.are); // 通過.來訪問 } }
這里通過new來實(shí)例化一個(gè)對(duì)象,通過對(duì)象的引用 . 成員變量來訪問成員變量,普通方法通過對(duì)象的引用 . 方法名來調(diào)用
靜態(tài)屬性(靜態(tài)成員變量)
被定義在類的內(nèi)部,方法的外部,加static修飾
如下代碼:
class Dog { public String name; public int age; public boolean are; public static int a; // 靜態(tài)屬性 public void bark() { System.out.println("汪汪"); } }
注意: 靜態(tài)屬性仍然遵循默認(rèn)值規(guī)則
如何訪問:
需要知道靜態(tài)成員變量并不屬于對(duì)象,而是屬于類,所以我們不能通過對(duì)象的引用 . 成員變量去訪問,而是 類名 . 靜態(tài)屬性 去訪問,靜態(tài)方法通過類名來訪問
如下:
System.out.println(Dog.a);
錯(cuò)誤示例:
System.out.println(dog.a);
訪問類的靜態(tài)屬性不需要有對(duì)象,直接就可以訪問
注意:
- 靜態(tài)屬性存在于方法區(qū)
- 不管new多少個(gè)對(duì)象,靜態(tài)屬性只有一份
- 靜態(tài)方法內(nèi)部不能夠訪問非靜態(tài)的數(shù)據(jù)成員的值,也不能調(diào)用非靜態(tài)方法
- 靜態(tài)方法不依賴對(duì)象
四、構(gòu)造方法
首先我們想想,一個(gè)對(duì)象時(shí)如何產(chǎn)生的?
- 為對(duì)象分配內(nèi)存
- 調(diào)用合適的構(gòu)造方法
在我們使用new來實(shí)例化對(duì)象時(shí),構(gòu)造方法會(huì)被自動(dòng)調(diào)用,完成初始化操作
創(chuàng)建構(gòu)造方法
- 方法名必須和類名相同
- 無返回值類型聲明
- 每個(gè)類至少存在一個(gè)構(gòu)造方法(沒有定義時(shí),系統(tǒng)自動(dòng)生成一個(gè)無參構(gòu)造)
如下代碼:
class Dog { public String name; public int age; public boolean are; public static int a; public Dog() { } public Dog(String name) { this.name = name; } public void bark() { System.out.println("汪汪"); } } public class Practice { public static void main(String[] args) { Dog dog = new Dog("旺財(cái)"); System.out.println(dog.name); } }
在這段代碼中有Dog這個(gè)類,里面共有兩個(gè)構(gòu)造方法,一個(gè)無參構(gòu)造,一個(gè)有參構(gòu)造,在通過new創(chuàng)建對(duì)象時(shí),使用了有參構(gòu)造,可以看到打印出來的結(jié)果
所以其實(shí)也就能看出來,到底調(diào)用哪個(gè)構(gòu)造方法,取決于new時(shí)傳的參數(shù)
需要注意:
- 當(dāng)類中沒有構(gòu)造方法的時(shí)候,系統(tǒng)會(huì)自動(dòng)補(bǔ)一個(gè)無參構(gòu)造方法,但是當(dāng)你自己寫了構(gòu)造方法的時(shí)候,就不會(huì)補(bǔ)這個(gè)無參構(gòu)造,若需要用無參構(gòu)造,就需要自己手動(dòng)寫
- 構(gòu)造方法也支持重載
this
this的作用
在很多情況下,可能都會(huì)有人誤以為 this 是當(dāng)前對(duì)象,但其實(shí) this 是當(dāng)前對(duì)象的引用
為什么this不是對(duì)象,而是引用:
我們要知道,構(gòu)造方法是用來創(chuàng)建對(duì)象的,那么在調(diào)用構(gòu)造方法創(chuàng)建對(duì)象的過程中,這個(gè)對(duì)象還是不存在的,哪來的對(duì)象之說
因此我們可以通過this去訪問屬性、成員方法、構(gòu)造方法(調(diào)用構(gòu)造方法時(shí),只能放在第一行,只能在構(gòu)造方法里面寫,只能用一次)
到此這篇關(guān)于深入淺出分析Java 類和對(duì)象的文章就介紹到這了,更多相關(guān)Java 類和對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java遞歸讀取文件例子_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文通過一段示例代碼給大家介紹了java遞歸讀取文件的方法,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-05-05使用logback實(shí)現(xiàn)按自己的需求打印日志到自定義的文件里
這篇文章主要介紹了使用logback實(shí)現(xiàn)按自己的需求打印日志到自定義的文件里,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08springboot整合redis實(shí)現(xiàn)發(fā)送郵箱并驗(yàn)證
大家好,本篇文章主要講的是springboot整合redis實(shí)現(xiàn)發(fā)送郵箱并驗(yàn)證,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01詳解SpringBoot注冊(cè)Windows服務(wù)和啟動(dòng)報(bào)錯(cuò)的原因
這篇文章主要介紹了詳解SpringBoot注冊(cè)Windows服務(wù)和啟動(dòng)報(bào)錯(cuò)的原因,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03Java通過SSH連接路由器輸入命令并讀取響應(yīng)的操作方法
最近需要讀取和修改華為路由器的配置,使用Java語言開發(fā),通過SSH連接,輸入命令并讀取響應(yīng),接下來通過本文給大家介紹下Java通過SSH連接路由器,輸入命令并讀取響應(yīng),需要的朋友可以參考下2024-01-01javascript checkbox全選和反選的簡單實(shí)現(xiàn)
這篇文章主要介紹了javascript checkbox全選和反選的簡單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-05-05Mybatis配置之<environments>配置元素詳解
這篇文章主要介紹了Mybatis配置之<environments>配置元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個(gè)
這篇文章主要介紹了Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個(gè),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09springboot整合mybatis plus與druid詳情
這篇文章主要介紹了springboot整合mybatis plus與druid詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的下伙伴可以參考一下2022-09-09Java棧之鏈?zhǔn)綏4鎯?chǔ)結(jié)構(gòu)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java棧之鏈?zhǔn)綏4鎯?chǔ)結(jié)構(gòu)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04