個人主頁(找往期文章包括但不限于本期文章中不懂的知識點):我要學(xué)編程(?_?)-CSDN博客
目錄
面向?qū)ο蟮某醪秸J(rèn)知
面向?qū)ο笈c面向過程的區(qū)別
類的定義和使用?
類的定義格式
類的實例化
this引用
什么是this引用?
this引用的特性
對象的構(gòu)造及初始化
如何初始化對象(的成員變量)
構(gòu)造方法?
本期我們就來學(xué)習(xí)面向?qū)ο蟆?/p>
面向?qū)ο蟮某醪秸J(rèn)知
Java是一門純面向?qū)ο蟮恼Z言(Object Oriented Program,簡稱OOP),在面向?qū)ο蟮氖澜缋?,一切皆為對象。面向?qū)ο笫墙鉀Q問題的一種思想,主要依靠對象之間的交互完成一件事情。用面向?qū)ο蟮乃枷雭砩婕俺绦?,更符合人們對事物的認(rèn)知,對于大型程序的設(shè)計、擴(kuò)展以及維護(hù)都非常友好。
面向?qū)ο笈c面向過程的區(qū)別
面向過程:注重的是過程;面向?qū)ο螅鹤⒅氐氖菍ο蟆?/p>
例如:我們要吃飯了。首先,得找一個飯館子,再點菜,最后再吃飯。
如果是面向過程的話,就需要關(guān)注這些過程:找飯館子的過程,點菜,吃飯。
如果是面向?qū)ο蟮脑挘托枰P(guān)注這些對象:我們自己,飯館子,菜。不需要關(guān)注過程了。
從這里就可以簡單看出對象比過程要簡單。
注意:面向過程和面相對象并不是一門語言,而是解決問題的方法,沒有那個好壞之分,都有其專門的應(yīng)用場景。
類的定義和使用?
類是用來描述對象的。
例如:一個學(xué)生就是一個對象(Java中一切皆對象),我們現(xiàn)在如果想要來描述這個學(xué)生的話,就得用類來描述。
類的定義格式
//class為定義類的關(guān)鍵字,ClassName為類的名字,{}中為類的主體。
//類中包含的內(nèi)容稱為類的成員。屬性主要是用來描述類的,稱之為類的成員屬性或者類成員變量。
//方法主要說明類具有哪些功能,稱為類的成員方法。
// 創(chuàng)建類
class ClassName{
field; // 字段(屬性) 或者 成員變量 :定義再類當(dāng)中,方法外部的變量
method; // 行為 或者 成員方法
}
?成員變量分為兩種:一種是普通成員變量,一種是靜態(tài)成員變量。
普通成員變量:public?int age;? ? ? 靜態(tài)成員變量:public static int age;??
成員方法也分為兩種:一種是普通成員方法,一種是靜態(tài)成員方法。
普通成員方法:public void func()? ? ?靜態(tài)成員方法:public static void func()
我們現(xiàn)在就來描述一個學(xué)生對象。
class Student {
public String name;//名字
public int age;//年齡
public void func(){
System.out.println("姓名:"+name+" 年齡:"+age);
}
}
注意事項:類名注意采用大駝峰。定義成員前寫法統(tǒng)一為public,后面會詳細(xì)解釋。此處寫的方法不帶 static 關(guān)鍵字,后面會詳細(xì)解釋。
練習(xí):定義一個類:狗
class Dog{
public String name;//名字
public int age;//年齡
public void func(){
System.out.println(name+" :汪汪汪~~~");
}
}
注意事項: 1. 一般一個文件當(dāng)中只定義一個類(推薦),雖然可以定義多個類,但是只能有一個類被public 修飾。?2. main方法所在的類一般(不是絕對(如下圖1所示))要使用public修飾。(注意:Eclipse默認(rèn)會在public修飾的類中找main方法) 3. public修飾的類必須要和文件名相同 4. 不要輕易去修改public修飾的類的名稱,如果要修改,通過開發(fā)工具修改(如下圖2所示)。?5. 每一個類都會生成一個對應(yīng)的字節(jié)碼文件(如下圖3)。
?圖1:
圖2:
?當(dāng)只有一個類時,就可以修改成功。
當(dāng)有多個類時,就會修改失敗。
修改同上步驟,但修改的結(jié)果不同。
圖3:
在……out /?production?……目錄下。?
下面是怎么查看的視頻
JavaSE篇(類和對象(上))怎么查看字節(jié)碼文件-CSDN直播
類的實例化
我們在定義了一個類的同時就相當(dāng)于創(chuàng)建了一種新的類型。和int,char一樣,只不過int,char這些是Java的內(nèi)置類型,而類是用戶自定義的類型。既然創(chuàng)建了類型,我們就肯定會用這個類型來定義變量。舉個簡單的例子:我們拿到int類型,就可以使用int類型來創(chuàng)建一個變量 int a = 0;? 同樣這個類也是可以這樣的,我們把用類定義一個變量的過程稱為類的實例化(我們更喜歡說是用類創(chuàng)建對象的過程)。
public class Test {
public static void main(String[] args) {
//java中使用new關(guān)鍵字,來配合類名實例化對象
Student student = new Student();//通過new來實例化對象
//通過 . 來訪問類的屬性和方法(功能)
student.name = "張三";
student.age = 18;
student.func();
}
}
//創(chuàng)建一個類
class Student{
//屬性
String name;
int age;
//功能(方法)
public void func(){
System.out.println("姓名:"+name+" 年齡:"+age);
}
}
注意:一個類可以實例化多個對象。
可能會有小伙伴發(fā)現(xiàn):類有點像我們C語言學(xué)過的結(jié)構(gòu)體。沒錯這個類和結(jié)構(gòu)體是非常類似的。
this引用
public class Test{
public static void main(String[] args) {
//實例化三個對象
Date date1 = new Date();
Date date2 = new Date();
Date date3 = new Date();
//設(shè)置時間
date1.SetDate(2024,3,25);
date2.SetDate(2024,3,26);
date3.SetDate(2024,3,27);
//打印結(jié)果,看看是否設(shè)置成功
date1.PrintDate();
date2.PrintDate();
date3.PrintDate();
}
}
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);
}
}
上面是最終的打印結(jié)果,由此可知我們設(shè)置的時間是對的。
但是又有一些新的問題:
1. 如果我們在設(shè)置時間的方法的參數(shù)也是year month day ,那就會發(fā)生一些錯誤(打印的結(jié)果是全部是0,如下圖所示)?
這是什么原因造成的呢?其實我們在C語言階段已經(jīng)學(xué)習(xí)過了(當(dāng)全局變量與局部變量的變量名一樣時,全局變量會被屏蔽,遵循局部變量優(yōu)先原則)?,同樣Java中也是如此,這里的year,month,day都是局部變量,那么也就是局部變量給局部變量賦值,因此得不到我們想要的結(jié)果(為什么是0呢?后面會有解釋)。
2. PrintDate方法怎么知道自己要打印誰的值呢?其實這個是比較好解釋的,因為前面有?對象. 來說明是在哪個對象下調(diào)用這個方法。
上述的所有問題都可以用 this 來解決。我們首先來說第二點,其實上面那個解釋是沒問題的,但如果我們用更底層的知識來解釋的話,就是用this引用來解釋。
什么是this引用?
this引用指向當(dāng)前對象(成員方法運(yùn)行時調(diào)用該成員方法的對象),在成員方法中所有成員變量的操作,都是通過該引用去訪問。
那上面的代碼我們就可以改成下面:
public class Test{
public static void main(String[] args) {
//實例化三個對象
Date date1 = new Date();
Date date2 = new Date();
Date date3 = new Date();
//設(shè)置時間
date1.SetDate(2024,3,25);
date2.SetDate(2024,3,26);
date3.SetDate(2024,3,27);
//打印結(jié)果,看看是否設(shè)置成功
date1.PrintDate();
date2.PrintDate();
date3.PrintDate();
}
}
class Date{
//屬性
public int year;
public int month;
public int day;
//方法
public void SetDate(int year, int month, int day){
//這個也就聲明了是當(dāng)前對象
this.year = year;
this.month = month;
this.day = day;
}
public void PrintDate(){
//即使能夠識別,我們也要加上this
System.out.println(this.year+"/"+this.month+"/"+this.day);
}
}
注意:this引用指向的是調(diào)用成員方法的對象?。
this引用的特性
1. this的類型:對應(yīng)類的類型引用,即哪個對象調(diào)用就是哪個對象的引用類型(誰調(diào)用this所在的方法,this就指向誰)。
2. this只能在"成員方法"中使用。
3. 在"成員方法"中,this只能引用當(dāng)前對象,不能再引用其他對象。
4. this是“成員方法”第一個隱藏的參數(shù),編譯器會自動傳遞,在成員方法執(zhí)行時,編譯器會負(fù)責(zé)將調(diào)用成員方法的對象的引用傳遞給該成員方法,this負(fù)責(zé)來接收。
因此我們以后調(diào)用成員方法或者成員變量時,都應(yīng)該加上this。
對象的構(gòu)造及初始化
如何初始化對象(的成員變量)
通過前面知識點的學(xué)習(xí),我們知道,在Java方法內(nèi)部定義一個局部變量時,必須要初始化,否則會編譯失敗,但是我們用類創(chuàng)建的對象不初始化竟然不會報錯(如下圖:)。
這就是默認(rèn)初始化。?
Date d = new Date(2021,6,9);
在程序?qū)用嬷皇呛唵蔚囊粭l語句,在JVM層面需要做好多事情,下面簡單介紹下:
1. 檢測對象對應(yīng)的類是否加載了,如果沒有加載則加載。
2. 為對象分配內(nèi)存空間。
3. 處理并發(fā)安全問題 比如:多個線程同時申請對象,JVM要保證給對象分配的空間不沖突。
4. 初始化所分配的空間 即:對象空間被申請好之后,對象中包含的成員已經(jīng)設(shè)置好了初始值。根據(jù)不同的類型會默認(rèn)初始化不同的值(如下表)。
數(shù)據(jù)類型 | 默認(rèn)值 |
byte | 0 |
char | '\u0000' |
short | 0 |
int | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
reference | null |
如果我們想重新初始化時,初始化的方式就是 . 成員變量 ,再賦值就可以了。還有一種初始化就是在創(chuàng)建成員變量時,就直接給予初始值,這種初始化叫就地初始化。下面就是就地初始化:
構(gòu)造方法?
構(gòu)造方法(也稱為構(gòu)造器)是一個特殊的成員方法,名字必須與類名相同,沒有返回值類型,即使是void也不行。在創(chuàng)建對象時,由編譯器自動調(diào)用,并且在整個對象的生命周期內(nèi)只調(diào)用一次。同樣構(gòu)造方法也可以對我們創(chuàng)建的對象進(jìn)行初始化。那怎么調(diào)用這個方法呢?(如下圖所示:)
由此可見:當(dāng)我們實例化一個對象的時候,就自動地調(diào)用了這個構(gòu)造方法。?那又有一個新的問題來了:當(dāng)我們沒有寫構(gòu)造方法的時候,但是我們依舊實例化了一個對象啊,那也會調(diào)用構(gòu)造方法嗎?沒錯,當(dāng)我們沒有提供任何構(gòu)造方法時,編譯器會自動給我們提供一個不帶參數(shù)的構(gòu)造方法;一旦我們自己寫了構(gòu)造方法之后,編譯器就不再提供了。
注意:1. 構(gòu)造方法是可以被重載的。
2. 只有當(dāng)調(diào)用完構(gòu)造方法之后,對象才算被被創(chuàng)建成功了。?
3.在構(gòu)造方法中可以通過this()來調(diào)用其它構(gòu)造方法。
這個this()來調(diào)用其它構(gòu)造方法的時候,有一些限制條件:(1)this()這條語句必須是在調(diào)用這條語句的構(gòu)造方法的有效代碼的第一行。
(2) 不能形成循環(huán)。
4. 絕大多數(shù)情況下使用public來修飾,特殊場景下會被private修飾(后面會學(xué)習(xí)到)?
使用IDEA快速生成構(gòu)造方法的步驟:
?下面是詳細(xì)視頻:
https://live.csdn.net/v/374793?spm=1001.2014.3001.5501文章來源:http://www.zghlxwxcb.cn/news/detail-844434.html
好啦!本期JavaSE類和對象(上)的學(xué)習(xí)就到此結(jié)束啦!我們下一期再一起學(xué)習(xí)吧!文章來源地址http://www.zghlxwxcb.cn/news/detail-844434.html
到了這里,關(guān)于初始Java篇(JavaSE基礎(chǔ)語法)(5)(類和對象(上))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!