Java?精煉解讀類和對象原理
面向?qū)ο?、面向過程
什么是類?
什么是對象?
這是非常抽象的兩個概念?。。。。。。。?/p>
在說清楚類和對象的概念之前,給大家講一下什么是面向?qū)ο?、面向過程,以此來推出我們類和對象的概念。
面向過程:以洗衣服為例:拿盆、放水、放衣服、放洗衣粉、手搓、換水、擰干、晾衣服,這個過程就是面向過程。?
面向?qū)ο螅阂韵匆路槔喝税岩路胚M(jìn)洗衣機(jī),倒入洗衣粉,洗完晾干,不需要關(guān)心洗衣服整個過程是怎么完成的,只需要找對象,創(chuàng)建對象,使用對象。在好比我們使用toString函數(shù),我們并不關(guān)心toString函數(shù)具體的實(shí)現(xiàn)過程,我們直接交給Arrays幫我們實(shí)現(xiàn)就可以了,這就是面向?qū)ο蟆?/p>
對象從哪來的?對象就是從類來的,有類之后才有對象,人,洗衣機(jī)?,洗衣粉,都是單獨(dú)的一個類。由類再產(chǎn)生對象,我們就叫做創(chuàng)建對象。對象都創(chuàng)建好了,每個對象都具備一些行為一些屬性,然后對象之間相互完成就可以了。這就是面向?qū)ο蠛兔嫦蜻^程。
要面向?qū)ο?,我們就要找到對象,而對象是由類來的,類是從哪來的?我們是需要去抽象的。比如說:我們都是人,人的話都有共同的屬性,姓名、性別、年齡、吃飯、睡覺,每個人都會具備這些,相當(dāng)于這就是一個模板,通過這個模板可以產(chǎn)生很多的對象,這些對象都具備這些相同的屬性。就是來抽象這個人,由這個人來創(chuàng)建對象,而這個人就是一個類。真正的要有這樣一個人,讓他是一個對象,是一個實(shí)體,就需要把他創(chuàng)建出來,通過new來創(chuàng)建。
定義類
class Person{ }//定義一個類,這個類叫Person,類名一定要是大駝峰 class Person{ //類里面包含字段,也叫做屬性,也叫做成員變量 //也包含方法 //一個類就是由方法和字段組成的 public String name;//屬性 public int age;//屬性 //什么是方法?可以解讀為這個人的行為 public void eat(){ System.out.println(name+" 正在吃飯"); } public void sleep(){ System.out.println(name+" 正在睡覺"); } }
由類產(chǎn)生對象的過程,術(shù)語我們叫做實(shí)例化,通過new關(guān)鍵字來實(shí)例化對象。
public class TestDemo { public static void main(String[] args) { Person person//定義一個變量person,此時類Person也相當(dāng)于類型的意思,和int a = 10,a的類型是int一樣 } }
由類Person定義的變量person是引用變量,意味著它的初值可以給null
public class TestDemo { public static void main(String[] args) { Person person = null; } }
實(shí)例化對象
public class TestDemo { public static void main(String[] args) { Person person = new Person();//由類Person實(shí)例化了一個對象 } }
一個類可以實(shí)例化多個對象
public class TestDemo { public static void main(String[] args) { Person person = new Person();//由類Person實(shí)例化了一個對象 Person person1 = new Person(); Person person2 = new Person(); Person person3 = new Person(); Person person4 = new Person(); } }
類的成員
普通成員變量
字段是定義在類的內(nèi)部方法的外部,如果定義到方法里頭叫做局部變量,定義到方法外頭叫做成員變量?
?如何訪問成員變量,成員變量分為兩種:(普通成員變量、靜態(tài)成員變量)。普通的成員變量的訪問方式通過引用來訪問。
成員變量沒有賦初值的情況下都有一個默認(rèn)的值
?如何給成員變量賦值
如果是一個普通的成員變量,它的內(nèi)存在對象里面,而不是說所有對象共用一份。每個對象都各有一份自己的name和age
方法也分為兩種:一種叫做普通成員方法,一種叫做靜態(tài)成員方法
普通的成員方法訪問方式也是一樣的,通過對象的引用來訪問我的方法。
靜態(tài)成員變量
被static修飾的的變量叫靜態(tài)成員變量,也叫做類變量,是放在方法區(qū)的
靜態(tài)成員變量的訪問方式是通過類名.靜態(tài)的成員屬性/方法。
不依賴對象
class Person{ public String name; public int age; public static int count; public void eat(){ System.out.println(name+" 正在吃飯"); } public void sleep(){ System.out.println(name+" 正在睡覺"); } } public class TestDemo { public static void main(String[] args) { Person.count++; System.out.println(Person.count); System.out.println("================"); Person.count++; System.out.println(Person.count); } }
打印結(jié)果;
count是被static修飾的靜態(tài)成員變量,是放在方法區(qū)的,不屬于某個對象,屬于類。正確的訪問靜態(tài)成員變量或者方法只要? 類名.靜態(tài)成員變量/方法? ? 就可以了,所有靜態(tài)的東西在方法區(qū)里只存一份,所以加2遍都是加的count本身,所以第二次打印的結(jié)果是2。
普通的方法內(nèi)部不能夠定義靜態(tài)的變量
1.static定義的變量是類變量,屬于類,(定義在方法內(nèi)部就屬于方法了,所以是錯誤的)
2.eat方法的調(diào)用,需要對應(yīng)的引用來調(diào)用。但如果可以定義static的變量,類Person就可以調(diào)用,所以兩者直接是矛盾的,eat需要對應(yīng)的引用來調(diào)用。size只需要類就可以調(diào)用。所以普通的方法內(nèi)部, 不能夠定義靜態(tài)的變量。
靜態(tài)的方法也不可以定義靜態(tài)變量
static定義的變量是類變量,屬于類,(定義在方法內(nèi)部就屬于方法了,這樣是做不到的,所以是錯誤的)
總結(jié):靜態(tài)的成員變量是不可以在方法中定義的?
普通方法里面是可以調(diào)用靜態(tài)方法的
class Person{ public String name; public int age; public static int count; public void eat(){ System.out.println(name+" 正在吃飯"); } public void sleep(){ staticFunc(); System.out.println(name+" 正在睡覺"); } public static void staticFunc(){ System.out.println("static::func"); } } public class TestDemo { public static void main(String[] args) { Person person = new Person(); person.eat(); person.sleep(); } }
?打印結(jié)果:
?靜態(tài)方法內(nèi)部不能調(diào)用普通方法
?靜態(tài)內(nèi)部不可以調(diào)用普通方法,因為靜態(tài)的方法不依賴于對象,?通過類名就可以調(diào)用,但沒有對象普通方法沒法調(diào)用。
main函數(shù)為什么是靜態(tài)的
?一個引用不可以同時指向多個對象
引用肯定是在棧上嗎?肯定不是
?看綠線,畫圖解析
小寫的person屬于TestDemo這個類的成員變量?
final修飾
private實(shí)現(xiàn)封裝
private/ public 這兩個關(guān)鍵字表示 "訪問權(quán)限控制"
被 public 修飾的成員變量或者成員方法, 可以直接被類的調(diào)用者使用.
被 private 修飾的成員變量或者成員方法, 不能被類的調(diào)用者使用.
提供接口
?打印結(jié)果:
this代表當(dāng)前對象的引用
構(gòu)造方法
構(gòu)造方法:方法名和類名是相同的,且構(gòu)造方法比較特殊,沒有返回值
構(gòu)造方法是干嘛的?我們需要知道一個對象的產(chǎn)生(對象的實(shí)例化)?分為幾步
1.為對象分配內(nèi)存
2.調(diào)用合適的構(gòu)造方法
這就是一個構(gòu)造方法
前面的訪問修飾符可以是public,
?調(diào)用構(gòu)造方法:
打印結(jié)果:
不帶參數(shù)和帶一個參數(shù)和帶兩個參數(shù)的構(gòu)造方法
?調(diào)用構(gòu)造方法:
this的區(qū)別
第一種:
?第二種:
代表當(dāng)前對象的eat方法
?第三種:
調(diào)用不帶參數(shù)的構(gòu)造方法,
?打印結(jié)果 :
this函數(shù)必須放到第一行,只能存放在構(gòu)造函數(shù)當(dāng)中
代碼塊
本地代碼塊:
兩個括號
?實(shí)例代碼塊和靜態(tài)代碼塊:
靜態(tài)代碼塊不管生成多少個對象,其只會執(zhí)行一次,且是最先執(zhí)行的。 靜態(tài)代碼塊執(zhí)行完畢后, 實(shí)例代碼塊(構(gòu)造塊)執(zhí)行,再然后是構(gòu)造函數(shù)執(zhí)行。?
太累了,拜拜?。。。。?!
到此這篇關(guān)于Java?精煉解讀類和對象原理的文章就介紹到這了,更多相關(guān)Java 類和對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springBoot?之spring.factories擴(kuò)展機(jī)制示例解析
這篇文章主要為大家介紹了springBoot?之spring.factories擴(kuò)展機(jī)制示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Java將字符串String轉(zhuǎn)換為整型Int的兩種方式
這篇文章主要介紹了Java如何將字符串String轉(zhuǎn)換為整型Int,在 Java 中要將 String 類型轉(zhuǎn)化為 int 類型時,需要使用 Integer 類中的 parseInt() 方法或者 valueOf() 方法進(jìn)行轉(zhuǎn)換,本文通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2023-04-04全面解析Hibernate關(guān)聯(lián)操作、查詢操作、高級特性、并發(fā)處理機(jī)制
這篇文章主要介紹了全面解析Hibernate關(guān)聯(lián)操作、查詢操作、高級特性、并發(fā)處理機(jī)制的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06完美解決springboot項目出現(xiàn)”java: 錯誤: 無效的源發(fā)行版:17“問題(圖文詳解)
這篇文章主要介紹了完美解決springboot項目出現(xiàn)”java: 錯誤: 無效的源發(fā)行版:17“問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04向Spring IOC 容器動態(tài)注冊bean實(shí)現(xiàn)方式
這篇文章主要為大家介紹了向Spring IOC 容器動態(tài)注冊bean實(shí)現(xiàn)方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07ArrayList的自動擴(kuò)充機(jī)制實(shí)例解析
本文主要介紹了ArrayList的自動擴(kuò)充機(jī)制,由一個題目切入主題,逐步向大家展示了ArrayList的相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。2017-10-10