Java?精煉解讀類和對(duì)象原理
面向?qū)ο?、面向過程
什么是類?
什么是對(duì)象?
這是非常抽象的兩個(gè)概念?。。。。。。。?/p>
在說清楚類和對(duì)象的概念之前,給大家講一下什么是面向?qū)ο蟆⒚嫦蜻^程,以此來推出我們類和對(duì)象的概念。
面向過程:以洗衣服為例:拿盆、放水、放衣服、放洗衣粉、手搓、換水、擰干、晾衣服,這個(gè)過程就是面向過程。?
面向?qū)ο螅阂韵匆路槔喝税岩路胚M(jìn)洗衣機(jī),倒入洗衣粉,洗完晾干,不需要關(guān)心洗衣服整個(gè)過程是怎么完成的,只需要找對(duì)象,創(chuàng)建對(duì)象,使用對(duì)象。在好比我們使用toString函數(shù),我們并不關(guān)心toString函數(shù)具體的實(shí)現(xiàn)過程,我們直接交給Arrays幫我們實(shí)現(xiàn)就可以了,這就是面向?qū)ο蟆?/p>
對(duì)象從哪來的?對(duì)象就是從類來的,有類之后才有對(duì)象,人,洗衣機(jī)?,洗衣粉,都是單獨(dú)的一個(gè)類。由類再產(chǎn)生對(duì)象,我們就叫做創(chuàng)建對(duì)象。對(duì)象都創(chuàng)建好了,每個(gè)對(duì)象都具備一些行為一些屬性,然后對(duì)象之間相互完成就可以了。這就是面向?qū)ο蠛兔嫦蜻^程。
要面向?qū)ο?,我們就要找到?duì)象,而對(duì)象是由類來的,類是從哪來的?我們是需要去抽象的。比如說:我們都是人,人的話都有共同的屬性,姓名、性別、年齡、吃飯、睡覺,每個(gè)人都會(huì)具備這些,相當(dāng)于這就是一個(gè)模板,通過這個(gè)模板可以產(chǎn)生很多的對(duì)象,這些對(duì)象都具備這些相同的屬性。就是來抽象這個(gè)人,由這個(gè)人來創(chuàng)建對(duì)象,而這個(gè)人就是一個(gè)類。真正的要有這樣一個(gè)人,讓他是一個(gè)對(duì)象,是一個(gè)實(shí)體,就需要把他創(chuàng)建出來,通過new來創(chuàng)建。
定義類
class Person{
}//定義一個(gè)類,這個(gè)類叫Person,類名一定要是大駝峰
class Person{
//類里面包含字段,也叫做屬性,也叫做成員變量
//也包含方法
//一個(gè)類就是由方法和字段組成的
public String name;//屬性
public int age;//屬性
//什么是方法?可以解讀為這個(gè)人的行為
public void eat(){
System.out.println(name+" 正在吃飯");
}
public void sleep(){
System.out.println(name+" 正在睡覺");
}
}
由類產(chǎn)生對(duì)象的過程,術(shù)語我們叫做實(shí)例化,通過new關(guān)鍵字來實(shí)例化對(duì)象。
public class TestDemo {
public static void main(String[] args) {
Person person//定義一個(gè)變量person,此時(shí)類Person也相當(dāng)于類型的意思,和int a = 10,a的類型是int一樣
}
}
由類Person定義的變量person是引用變量,意味著它的初值可以給null
public class TestDemo {
public static void main(String[] args) {
Person person = null;
}
}
實(shí)例化對(duì)象
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();//由類Person實(shí)例化了一個(gè)對(duì)象
}
}
一個(gè)類可以實(shí)例化多個(gè)對(duì)象
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();//由類Person實(shí)例化了一個(gè)對(duì)象
Person person1 = new Person();
Person person2 = new Person();
Person person3 = new Person();
Person person4 = new Person();
}
}
類的成員
普通成員變量
字段是定義在類的內(nèi)部方法的外部,如果定義到方法里頭叫做局部變量,定義到方法外頭叫做成員變量?
?如何訪問成員變量,成員變量分為兩種:(普通成員變量、靜態(tài)成員變量)。普通的成員變量的訪問方式通過引用來訪問。

成員變量沒有賦初值的情況下都有一個(gè)默認(rèn)的值
?如何給成員變量賦值

如果是一個(gè)普通的成員變量,它的內(nèi)存在對(duì)象里面,而不是說所有對(duì)象共用一份。每個(gè)對(duì)象都各有一份自己的name和age


方法也分為兩種:一種叫做普通成員方法,一種叫做靜態(tài)成員方法
普通的成員方法訪問方式也是一樣的,通過對(duì)象的引用來訪問我的方法。

