Java全面細(xì)致講解類與對(duì)象
類和對(duì)象的關(guān)系
類就是一類對(duì)象的統(tǒng)稱。對(duì)象就是這一類具體化的一個(gè)實(shí)例。 (對(duì)象是類的實(shí)例化)
對(duì)象是什么?
此對(duì)象非彼對(duì)象?。?!??說到對(duì)象就要提到過程。
面向過程:C語言是面向過程的,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題。面向過程注重的是過程,在整個(gè)過程中所涉及的行為,就是功能。
面向?qū)ο螅篔AVA是基于面向?qū)ο蟮?,關(guān)注的是對(duì)象,將一件事情拆分成不同的對(duì)象,靠對(duì)象之間的交互完成。 面向?qū)ο笞⒅氐氖菍?duì)象,也就是參與過程所涉及到的主體。是通過邏輯將一個(gè)個(gè)功能實(shí)現(xiàn)連接起來 。
只能說這樣解釋起來很抽象,舉個(gè)冰箱的例子。
面向過程:1.把冰箱打開 2. 把水果放入 3. 冰箱關(guān)起來
面向?qū)ο螅罕洹?打開冰箱,儲(chǔ)存,關(guān)閉都是對(duì)冰箱的操作,是冰箱的行為。冰箱就是一個(gè)對(duì)象,所以只要操作冰箱所具備的功能,都要定義在冰箱中。
總結(jié):面向?qū)ο缶褪怯么a(類)來描述客觀世界的事物的一種方式。一個(gè)類主要包含一個(gè)事物的屬性和行為。
類和對(duì)象的實(shí)例化
怎么創(chuàng)建一個(gè)類:
// 創(chuàng)建類
class < class_name > {
field ; // 成員屬性
method ; // 成員方法
}
// 實(shí)例化對(duì)象
< class_name > < 對(duì)象名 > = new < class_name > ();
(類名稱采用大駝峰命名方式)
舉個(gè)例子:
public class TestModer { public static void main(String[] args) { Person person1 = new Person(); person1.name = "張三"; person1.age = 18; System.out.println(person1.name); System.out.println(person1.age); person1.eat(); Person person2 = new Person(); person2.name = "李四"; person2.age = 20; System.out.println(person2.name); System.out.println(person2.age); person2.eat(); } } class Person { public String name; public int age; public void eat() { System.out.println("吃飯"); } }
類中定義的變量可稱為“字段”/“屬性”/“成員變量”,類中定義的方法叫成員方法,我們可以知道一個(gè)類可以實(shí)例化多個(gè)對(duì)象,每個(gè)對(duì)象都有一個(gè)普通成員變量。
用類類型創(chuàng)建對(duì)象的過程,稱為類的實(shí)例化
1. 類只是 一個(gè) 模型 一樣的東西,限定了類有哪些成員 。
2. 一個(gè)類可以實(shí)例化出多個(gè)對(duì)象, 實(shí)例化出的對(duì)象占用實(shí)際的物理空間,存儲(chǔ)類成員變量。
static關(guān)鍵字
成員變量分為普通成員變量和靜態(tài)成員變量兩種,普通成員變量上面已經(jīng)說過了-->public String name;name就是普通成員變量,而用static修飾之后,就成為了靜態(tài)成員變量。public static String name,name就成為了靜態(tài)成員變量。下面來看個(gè)例子:
public class TestModer { public static void main(String[] args) { Person person1 = new Person(); person1.age ++; Person.high++; System.out.println(person1.age); System.out.println(Person.high); Person person2 = new Person(); person2.age++; Person.high++; System.out.println(person2.age); System.out.println(Person.high); } } class Person { public int age; public static int high; public void eat() { System.out.println("吃飯"); } }
注意:靜態(tài)成員變量不可以放在其他方法中定義,靜態(tài)變量屬于類,不屬于對(duì)象。
默認(rèn)值:
static修飾的成員變量叫靜態(tài)成員變量,static修飾的方法成為靜態(tài)方法。
1、靜態(tài)方法屬于類,而不屬于類的對(duì)象。
2、可以直接調(diào)用靜態(tài)方法,而無需創(chuàng)建類的實(shí)例。
3、靜態(tài)方法可以訪問靜態(tài)數(shù)據(jù)成員,并可以更改靜態(tài)數(shù)據(jù)成員的值
4、靜態(tài)方法內(nèi)部不可以調(diào)用其他方法,但是其他方法內(nèi)部可以調(diào)用靜態(tài)方法。
看個(gè)例子:
public static void main(String[] args) { Test.change();//無需創(chuàng)建實(shí)例對(duì)象 就可以調(diào)用 System.out.println(Test.count); } } class Test{ public int a; public static int count; public static void change() { count = 100; //a = 10; error 不可以訪問非靜態(tài)數(shù)據(jù)成員 } }
//結(jié)果為100
private實(shí)現(xiàn)的封裝
什么叫封裝:
<< 代碼大全 >> 開篇就在討論一個(gè)問題 : 軟件開發(fā)的本質(zhì)就是對(duì)程序復(fù)雜程度的管理 . 如果一個(gè)軟件代碼復(fù)雜程度太高 , 那么就無法繼續(xù)維護(hù) 。 如何管理復(fù)雜程度 ? 封裝就是最基本的方法 。 在我們寫代碼的時(shí)候經(jīng)常會(huì)涉及兩種角色 : 類的實(shí)現(xiàn)者 和 類的調(diào)用者 . 封裝的本質(zhì)就是讓類的調(diào)用者不必太多的了解類的實(shí)現(xiàn)者是如何實(shí)現(xiàn)類的 , 只要知道如何使用類就行了 .這樣就降低了類使用者的學(xué)習(xí)和使用成本 , 從而降低了復(fù)雜程度。
private實(shí)現(xiàn)的封裝:
private/ public 這兩個(gè)關(guān)鍵字表示 " 訪問權(quán)限控制 " .
被 public 修飾的成員變量或者成員方法 , 可以直接被類的調(diào)用者使用 .
被 private 修飾的成員變量或者成員方法 , 不能被類的調(diào)用者使用 .
換句話說 , 類的使用者根本不需要知道 , 也不需要關(guān)注一個(gè)類都有哪些 private 的成員 。 從而讓類調(diào)用者以更低的 成本來使用類。
看個(gè)例子:
public class TestModer { public static void main(String[] args) { Person person = new Person(); person.show(); } } class Person{ private String name = "張三"; private int age = 18; public void show() { System.out.println("我叫" + name + ", 今年" + age + "歲"); } }
此時(shí)字段已經(jīng)使用 private 來修飾 . 類的調(diào)用者 (main 方法中 ) 不能直接使用 . 而需要借助 show 方法。 此時(shí)類的使用者就不必了解 Person 類的實(shí)現(xiàn)細(xì)節(jié)。 同時(shí)如果類的實(shí)現(xiàn)者修改了字段的名字 , 類的調(diào)用者不需要做出任何修改 ( 類的調(diào)用者根本訪問不到 name, age 這樣的字段 )。
注意:
1、private 不光能修飾字段 , 也能修飾方法
2、通常情況下我們會(huì)把字段設(shè)為 private 屬性 , 但是方法是否需要設(shè)為 public, 就需要視具體情形而定。 一般我們希 望一個(gè)類只提供 " 必要的 " public 方法 , 而不應(yīng)該是把所有的方法都無腦設(shè)為 public。
現(xiàn)在有一個(gè)問題 類的實(shí)現(xiàn)者萬一修改了 public 方法 show 的名字 , 豈不是類的調(diào)用者仍然需要大量修改代碼 嘛 ?
這個(gè)時(shí)候我們就來看看 getter 和 setter 方法。
getter 和 setter 方法的使用:
public class TestModer { public static void main(String[] args) { Person person = new Person(); person.setName("張三"); String name = person.getName(); System.out.println(name); person.show(); } } class Person{ private String name;//實(shí)例成員變量 private int age; public void setName(String name){ //name = name;//不能這樣寫 this.name = name;//this引用,表示調(diào)用該方法的對(duì)象 } public String getName(){ return name; } public void show(){ System.out.println("name: "+name+" age: "+age); } }
字段已經(jīng)使用 private 來修飾. 類的調(diào)用者(main方法中)不能直接使用,這時(shí)候我們可以借助getter和setter來使用,getName 即為 getter 方法, 表示獲取這個(gè)成員的值。setName 即為 setter 方法, 表示設(shè)置這個(gè)成員的值。getter和setter可以不用手動(dòng)輸入,可以在類中點(diǎn)擊右鍵按下圖操作:
在這里我們是調(diào)用了show這個(gè)方法來實(shí)現(xiàn)打印,如果不調(diào)用方法,可以自帶的to String進(jìn)行打印。
to String用法:
public class TestModer { public static void main(String[] args) { Person person = new Person(); person.setName("張三"); String name = person.getName(); System.out.println(name); //person.show(); System.out.println(person); } } class Person{ private String name;//實(shí)例成員變量 private int age; public void setName(String name){ //name = name;//不能這樣寫 this.name = name;//this引用,表示調(diào)用該方法的對(duì)象 } public String getName(){ return name; } //public void show(){ //System.out.println("name: "+name+" age: "+age); //} @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
toString 方法會(huì)在 println 的時(shí)候被自動(dòng)調(diào)用 ,將對(duì)象轉(zhuǎn)成字符串這樣的操作我們稱為 序列化 . toString 是 Object 類提供的方法 , 我們自己創(chuàng)建的 Person 類默認(rèn)繼承自 Object 類 , 可以重寫 toString 方法實(shí)現(xiàn)我們自己版本的轉(zhuǎn)換字符串方法。 快速生成toString的方法: 在類中點(diǎn)擊鼠標(biāo)右鍵,按下圖操作:
構(gòu)造方法
構(gòu)造方法是一種特殊方法 , 使用關(guān)鍵字 new 實(shí)例化新對(duì)象時(shí)會(huì)被自動(dòng)調(diào)用 , 用于完成初始化操作。
new 執(zhí)行過程
- 為對(duì)象分配內(nèi)存空間
- 調(diào)用對(duì)象的構(gòu)造方法
語法規(guī)則
1.方法名稱必須與類名稱相同
2.構(gòu)造方法沒有返回值類型聲明
3. 每一個(gè)類中一定至少存在一個(gè)構(gòu)造方法(沒有明確定義,則系統(tǒng)自動(dòng)生成一個(gè)無參構(gòu)造)
舉個(gè)例子:
public class TestModer { public static void main(String[] args) { Person p1 = new Person();//調(diào)用不帶參數(shù)的構(gòu)造函數(shù) 如果程序沒有提供會(huì)調(diào)用不帶參數(shù)的構(gòu)造函數(shù) p1.show(); Person p2 = new Person("張三",80,"男");//調(diào)用帶有3個(gè)參數(shù)的構(gòu)造函數(shù) p2.show(); } } class Person { private String name;//實(shí)例成員變量 private int age; private String sex; //默認(rèn)構(gòu)造函數(shù) 構(gòu)造對(duì)象 public Person() { this.name = "王五"; this.age = 10; this.sex = "男"; } public Person(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } public void show(){ System.out.println("name: "+name+" age: "+age+" sex: "+sex); } }
注意事項(xiàng) :
如果類中沒有提供任何的構(gòu)造函數(shù),那么編譯器會(huì)默認(rèn)生成一個(gè)不帶有參數(shù)的構(gòu)造函數(shù) 。
若類中定義了構(gòu)造方法,則默認(rèn)的無參構(gòu)造將不再生成。
構(gòu)造方法支持重載, 規(guī)則和普通方法的重載一致。
this關(guān)鍵字
this 表示當(dāng)前對(duì)象引用 ( 注意不是當(dāng)前對(duì)象 ). 可以借助 this 來訪問對(duì)象的字段和方法
this有三種用法:
1、this.date-->調(diào)用當(dāng)前對(duì)象的屬性。
2、this.func()-->調(diào)用當(dāng)前對(duì)象的方法。
3、this()-->調(diào)用當(dāng)前對(duì)象的其他構(gòu)造方法。
前面兩種方法我們之前都用過了,接下來我們來看看第三種用法。
class Person { private String name;//實(shí)例成員變量 private int age; private String sex; //默認(rèn)構(gòu)造方法 構(gòu)造對(duì)象 public Person() { //this調(diào)用構(gòu)造函數(shù) this("bit", 12, "man");//必須放在第一行進(jìn)行顯示 } //這兩個(gè)構(gòu)造方法之間的關(guān)系為重載。 public Person(String name,int age,String sex) { this.name = name; this.age = age; this.sex = sex; } public void show() { System.out.println("name: "+name+" age: "+age+" sex: "+sex); } } public class Main{ public static void main(String[] args) { Person person = new Person();//調(diào)用不帶參數(shù)的構(gòu)造方法 person.show(); }
運(yùn)行結(jié)果:
注意:this()必須放在第一行?。。》駝t會(huì)報(bào)錯(cuò)。
代碼塊
字段的初始化方式有:
1. 就地初始化
2. 使用構(gòu)造方法初始化
3. 使用代碼塊初始化
前兩種方式前面已經(jīng)看過了 , 接下來我們介紹第三種方式 , 使用代碼塊初始化。
代碼塊可以分為四種:
1、普通代碼塊(也稱本地代碼塊)
2、構(gòu)造代碼塊(也稱實(shí)例化代碼塊)
3、靜態(tài)代碼塊
4、同步代碼塊
我們在這里主要認(rèn)識(shí)第二種和第三種。
1、普通代碼塊
定義在方法中
public static void main(String[] args) { { //直接使用{}定義,普通方法塊 int x = 10; System.out.println("x1 = " + x); } } }
2、構(gòu)造代碼塊
構(gòu)造塊:定義在類中的代碼塊 ( 不加修飾符 ) 。也叫: 實(shí)例代碼塊 。構(gòu)造代碼塊一般用于初始化實(shí)例成員變量。
class Person { private String name; private int age=19; public static int count; //構(gòu)造代碼塊 { this.age = 99; System.out.println("構(gòu)造代碼塊!"); }
3、靜態(tài)代碼塊
使用 static 定義的代碼塊。 一般用于初始化靜態(tài)成員屬性。
class Person { private String name; private int age = 19; public static int count;//0 //靜態(tài)代碼塊 static { count = 99; System.out.println("靜態(tài)代碼塊!"); } }
注意:
1、靜態(tài)代碼塊不管生成多少個(gè)對(duì)象,其只會(huì)執(zhí)行一次,且是最先執(zhí)行的。
2、靜態(tài)代碼塊執(zhí)行完畢后 , 實(shí)例代碼塊(構(gòu)造塊)執(zhí)行,再然后是構(gòu)造函數(shù)執(zhí)行。
匿名對(duì)象
1、匿名只是表示沒有名字的對(duì)象 .
2、沒有引用的對(duì)象稱為匿名對(duì)象 .
3、匿名對(duì)象只能在創(chuàng)建對(duì)象時(shí)使用 .
4、如果一個(gè)對(duì)象只是用一次 , 后面不需要用了 , 可以考慮使用匿名對(duì)象。
來看個(gè)例子:
class Person { private String name; private int age; public Person(String name,int age) { this.age = age; this.name = name; } public void show() { System.out.println("name:"+name+" " + "age:"+age); } } public class Main { public static void main(String[] args) { new Person("caocao",19).show();//通過匿名對(duì)象調(diào)用方法 //Person person=new Person();//非匿名對(duì)象 } }
小結(jié)
以上就是類和對(duì)象的使用,一個(gè)類可以產(chǎn)生無數(shù)的對(duì)象,類就是模板,對(duì)象就是具體的實(shí)例。 類中定義的屬性,大概分為幾類:類屬性,對(duì)象屬性。其中被static所修飾的數(shù)據(jù)屬性稱為類屬性, static修飾的方法稱為類方法,特點(diǎn)是不依賴于對(duì)象,我們只需要通過類名就可以調(diào)用其屬性或者方法。 靜態(tài)代碼塊優(yōu)先實(shí)例代碼塊執(zhí)行,實(shí)例代碼塊優(yōu)先構(gòu)造函數(shù)執(zhí)行。 this關(guān)鍵字代表的是當(dāng)前對(duì)象的引用。并不是當(dāng)前對(duì)象。如果有什么不正確的地方大家盡管說哦!
到此這篇關(guān)于Java全面細(xì)致講解類與對(duì)象的文章就介紹到這了,更多相關(guān)Java類與對(duì)象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot?2.5.5整合輕量級(jí)的分布式日志標(biāo)記追蹤神器TLog的詳細(xì)過程
分布式追蹤系統(tǒng)是一個(gè)最終的解決方案,如果您的公司已經(jīng)上了分布式追蹤系統(tǒng),這篇文章主要介紹了SpringBoot?2.5.5整合輕量級(jí)的分布式日志標(biāo)記追蹤神器TLog,需要的朋友可以參考下2022-10-10spring boot加載第三方j(luò)ar包的配置文件的方法
本篇文章主要介紹了spring boot加載第三方j(luò)ar包的配置文件的方法,詳細(xì)的介紹了spring boot jar包配置文件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10springboot集成ftp實(shí)現(xiàn)文件上傳
這篇文章主要為大家詳細(xì)介紹了springboot集成ftp實(shí)現(xiàn)文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05基于springboot+jwt實(shí)現(xiàn)刷新token過程解析
這篇文章主要介紹了基于springboot+jwt實(shí)現(xiàn)刷新token過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03SpringBoot實(shí)戰(zhàn)記錄之?dāng)?shù)據(jù)訪問
對(duì)于數(shù)據(jù)訪問層,無論是SQL還是NOSQL,Spring Boot默認(rèn)采用整合Spring Data的方式進(jìn)行統(tǒng)一處理,添加大量自動(dòng)配置,屏蔽了很多設(shè)置,下面這篇文章主要介紹了SpringBoot實(shí)戰(zhàn)記錄之?dāng)?shù)據(jù)訪問,需要的朋友可以參考下2022-04-04Java 獲取當(dāng)前設(shè)備的 IP 地址(最新推薦)
Internet 協(xié)議 (IP) 地址可以是連接到 TCP/IP 網(wǎng)絡(luò)的每個(gè)設(shè)備的標(biāo)識(shí)符,該標(biāo)識(shí)符用于識(shí)別和定位中間通信的節(jié)點(diǎn),這篇文章主要介紹了在 Java 中獲取當(dāng)前設(shè)備的 IP 地址,需要的朋友可以參考下2023-06-06SpringCloud Gateway的基本入門和注意點(diǎn)詳解
這篇文章主要介紹了SpringCloud Gateway的基本入門和注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10