路雖遠,行則將至;事雖難,做則必成。
主頁:趨早——Step
專欄:JAVASE
gitte:https://gitee.com/good-thg
引言:
這篇文章我們只介紹前半部分,下一篇文章會介紹剩下的部分。
目錄
- 一、面向對象
- 1、什么是面向對象
- 2、面向對象與面向過程
- 二、類定義和使用
- 1、認識類
- 2、類的定義格式
- 3、定義一個學生類
- 三、類的實例化
- 1、什么是實例化
- 注意事項:
- 2、類和對象的說明
- 四、this引用
- 1、為什么要有this引用
- 2、什么是this引用
- 3、this引用的特性
- (1)this的類型:對應類類型引用,即哪個對象調用就是哪個對象的引用類型;
- (2)this只能在“成員方法”中使用;
- (3)在“成員方法”中,this只能引用當前對象,不能引用其他對象;
- (4)this是“成員方法”第一個隱藏的參數,編譯器會自動傳遞,在成員方法執行時,編譯器會負責將調用成員方法的引用傳遞給該成員方法,this負責來接收。
- 五、對象的構造和初始化
- 1、如何初始化對象
- 2、默認初始化
- 3、就地初始化
- 4、構造方法
- (1)概念
- (2)特性
- <1> 名字必須與類名相同
- <2> 沒有返回值類型,設置為void也不行
- <3> 創建對象時由編譯器自動調用,并且在對象的生命周期內只調用一次
- <4> 構造方法可以重載
- <5> 如果用戶沒有顯示定義,編譯器會生成一份默認的構造方法,生成的默認構造方法一定是無參的。
- <6> 在構造方法中,可以通過this調用其他構造方法來簡化代碼。
- <7> 絕大多數情況下使用public來修飾,特殊場景下會被private修飾。
一、面向對象
1、什么是面向對象
面向對象是一種編程范式,它將程序組織成對象的集合,每個對象都有自己的狀態和行為。在面向對象的編程中,程序通過定義對象的屬性和方法來描述問題的解決方案。對象可以通過與其他對象進行交互來實現特定的功能。面向對象的編程主要包括封裝、繼承和多態三個特性,通過這些特性可以使程序更加模塊化、可維護和可復用。
我們學習的Java是一門純面向對象的語言,在面向對象的世界里,一切皆為對象,面向對象是解決問題的一種思想,主要依靠對象之間的交互完成一件事情。用面向對象的思想來設計程序,更符合人們對事物的認知,對于大型程序的設計、擴展及維護都非常友好。
2、面向對象與面向過程
我們都知道曹操稱象的故事吧!我們分別用面向對象和面向過程來講述一下這個過程:
(1)面向過程:我們要準備一艘可以裝的下大象的船,接著我們將大象趕到船上,然后乘坐另一艘小船,在水位處劃一條線,再把大象從船上趕下來,我們繼續在同一條船上搬石頭,一塊,兩塊…,直到船的水位下降到到我們之前劃的線上,然后我們準備一個稱,將船上的石頭卸下來分批放到稱上,并且記錄每一批石頭的重量,最后將所有數據全部相加,這時候就可以計算出大象的重量了。
(2)面向對象:把大象趕到船上(…),在船上放上石頭(…),在稱上放石頭(…),得到大象重量。
通過這個故事,我們知道了面向過程是把事情分成一步一步的,然后按照步驟一步一步的做出來,而面向對象是給對象相應的方法,最后得出結果。以面向對象的方式來處理,就不用關心過程了,是通過對象之間的交互來完成的。
二、類定義和使用
1、認識類
類是用來對一個實體進行描述的,主要關注該實體具有哪些屬性,哪些功能,描述完成以后計算機就可以識別出結果了。
2、類的定義格式
注意事項:
1、類名采用大駝峰定義;
2、成員前寫法統一為public。
3、定義一個學生類
public class Student {// 成員變量public String name;public int age;// 成員方法public void Exam(){}
}
三、類的實例化
1、什么是實例化
定義了一個類,就相當于在計算機中定義了一種新的類型,與int,double類似,只不過int和double是Java語言自帶的內置類型,而類是用戶自定義了一個新的類型,比如上面定義的Student類。有了這些自定義類型之后,就可以使用這些類來定義實例。
用類類型創建對象的過程,稱為類的實例化,在Java中采用new關鍵字,配合類名來實例化對象。
class Student {public String name;public int age;public void Exam(){System.out.println("考試......");}
}
public class Test {public static void main(String[] args) {// 通過 new 實例化對象Student student = new Student();student.name = "Tom";student.age = 12;}
}
注意事項:
(1)new 關鍵字用于創建一個對象的實例;
(2)使用 . 來訪問對象中的屬性和方法;
(3)同一個類可以創建多個實例。
2、類和對象的說明
(1)類只是一個模型一樣的東西,用來對一個實體進行描述,限定了有哪些成員;
(2)類是一種自定義的類型,可以用來定義變量;
(3)一個類可以實例化出多個對象,實例化出的對象占用實際的物理空間,存儲類成員變量。
四、this引用
1、為什么要有this引用
在這里,我們定義一個Date類來進行演示:
public class Date {public int year;public int month;public int day;// 設置日期public void setDate(int y, int m, int d){year = y;month = m;day = d;}// 打印日期public void printDate(){System.out.println(year + "年" + month + "月" + day + "日");}}
這個時候,我們該如何打印他們呢?看下面代碼:
運行結果如下:
但是,如果我們不想這樣一個一個進行賦值,而是一次性的賦值,該怎么辦呢?
我們在上面的代碼中,已經定義了setDate,所以,我們可以調用setDate來進行賦值。代碼如下:
運行結果如下:
通過以上的兩種方法,就可以進行賦值和打印了,然而,這跟this引用有什么關系呢?我們繼續往下學習。
我們想想,現在我們的setDate是這樣的:
假如說,我們把setDate改成下面這樣:
在這個時候,到底是誰給誰賦值,到底設置的是哪個對象呢?
我們運行代碼試試:
這是什么原因呢?
這是因為局部變量優先,是形參自己改自己賦值了,沒有賦值到成員變量當中。
在這個時候,我們的this就派上用處了,他可以讓他賦值到成員變量當中。我們看下一部分:
2、什么是this引用
我們將this加入到我們的setDate中:
我們將main方法中寫成這樣:
代碼運行結果如下:
這個時候,我們有問題了:成員函數執行的時候,他是怎么知到打印的是哪個對象,設置的是哪個對象?
這就是this的作用,我們認為:
this引用指向當前對象
通俗來講,誰調用setDate,誰就是當前對象。
這時候,我們就可以知道什么是this引用了
this引用指向當前對象,在成員方法中所有成員變量的操作,都是通過該引用去訪問。
3、this引用的特性
(1)this的類型:對應類類型引用,即哪個對象調用就是哪個對象的引用類型;
(2)this只能在“成員方法”中使用;
(3)在“成員方法”中,this只能引用當前對象,不能引用其他對象;
(4)this是“成員方法”第一個隱藏的參數,編譯器會自動傳遞,在成員方法執行時,編譯器會負責將調用成員方法的引用傳遞給該成員方法,this負責來接收。
接下來,我們把完整代碼展示出來:
public class Date {public int year;public int month;public int day;// 設置日期public void setDate(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}// 打印日期public void printDate() {System.out.println(this.year + "年" + this.month + "月" + this.day + "日");}public static void main(String[] args) {Date date = new Date();// 賦值date.setDate(2024, 5, 24);// 打印date.printDate();Date date1 = new Date();date1.setDate(2023, 5, 24);date1.printDate();}}
五、對象的構造和初始化
1、如何初始化對象
我們來看下面這個代碼:
運行結果如下:
這是因為沒有初始化報錯,但是我們來看下面的代碼:
運行一下:
我們發現,每次對象創建好之后,要調用setStudent才能設置具體姓名和年齡,這是很麻煩的,但是我們到底該如何初始化呢?我們繼續學習:
2、默認初始化
我們同樣來看下面的代碼:
在這個代碼中,我們初始化了嗎?沒有,但是他會報錯嗎?我們看運行結果:
沒有,這是為什么呢?
哇,好多為什么,那就讓我們繼續回答這一個一個的問題吧!
在這里,就是因為發生了默認初始化,所以才不會報錯。我們看到的只是程序層面簡單的一條語句,但是,在JVM層面就需要做好多事情,下面簡單介紹:
(1)檢測對象對應的類是否加載了,如果沒有加載則加載;
(2)為對象分配內存空間;
(3)處理并發問題;
(4)初始化所分配的空間
就是對象空間被申請好之后,對象中包含的成員已經設置好了初始值,比如:
在這里,我們暫時知道這是默認初始化就好,至于為什么,我們可以后期學習。
3、就地初始化
就地初始化就是在聲明成員變量時,就直接給出了初始值。
我們看代碼:
這樣運行會是什么結果呢?我們運行試試:
這就是我們的就地初始化,需要注意的是:代碼編譯完成后,編譯器會將所有給初始化的這些語句添加到各個構造函數中。
4、構造方法
在我們學習了以上兩種初始化方法,我們再來學習另一種初始化方法,叫做構造方法。
(1)概念
構造方法(也稱構造器)是一個特殊的成員方法,這個方法沒有返回值,名字必須與類名相同,在創建對象時,由編譯器自動調用,并且在整個對象的聲明周期內只調用一次。
現在問題來了,我們該怎么調用該構造方法呢?我們看下面的代碼并且運行:
運行結果如下:
這是什么原因呢?我們將main方法改成如下這樣:
運行結果如下:
我們再來調用帶兩個參數的構造方法:
將main方法寫為這樣:
運行結果如下:
所以我們認為:當構造方法調用完成之后,對象實際上才產生了。
其實我們還需要知道,當沒有提供任何構造方法的時候,編譯器會默認提供一個不帶參數的構造方法,但是當我們有構造方法提供的時候,編譯器就不會提供了。
(2)特性
<1> 名字必須與類名相同
<2> 沒有返回值類型,設置為void也不行
<3> 創建對象時由編譯器自動調用,并且在對象的生命周期內只調用一次
<4> 構造方法可以重載
<5> 如果用戶沒有顯示定義,編譯器會生成一份默認的構造方法,生成的默認構造方法一定是無參的。
<6> 在構造方法中,可以通過this調用其他構造方法來簡化代碼。
運行結構如下:
我們還要注意一點,this不能形成環。看下面代碼:
<7> 絕大多數情況下使用public來修飾,特殊場景下會被private修飾。
好的,JAVASE第一部分到此就結束了,讓我們期待下一篇吧!