java中類和對(duì)象的詳細(xì)介紹
面向過程和面向?qū)ο?/h3>
- C語(yǔ)言是面向過程的,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題。
- JAVA是基于面向?qū)ο蟮模P(guān)注的是對(duì)象,將一件事情拆分成不同的對(duì)象,靠對(duì)象之間的交互完成。
- 面向過程注重的是過程,在整個(gè)過程中所涉及的行為,就是功能。
- 面向?qū)ο笞⒅氐氖菍?duì)象,也就是參與過程所涉及到的主體。是通過邏輯將一個(gè)個(gè)功能實(shí)現(xiàn)連接起來
【面向?qū)ο蟾拍睢?/p>
- 面向?qū)ο笫撬伎紗栴}的一種思考方式,是一種思想。比如:概念與實(shí)例。理論與實(shí)踐。名和實(shí)等等。
- 類就是一類對(duì)象的統(tǒng)稱。對(duì)象就是這一類具體化的一個(gè)實(shí)例
- 面向?qū)ο蟮暮锰帲簩?fù)雜的事情變簡(jiǎn)單了,只要面對(duì)一個(gè)對(duì)象就行。
【面向?qū)ο笤O(shè)計(jì)】
面向?qū)ο笤O(shè)計(jì)把握一個(gè)重要的經(jīng)驗(yàn):誰(shuí)擁有數(shù)據(jù),誰(shuí)對(duì)外提供操作這些數(shù)據(jù)(私有)的方法?。ū粍?dòng)的一方是數(shù)據(jù)的擁有者,主動(dòng)的一方是執(zhí)行者)
開發(fā)時(shí):找對(duì)象,建對(duì)象,用對(duì)象,并維護(hù)對(duì)象之間的關(guān)系。
總結(jié):面向?qū)ο缶褪怯么a(類)來描述客觀世界的事物的一種方式. 一個(gè)類主要包含一個(gè)事物的屬性和行為
類和類的實(shí)例化
類就是一類對(duì)象的統(tǒng)稱。對(duì)象就是這一類具體化的一個(gè)實(shí)例
一個(gè)類可以實(shí)例化無數(shù)個(gè)對(duì)象
下面我們通過一個(gè)例子了解類和類的實(shí)例化
class Person { public int age;//成員屬性 實(shí)例變量 字段 屬性 public String name; public static String sex; //靜態(tài)成員變量 方法區(qū) public void eat() {//成員方法 System.out.println("吃飯!"); } public void sleep() { System.out.println("睡覺!"); } public static void func(){ System.out.println("靜態(tài)成員方法"); } } public class Main{ public static void main(String[] args) { Person person = new Person();//通過new實(shí)例化對(duì)象 person.eat();//成員方法調(diào)用需要通過對(duì)象的引用調(diào)用 person.sleep(); //產(chǎn)生對(duì)象 實(shí)例化對(duì)象 Person person2 = new Person(); Person person3 = new Person(); //靜態(tài)成員變量和方法的調(diào)用 System.out.println(Person.sex); Person.func(); } }
成員變量:
定義在類的內(nèi)部,方法的外部
通過對(duì)象的引用來訪問
如果沒有初始化,那么它的值就是一個(gè)默認(rèn)默認(rèn)值(默認(rèn)零值)
- 如果是引用類型,那么值就是null(包括數(shù)組,String字符串等)
- 如果是簡(jiǎn)單類型,那么值就是其這種類型所對(duì)應(yīng)的默認(rèn)值
byte | short | int | long | float | double | char | boolean |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0L | 0.0f | 0.0 | '\u0000'十六進(jìn)制(也可以當(dāng)作0) | false |
行為/方法:
【eat() sleep()】為實(shí)例成員方法
func()為靜態(tài)成員方法
對(duì)于靜態(tài)的成員變量和成員方法該該怎么訪問呢
這里可以看到,對(duì)于靜態(tài)的,不需要實(shí)例化對(duì)象?。?!
直接調(diào)用
類名.靜態(tài)成員變量/靜態(tài)成員方法
總結(jié)static:
- 對(duì)于靜態(tài)的成員屬性或者靜態(tài)的成員方法,是不依賴于對(duì)象的。
- 靜態(tài)的成員變量 ,只有一份,存儲(chǔ)在方法區(qū)中。
- 靜態(tài)的方法內(nèi)部是不可以訪問非靜態(tài)的數(shù)據(jù)的。
實(shí)例化類的存儲(chǔ)結(jié)構(gòu)
初始化成員變量的方式
1、就地初始化(在類內(nèi)進(jìn)攻初始化)
2、默認(rèn)初始化
3、類外初始化(用的比較多)
public class Main{ public static void main(String[] args) { Person person1 = new Person(); person1.name = "星星"; person1.age = 20; Person person2 = new Person(); person2.name = "狒狒"; person2.age = 40; } }
封裝
在我們寫代碼的時(shí)候經(jīng)常會(huì)涉及兩種角色: 類的實(shí)現(xiàn)者和類的調(diào)用者. 封裝的本質(zhì)就是讓類的調(diào)用者不必太多的了解類的實(shí)現(xiàn)者是如何實(shí)現(xiàn)類的,只要知道如何使用類就行了.
這樣就降低了類使用者的學(xué)習(xí)和使用成本, 從而降低了復(fù)雜程度
private/ public 這兩個(gè)關(guān)鍵字表示 “訪問權(quán)限控制” .
- 被 public 修飾的成員變量或者成員方法, 可以直接被類的調(diào)用者使用.
- 被 private 修飾的成員變量或者成員方法,不能被類的調(diào)用者使用
舉個(gè)例子
class Person { private String name = "張三"; private int age = 18; public void show() { System.out.println("我叫" + name + ", 今年" + age + "歲"); } } class Test { public static void main(String[] args) { Person person = new Person(); person.show(); } }
- 此時(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這樣的字段)
getter和setter方法
getter:得到屬性值的方法
setter:修改屬性值的方法
我們用這兩者方法將類的屬性封裝起來,從而來達(dá)到訪問屬性的目的
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); } } class Main { public static void main(String[] args) { Person person = new Person(); person.setName("caocao"); String name = person.getName(); System.out.println(name); person.show(); } }
this關(guān)鍵字
我們?cè)趧偛诺拇a可以看到setter方法
private String name; public void setName(String name){ //name = name;//不能這樣寫 this.name = name;//this引用,表示調(diào)用該方法的對(duì)象 }
this表示當(dāng)前對(duì)象引用, 可以借助 this 來訪問對(duì)象的字段和方法
三個(gè)用法:
- this.屬性; //訪問當(dāng)前對(duì)象的屬性
- this.方法;//調(diào)用當(dāng)前對(duì)象的方法
- this(); //調(diào)用當(dāng)前對(duì)象的構(gòu)造方法 (ps:必須放在第一行,且只能存在一個(gè)構(gòu)造方法內(nèi)部)
構(gòu)造方法
構(gòu)造方法是一種特殊方法, 使用關(guān)鍵字new實(shí)例化新對(duì)象時(shí)會(huì)被自動(dòng)調(diào)用, 用于完成初始化操作
實(shí)例化一個(gè)對(duì)象/創(chuàng)建一個(gè)對(duì)象分幾步?
Student stu = new Student() ;//實(shí)例化一個(gè)對(duì)象
兩步
- 為對(duì)象分配內(nèi)存
- 調(diào)用合適的構(gòu)造方法,說明構(gòu)造方法不止一個(gè),可能更多
語(yǔ)法規(guī)則
- 方法名稱必須與類名稱相同
- 構(gòu)造方法沒有返回值類型聲明
- 每一個(gè)類中一定至少存在一個(gè)構(gòu)造方法(沒有明確定義,則系統(tǒng)自動(dòng)生成一個(gè)無參構(gòu)造)
class Person { private String name;//實(shí)例成員變量 private int age; private String sex; //默認(rèn)構(gòu)造函數(shù) 構(gòu)造對(duì)象 public Person() { this.name = "caocao"; this.age = 10; this.sex = "男"; } //帶有3個(gè)參數(shù)的構(gòu)造函數(shù) 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 p1 = new Person();//調(diào)用不帶參數(shù)的構(gòu)造函數(shù) 如果程序沒有提供會(huì)調(diào)用不帶參數(shù)的構(gòu)造函數(shù) p1.show(); Person p2 = new Person("zhangfei",80,"男");//調(diào)用帶有3個(gè)參數(shù)的構(gòu)造函數(shù) p2.show(); } }
toString方法
Person person = new Person("caocao",19); System.out.println(person);
如果打印引用,他會(huì)默認(rèn)調(diào)用toString方法,執(zhí)行這樣一個(gè)結(jié)果:
我們可以重寫toString方法,來打印自己想要的結(jié)果
例如:
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); } //重寫Object的toString方法 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class Main { public static void main(String[] args) { Person person = new Person("caocao",19); person.show(); System.out.println(person); } }
這樣打印引用的化,就會(huì)按照想要的內(nèi)容進(jìn)行輸出。
匿名對(duì)象
匿名只是表示沒有名字的對(duì)象.
- 沒有引用的對(duì)象稱為匿名對(duì)象.
- 匿名對(duì)象只能在創(chuàng)建對(duì)象時(shí)使用.
- 如果一個(gè)對(duì)象只是用一次, 后面不需要用了, 可以考慮使用匿名對(duì)象
new Person("caocao",19).show();//通過匿名對(duì)象調(diào)用方法
特點(diǎn):不依賴于對(duì)象,我們只需要通過類名就可以調(diào)用其屬性或者方法
代碼塊
- 本地代碼塊
- 靜態(tài)代碼塊
- 實(shí)例代碼塊/構(gòu)造代碼塊
- 同步代碼塊(多線程)
本地代碼塊: 在方法中的代碼塊
public class Main{ public static void main(String[] args) { { //直接使用{}定義,普通方法塊 int x = 10 ; System.out.println("x1 = " +x); } int x = 100 ; System.out.println("x2 = " +x); } }
靜態(tài)代碼塊: 一般用于初始化靜態(tài)成員屬性
//靜態(tài)代碼塊 static { count = 10;//只能訪問靜態(tài)數(shù)據(jù)成員 System.out.println("I am static init()!"); }
實(shí)例代碼塊: 定義在類中的代碼塊,構(gòu)造代碼塊一般用于初始化實(shí)例成員變量
//實(shí)例代碼塊 { this.name = "bit"; this.age = 12; this.sex = "man"; System.out.println("I am instance init()!"); }
執(zhí)行順序
靜態(tài)代碼塊實(shí)例代碼塊構(gòu)造方法
總結(jié)
到此這篇關(guān)于java中類和對(duì)象的文章就介紹到這了,更多相關(guān)java類和對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式
這篇文章主要介紹了SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02VSCode+Gradle搭建Java開發(fā)環(huán)境實(shí)現(xiàn)
這篇文章主要介紹了VSCode+Gradle搭建Java開發(fā)環(huán)境實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07啟用springboot security后登錄web頁(yè)面需要用戶名和密碼的解決方法
這篇文章主要介紹了啟用springboot security后登錄web頁(yè)面需要用戶名和密碼的解決方法,也就是使用默認(rèn)用戶和密碼登錄的操作方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02解決Spring Batch框架job任務(wù)只跑一次的問題
這篇文章主要介紹了解決Spring Batch框架job任務(wù)只跑一次的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09springboot配置文件中使用${}注入值的兩種方式小結(jié)
這篇文章主要介紹了springboot配置文件中使用${}注入值的兩種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java 中String StringBuilder 與 StringBuffer詳解及用法實(shí)例
這篇文章主要介紹了Java 中String StringBuilder 與 StringBuffer詳解及用法實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02