靜態(tài)成員變量
被static修飾的的變量叫靜態(tài)成員變量,也叫做類變量,是放在方法區(qū)的
靜態(tài)成員變量的訪問方式是通過類名.靜態(tài)的成員屬性/方法。
不依賴對(duì)象
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ū)的,不屬于某個(gè)對(duì)象,屬于類。正確的訪問靜態(tài)成員變量或者方法只要? 類名.靜態(tài)成員變量/方法? ? 就可以了,所有靜態(tài)的東西在方法區(qū)里只存一份,所以加2遍都是加的count本身,所以第二次打印的結(jié)果是2。
普通的方法內(nèi)部不能夠定義靜態(tài)的變量

1.static定義的變量是類變量,屬于類,(定義在方法內(nèi)部就屬于方法了,所以是錯(cuò)誤的)
2.eat方法的調(diào)用,需要對(duì)應(yīng)的引用來調(diào)用。但如果可以定義static的變量,類Person就可以調(diào)用,所以兩者直接是矛盾的,eat需要對(duì)應(yīng)的引用來調(diào)用。size只需要類就可以調(diào)用。所以普通的方法內(nèi)部, 不能夠定義靜態(tài)的變量。
靜態(tài)的方法也不可以定義靜態(tài)變量

static定義的變量是類變量,屬于類,(定義在方法內(nèi)部就屬于方法了,這樣是做不到的,所以是錯(cuò)誤的)
總結(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)用普通方法,因?yàn)殪o態(tài)的方法不依賴于對(duì)象,?通過類名就可以調(diào)用,但沒有對(duì)象普通方法沒法調(diào)用。
main函數(shù)為什么是靜態(tài)的

?一個(gè)引用不可以同時(shí)指向多個(gè)對(duì)象

引用肯定是在棧上嗎?肯定不是

?看綠線,畫圖解析

小寫的person屬于TestDemo這個(gè)類的成員變量?
final修飾

private實(shí)現(xiàn)封裝
private/ public 這兩個(gè)關(guān)鍵字表示 "訪問權(quán)限控制"
被 public 修飾的成員變量或者成員方法, 可以直接被類的調(diào)用者使用.
被 private 修飾的成員變量或者成員方法, 不能被類的調(diào)用者使用.

提供接口


?打印結(jié)果:

this代表當(dāng)前對(duì)象的引用

構(gòu)造方法
構(gòu)造方法:方法名和類名是相同的,且構(gòu)造方法比較特殊,沒有返回值
構(gòu)造方法是干嘛的?我們需要知道一個(gè)對(duì)象的產(chǎn)生(對(duì)象的實(shí)例化)?分為幾步
1.為對(duì)象分配內(nèi)存
2.調(diào)用合適的構(gòu)造方法


這就是一個(gè)構(gòu)造方法
前面的訪問修飾符可以是public,

?調(diào)用構(gòu)造方法:

打印結(jié)果:


不帶參數(shù)和帶一個(gè)參數(shù)和帶兩個(gè)參數(shù)的構(gòu)造方法

?調(diào)用構(gòu)造方法:


this的區(qū)別

第一種:

?第二種:

代表當(dāng)前對(duì)象的eat方法
?第三種:
調(diào)用不帶參數(shù)的構(gòu)造方法,


?打印結(jié)果 :

this函數(shù)必須放到第一行,只能存放在構(gòu)造函數(shù)當(dāng)中

代碼塊

本地代碼塊:
兩個(gè)括號(hào)

?實(shí)例代碼塊和靜態(tài)代碼塊:

靜態(tài)代碼塊不管生成多少個(gè)對(duì)象,其只會(huì)執(zhí)行一次,且是最先執(zhí)行的。 靜態(tài)代碼塊執(zhí)行完畢后, 實(shí)例代碼塊(構(gòu)造塊)執(zhí)行,再然后是構(gòu)造函數(shù)執(zhí)行。?
太累了,拜拜!?。。。?!
到此這篇關(guān)于Java?精煉解讀類和對(duì)象原理的文章就介紹到這了,更多相關(guān)Java 類和對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解spring boot 以jar的方式啟動(dòng)常用shell腳本
本篇文章主要介紹了詳解spring boot 以jar的方式啟動(dòng)常用shell腳本,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09
實(shí)戰(zhàn)干貨之基于SpringBoot的RabbitMQ多種模式隊(duì)列
RabbitMQ 是一個(gè)由Erlang語言開發(fā)的AMQP的開源實(shí)現(xiàn),支持多種客戶端。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗,下文將帶你深入了解 RabbitMQ 多種模式隊(duì)列2021-09-09
解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的問題
這篇文章主要介紹了解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
使用Netty快速實(shí)現(xiàn)一個(gè)群聊功能的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用?Netty?框架開發(fā)一個(gè)?WebSocket?服務(wù)端,從而實(shí)現(xiàn)一個(gè)簡(jiǎn)單的在線聊天功能,感興趣的小伙伴可以了解下2023-11-11
java?web項(xiàng)目Session獲取不到問題及解決
這篇文章主要介紹了java?web項(xiàng)目Session獲取不到問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

