day06_类与对象
面向對象_day01
學習目標:
1. 面向過程與面向對象編程思想 2. 類的定義與對象的創建 3. 匿名對象 4. 類的成員詳細講解視頻教程:https://www.bilibili.com/video/BV1RF411N7LU?spm_id_from=333.999.0.0
一、面向過程與面向對象
面向過程與面向對象是兩種編程思想;什么是編程思想呢?編程思想就是編程的思維方式;面向過程的編程思維方式與面向對象的思維方式是截然不同的。
面向過程,強調的是功能行為,以函數為最小單位,考慮怎么做。面向對象,將功能封裝進對象,強調具備了功能的對象,以類/對象為最小單位,考慮誰來做。
例如:解決吃飯問題,面向過程與面向對象實現思路如下:
-
面向過程:考慮買什么菜,做什么飯,怎么做,做多少,然后吃飯,洗碗;重心在于如何完成這件事。
-
面向對象:考慮誰會做飯,找到這個人;去飯店吃飯;重心在于調用誰完成這件事。
例如:解決洗衣服問題,面向過程與面向對象實現思路如下:
-
面向過程:考慮用什么洗,涼水洗還是熱水洗,洗完是甩干,還是晾曬;重心在于如何完成這件事。
-
面向對象:考慮誰會洗衣服,找到這個人完成這件事;去干洗店洗衣服;重心在于調用誰完成這件事。
例如:解決出行問題,面向過程與面向對象實現思路如下:
-
面向過程:考慮是開車還是步行還是騎行,考慮最佳路線,是否堵車;重心在于如何完成這件事。
-
面向對象:告訴助理,我要去哪里,我要幾點去,幾點到,剩下的交給助理去做;重心在于調用誰完成這件事。
二、類與對象
上面講了,面向對象,將功能封裝進對象,強調具備了功能的對象,以類/對象為最小單位,考慮誰來做。
那么什么是類?什么是對象呢?
2.1 類與對象的關系
類是指一類事物的抽取,一類事物的概括。比如:人是一類事物。動物是一類事物。寵物狗是一類事物。對象:具體的實例。比如小紅是對象。北京動物園的那只老虎。樓上的那條京巴。 類與對象的關系:類是一類事物的總結概括,對象是該類中具體實例,個體。
類(Class)和對象(Object)是面向對象的核心概念。
-
類是對一類事物的描述,是抽象的、概念上的定義
-
對象是實際存在的該類事物的每個個體,因而也稱為實例(instance)。
可以理解為: 類 類 = 抽象概念的人;象 對象 = 實實在在的某個人、悟空、八戒、沙僧
面向對象程序設計的重點是 類的設計
2.2 類的設計與對象的創建
類的設計, 其實就是類的成員的設計
2.2.1 類的成員
類是指一類事物的抽取,我們拿人這個類舉例,我們可以抽取出人的體重 身高,性別等屬性,還可以抽取出學習、吃飯、睡覺等行為。所以抽取類中的成員可以抽取出類的屬性和行為。
定義類的格式如下
Java中用類class來描述事物也是如此。常見的類的成員有
- 屬 性:對應類中的成員變量
- 行 為:對應類中的成員方法
定義類的具體語法:
其中:屬性又叫成員變量,也叫字段,定義的方式和定義變量的方式一樣,只是位置不同。
定義方法的語法:
其中 :
- 修飾符:public, 缺省,private, protected等等
- 返回值類型:
- 沒有返回值:void
- 有返回值,聲明出返回值的類型。與方法體中“ “return ” 返回值” 搭配使用。返回值類型可以是基本類型和引用類型。
- 方法名 :屬于標識符,命名時遵循標識符命名規則和規范,“ 見名知意”
- 形參列表:可以包含零個,一個或多個 參數。多個參數時,中間用“, ”隔開
- 返回值:方法在執行完畢后返還給調用它的程序的數據
示例1:定義一個Person類,該類的字段有:name、sex、height、weight;行為有:study、eat、sleep方法。
參考答案:
/*** 定義一個Person類,該類的字段有:name、sex、height、weight;行為有:study、eat、sleep方法。*/ public class Person {//定義成員變量/字段/屬性//姓名String name;//性別 0 代表男,1代表女int sex;//身高int height;//體重int weight;//定義方法//定義學習方法void study(){System.out.println("胖叔講Java,一路相伴");}// 定義吃飯方法void eat(){System.out.println("吃的是北京烤鴨");}// 定義睡覺方法void sleep(){System.out.println("早睡早起身體好");} }2.2.2 對象的創建與使用
對象是類的具體實現實例;所以使用類必須根據類創建對象,然后調用對象的屬性和方法。
創建對象的語法:
調用屬性和方法的語法:
示例1:根據上邊定義的Person類創建對象,調用屬性和方法
/*** 定義一個Person類,該類的字段有:name、sex、height、weight;行為有:study、eat、sleep方法。*/ public class Person {//定義成員變量/字段/屬性//姓名String name;//性別 0 代表男,1代表女int sex;//身高int height;//體重int weight;//定義方法//定義學習方法void study(){System.out.println("胖叔講Java,一路相伴");}// 定義吃飯方法void eat(){System.out.println("吃的是北京烤鴨");}// 定義睡覺方法void sleep(){System.out.println("早睡早起身體好");}/*程序入口*/public static void main(String[] args) {//定義person對象Person person = new Person();//給屬性賦值(調用屬性)person.name="胖叔講java";person.sex=0;person.height=168;person.weight=185;//查看屬性(調用屬性)System.out.println(person.name);System.out.println(person.sex);System.out.println(person.height);System.out.println(person.weight);//調用方法person.study();person.eat();person.sleep();} }問題分析?上面的學習方法存在問題,到底收獲了哪些知識,沒有返回結果;吃飯方法也存在問題,不可能天天吃烤鴨,方法體代碼寫死了,代碼不靈活;接下來我們優化代碼
參考答案:
/*** 定義一個Person類,該類的字段有:name、sex、height、weight;行為有:study、eat、sleep方法。*/ public class Person {//定義成員變量/字段/屬性//姓名String name;//性別 0 代表男,1代表女int sex;//身高int height;//體重int weight;//定義方法//定義學習方法String study(){System.out.println("胖叔講Java,一路相伴");return "類與對象";}// 定義吃飯方法void eat(String food){System.out.println("吃的是:"+food);}// 定義睡覺方法void sleep(){System.out.println("早睡早起身體好");}/*程序入口*/public static void main(String[] args) {//定義person對象Person person = new Person();person.eat("雞蛋西紅柿");person.eat("肉夾饃");String result = person.study();System.out.println(result);} }2.3 對象的生命周期
在學習完類的設計與對象的創建語法之后,接下來我們講解對象在jvm中運行的生命周期;首先我們完成一個示例,讓后根據示例講解jvm內存運行過程。
示例1:定義User類,類中有屬性:id、name、age、phone;方法有showMessage展示用戶信息
參考代碼:
/**定義User類,類中有屬性:id、name、age、phone;方法有showMessage展示用戶信息*/ public class User {// 用戶唯一標識int id;// 姓名String name;// 年齡int age;// 手機號String phone;//展示用戶信息void showMessage(){System.out.println("id:"+id+",name:"+name+",age:"+age+",phone:"+phone);}/*程序入口*/public static void main(String[] args) {//創建對象User user = new User();//賦值user.id = 1;user.name = "小紅";user.age = 18;user.phone = "138389438";//查看信息user.showMessage();//創建對象2User user2 = new User();//賦值user2.id = 2;user2.name = "小明";user2.age = 19;user2.phone = "138389538";//查看信息user2.showMessage();} }在講解user對象jvm運行過程之前,我們先復習以下jvm的內存結構
每塊內存負責的職責如下:
Java虛擬機棧(Java Virtual Machine Stacks):描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀(Stack Frame),棧幀中存儲著局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行完成的過程,會對應一個棧幀在虛擬機棧中入棧到出棧的過程。與程序計數器一樣,Java虛擬機棧也是線程私有的。
局部變量和引用地址都是在棧內存中。
堆:此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。這一點在Java虛擬機規范中的描述是:所有的對象實例以及數組都要在堆上分配。
方法區:用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。方法區存放的數據只有一份。
本地方法棧(Native Method Stack):與Java虛擬機棧作用很相似,它們的區別在于虛擬機棧為虛擬機執行Java方法(即字節碼)服務,而本地方法棧則為虛擬機使用到的Native方法服務。例如調用本地c/c++的方法。
程序計數器:程序計數器是記錄當前線程所執行指令的行數。
user對象的生命周期如下
2.4 練習
練習1:定義一個鐘表類,屬性有秒針,分鐘針,時針。方法有runSecond(),runMinute(),runHour()來描述指針的運行,要求最后完成鐘表正常運行。
參考答案:
public class Clock {//1.定義秒針int second;//2.定義分鐘針int minute;//4.定義小時針int hour;//5.定義運行秒針方法void runSecond(){second++;if(second==60) {second = 0;//minute++;runMinute();}}//6.定義分鐘針運行void runMinute() {minute++;if(minute==60) {minute=0;//hour++;runHour();}}//7.定義小時void runHour() {hour++;if(hour==24) {hour = 0;}}public static void main(String[] args) {//1.創建鐘表對象Clock clock = new Clock();//2.初始化值clock.second = 10;clock.minute = 51;clock.hour = 15;//3.打印時鐘while(true) {//4.后面詳細講這個代碼,這里只是測試,讓程序聽1000毫秒在執行try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("時鐘:"+clock.hour+":"+clock.minute+":"+clock.second);clock.runSecond();}} }類的訪問機制:
- 在一個類中的訪問機制:類中的方法可以直接訪問類中的成員變量和成員方法。
- 在不同類中的訪問機制:先創建要訪問類的對象,再用對象訪問類中定義的成員
2.5 小節
三、匿名對象
3.1 什么是匿名對象
像這種new Person()不保存對象內存地址的對象叫匿名對象
示例:
/*** 匿名對象*/ public class AnonymousObject {void study(){System.out.println("胖叔講java");}/*程序入口*/public static void main(String[] args) {//匿名對象調用方法new AnonymousObject().study();// == 比較基本類型比較的是內容是否相等,比較引用類型比較的是地址是否相等// 匿名對象是兩個對象,所以地址不相等System.out.println(new AnonymousObject()==new AnonymousObject());} }jvm運行過程
3.2 應用場景
匿名對象的應用場景
- 如果對一個對象只需要進行一次方法調用,那么就可以使用匿名對象。
- 我們經常將匿名對象作為實參傳遞給一個方法調用
示例:
public class AnonymousObject2 {int id = 1;String name = "張三";int age = 18; } public class AnonymousObject2Use {public void useAnonymousObject2(AnonymousObject2 anonymousObject2){System.out.println("id:"+anonymousObject2.id+",name:"+anonymousObject2.name+",age:"+anonymousObject2.age);}public static void main(String[] args) {//匿名對象當作參數使用AnonymousObject2Use anonymousObject2Use = new AnonymousObject2Use();anonymousObject2Use.useAnonymousObject2(new AnonymousObject2());} }四、類的成員詳解
上邊講了類與對象的基本使用,我們在類中定義類屬性和方法;其實類的成員包含很多內容,如下所示:
本章節詳細講解成員變量、方法、構造方法、其他類的成員會在后面章節詳細講解。
4.1 成員變量
4.1.1 成員變量與局部變量的區別
在方法體外,類體內聲明的變量稱為成員變量。在方法體內部聲明的變量稱為局部變量。成員變量和局部變量的區別如下:
示例1:成員變量與局部變量區別
/*** 成員變量與局部變量的區別*/ public class VariableDemo {//成員變量可以被private、public、static、final修飾,這些修飾符含義后面詳細講解private int id;private String name;/*程序入口*/public static void main(String[] args) {//局部變量只能用final修飾//private int i; //報錯int j = 1;//局部變量必須初始化才能使用System.out.println(j);//創建對象,成員變量有默認值VariableDemo variableDemo = new VariableDemo();System.out.println(variableDemo.id);System.out.println(variableDemo.name);} }4.1.2 成員變量的默認值
當一個對象被創建時,會對其中各種類型的成員變量自動進行初始化賦值。除了 基本數據類型之外的變量類型都是引用類型。具體默認值如下:
示例2:成員變量默認值
/*** 成員變量默認值*/ public class VariableDemo2 {byte v1;short v2;int v3;long v4;float v5;double v6;char v7;boolean v8;/*程序入口*/public static void main(String[] args) {VariableDemo2 variableDemo2 = new VariableDemo2();System.out.println(variableDemo2.v1);System.out.println(variableDemo2.v2);System.out.println(variableDemo2.v3);System.out.println(variableDemo2.v4);System.out.println(variableDemo2.v5);System.out.println(variableDemo2.v6);System.out.println(variableDemo2.v7);System.out.println(variableDemo2.v8);} }4.2 方法
什么是方法?
- 方法是類或對象行為特征的抽象,用來完成某個功能操作。在某些語言中也稱為函數或過程。
- 將功能封裝為方法的目的是,可以實現代碼重用,簡化代碼
- Java里的方法不能獨立存在,所有的方法必須定義在類里
4.2.1 方法的基本應用
定義方法的語法如下:
其中 :
- 修飾符:public, 缺省,private, protected等等
- 返回值類型:
- 沒有返回值:void
- 有返回值,聲明出返回值的類型。與方法體中“ “return ” 返回值” 搭配使用;返回值類型可以是基本類型和引用類型。
- 方法名 :屬于標識符,命名時遵循標識符命名規則和規范,“ 見名知意”
- 形參列表:可以包含零個,一個或多個 參數。多個參數時,中間用“, ”隔開
- 返回值:方法在執行完畢后返還給調用它的程序的數據。
方法 的分類:按照是否有形參及返回值
注意:無返回的方法也可以使用return關鍵字,代表結束方法的執行。具體使用參照下面示例:
示例1:方法的分類演示
/*** 方法定義的分類*/ public class MethodDemo {// 無參數,無返回值方法void method1(){System.out.println("胖叔講java,一路相伴");}// 有參數,無返回值方法void method2(String arg){System.out.println("有參數無返回值方法,參數是:"+arg);}// 無參數,有返回值方法String method3(){return "結果"; //返回的內容必須和返回類型保持一致}// 有參數,有返回值方法String method4(String arg){System.out.println("有參數有返回值方法,參數是:"+arg);return "結果2";}public static void main(String[] args) {//創建對象MethodDemo methodDemo = new MethodDemo();//調用方法methodDemo.method1();methodDemo.method2("小紅");String result = methodDemo.method3();System.out.println(result);String result2 = methodDemo.method4("小明");System.out.println(result2);}}示例2:無返回值方法使用return關鍵字
/*** 無返回值方法使用return關鍵字*/ public class MethodDemo2 {/*** 需求:從1打印到指定目標數** return 結束該方法運行。 返回值類型是void return 后面不加值,直接寫分號。*/public void method1(int target){int i = 1;while(true){System.out.println(i);if(i==target){return;}i++;}}public static void main(String[] args) {MethodDemo2 methodDemo2 = new MethodDemo2();methodDemo2.method1(1100);} }小結:
- 方法被調用一次,就會執行一次
- 沒有具體返回值的情況,返回值類型用關鍵字void表示,那么方法體中可以不必使用return語句。如果使用,僅用來結束方法。
- 定義方法時,方法的結果應該返回給調用者,交由調用者處理。
- 方法中只能調用方法或屬性,不可以在方法內部定義方法。
4.2.2 方法的重載
重載的概念:在同一個類中,允許存在一個以上的同名方法,只要它們的參數個數或者參數類型不同即可。
重載的特點:與返回值類型無關,只看參數列表,且參數列表必須不同。(參數個數或參數類型)。調用時,根據方法參數列表的不同來區別。
示例:返回兩個數字/三個數字的和
package top.psjj.demo1;/*** 方法的重載,求兩個數的和*/ public class OverloadMethod {int sum(int a,int b){return a+b;}int sum(int a,int b,int c){return a+b+c;}double sum(double a,double b){return a+b;}double sum(double a,double b ,double c){return a+b+c;}public static void main(String[] args) {//創建對象OverloadMethod overloadMethod = new OverloadMethod();//調用方法:方法重載,優點:感覺上像是調用一個方法實現了多個功能,實際還是調用了多個方法。int result = overloadMethod.sum(1, 2);System.out.println(result);double result2 = overloadMethod.sum(1.1, 2.2);System.out.println(result2);int result3 = overloadMethod.sum(1, 2, 3);System.out.println(result3);double result4 = overloadMethod.sum(1.1,2.2,3.3);System.out.println(result4);} }練習題1:編寫程序,定義三個重載方法并調用。方法名為mol。三個方法分別接收一個int參數、兩個int參數、一個字符串參數。分別 執行平方運算并輸出結果,相乘并輸出結果,輸出字符串信息。 在主類的main ()方法中分別用參數區別調用三個方法。
練習題2:定義三個重載方法max(),第一個方法求兩個int值中的最大值,第二個方 法求兩個double值中的最大值,第三個方法求三個double值中的最大值, 并分別調用三個方法。
4.2.3 方法的可變參數
什么是可變參數?
JavaSE 5.0 中提供了Varargs(variable number of arguments)機制,允許直接定義能和多個實參相匹配的形參。從而,可以用一種更簡單的方式,來傳遞個數可變的實參
可變參數語法:
- 聲明格式:**方法名(參數的類型名 …參數名) **
- 可變參數:傳遞實參的個數是可變的,可以是0個,1個 ,2個 …
- 可變個數形參的方法與同名的方法之間,彼此構成重載
- 可變參數方法的使用與方法參數部分使用數組是一致的
- 方法的參數部分有可變形參,需要放在形參聲明的最后
- 在一個方法的形參位置,最多只能聲明一個可變個數形參
示例:通過可變參數計算n個數的最大值,最小值。
/*** 可變參數:通過可變參數計算n個數的最大值,最小值。*/ public class NumberUtils {//args 代表參數void printMaxAndMin(double... args) {//1.可變參數的數據全部存放在args的數組中double min;double max;if(args.length>0) {//2.如果傳入參數就初始化最大值和最小值min = args[0];max = args[0];for(int i=0;i<args.length;i++) {if(min>args[i]) {min = args[i];}if(max<args[i]) {max = args[i];}}//3.打印最大值和最小值System.out.println("最大值:"+max);System.out.println("最小值:"+min);} else {System.out.println("沒有傳遞參數無法計算最大值和最小值");}}public static void main(String[] args) {NumberUtils numberUtils = new NumberUtils();numberUtils.printMaxAndMin(-1.1,2.2,3.3,9.3);numberUtils.printMaxAndMin();} }示例2:
/*** 求n個整數的和,至少傳入一個參數*/ public class SumDemo {//1.只可以有一個可變參數而且必須在最后int sum(int number,int... args) {int sum = 0;sum+=number;if(args.length>0) {for(int i=0;i<args.length;i++) {sum+=args[i];}}return sum;}public static void main(String[] args) {SumDemo sumDemo = new SumDemo();int result = sumDemo.sum(1,2,3);System.out.println(result);} }練習題:通過可變參數計算n個數的最大值,最小值,和,平均值。
4.2.4 方法的值的傳遞機制
Java里方法的參數傳遞方式只有一種:值傳遞。 即將實際參數值的副本(復制品)傳入方法內,而參數本身不受影響。
- 形參是基本數據和String類型:將實參基本數據類型變量的“數據值”傳遞給形參
- 形參是引用數據類型:將實參引用數據類型變量的“地址值”傳遞給形參
示例1:測試方法參數傳遞是傳遞實際參數的副本
public class MethodDemo {//Java里方法的參數傳遞方式只有一種:值傳遞。 即將實際參數值的副本(復制品)傳入方法內,而參數本身不受影響。void method1(int i){//改變參數值i++;System.out.println(i);}//Java里方法的參數傳遞方式只有一種:值傳遞。 即將實際參數值的副本(復制品)傳入方法內,而參數本身不受影響。void method2(User user){//改變參數的地址user = new User();//給新地址重新賦值user.id = 2;user.name = "李四";user.show();}public static void main(String[] args) {//創建對象MethodDemo methodDemo = new MethodDemo();//將變量i傳入method1方法中,是將i的副本傳入方法中i的值不受影響int i = 5;methodDemo.method1(i);System.out.println(i);//將user對象傳入method2方法中,是將user對象的內存地址副本傳入方法中User user = new User();user.id = 1;user.name = "張三";// method2對傳入的副本的地址更改了,對原來地址內容沒有影響methodDemo.method2(user);user.show();} } class User {int id;String name;void show(){System.out.println("id:"+id+",name:"+name);} }示例2:當實際參數是基本類型和引用類型的區別
/*** 值傳遞,基本類型和引用類型的區別*/ public class MethodDemo2 {//傳遞基本類型傳遞的是值的副本,方法體內改變參數的值不會影響外部變量void method1(int i){//改變參數值i++;System.out.println(i);}//傳遞引用類型傳遞的是值的副本,但是值的副本和外部變量卻指向堆內存同一塊內存地址//所以改變改變user地址的內容,外部的對象的屬性也就變了void method2(User user){user.id = 2;user.name = "李四";user.show();}public static void main(String[] args) {MethodDemo2 methodDemo2 = new MethodDemo2();//傳遞基本類型傳遞的是值的副本,方法體內改變參數的值不會影響外部變量int i = 1;methodDemo2.method1(i);System.out.println(i);//傳遞引用類型傳遞的是值的副本,但是值的副本和外部變量卻指向堆內存同一塊內存地址//所以改變改變user地址的內容,外部的對象的屬性也就變了User user = new User();user.id = 1;user.name = "張三";methodDemo2.method2(user);user.show();}} class User {int id;String name;void show(){System.out.println("id:"+id+",name:"+name);} }練習題:定義一個數組工具類數組反轉,數組排序。
小結:java參數傳遞機制只有一種,值傳遞,既將實參的復制品的值傳入參數;如果是基本類型和String傳遞的數數據值,對外部變量沒有影響;如果傳遞是引用類I型那個,傳遞的是地址值,可能堆外部變量有影響。
4.2.5 方法的遞歸
什么是遞歸?遞歸就是方法本身調用方法本身。
示例1:用方法打印1-100的數;
public class RecursiveDemo {//1.用遞歸的方式:從1打印到100void print(int i) {if(i<=100) { System.out.println(i);i++;print(i);}}public static void main(String[] args) {RecursiveDemo recursiveDemo = new RecursiveDemo();recursiveDemo.print(1);} }示例2:遞歸必須指定程序出口,否者報錯:StackOverflowError 棧溢出錯誤
public class RecursiveDemo2 {//遞歸調用沒有指定方法出口,無限調用void print(int i) {System.out.println(i);i++;print(i);}public static void main(String[] args) {RecursiveDemo2 recursiveDemo2 = new RecursiveDemo2();recursiveDemo2.print(1);} }練習題1:請用遞歸計算出1-100的和
練習題2:請用Java寫出遞歸求階乘(n!)的算法
4.3 構造方法
4.3.1 構造方法的基本使用
在java類中定義的構造方法是用來創建對象的,它的定義語法如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-G7N3U0eZ-1658146485325)(assets/14.png)]
示例1:在User類型中定義構造方法并使用
public class User {int id;String name;int age;//定義構造方法User(int userId,String userName,int userAge){id = userId;name = userName;age = userAge;}public static void main(String[] args) {//使用構造方法創建對象User user = new User(1,"張三",21);//查看user信息System.out.println("id:"+user.id+",name:"+user.name+",age:"+user.age);} }4.3.2 構造方法的重載
構造方法是一種特殊的方法,也可以進行方法的重載;
示例1:
public class User {int id;String name;int age;//定義構造方法User(int userId,String userName,int userAge){id = userId;name = userName;age = userAge;}//構造方法的重載User(int userId,String userName){id = userId;name = userName;}User(){}public static void main(String[] args) {//使用構造方法創建對象User user = new User(1,"張三",21);//查看user信息System.out.println("id:"+user.id+",name:"+user.name+",age:"+user.age);//創建對象,查看用戶信息User user2 = new User(2,"李四");System.out.println("id:"+user2.id+",name:"+user2.name+",age:"+user2.age);//創建對象,查看用戶信息User user3 = new User();System.out.println("id:"+user3.id+",name:"+user3.name+",age:"+user3.age);} }4.3.3 默認構造方法
在一個類中如果沒定義構造方法,系統會默認定義一個無參數的構造方法;在一個類中如果定義了構造方法,系統將不會默認定義構造方法
示例1:
public class Person {int id;String name;/*** 當類中沒有定義構造方法時,系統會默認定義如下構造方法*//*public Person(){}*//*** 當類中定義了構造方法時,系統不會默認定義構造方法*/public Person(int personId,String personName){id = personId;name = personName;}public static void main(String[] args) {//創建對象Person person = new Person();} }4.3.4 構造方法注意事項
使用構造方法時需要注意以下幾點:
- 它具有與類相同的名稱
- 它不聲明返回值類型。(與聲明為void不同)
- 不能被static、final、synchronized、abstract 等修飾,不能有 return語句返回值
- 構造方法是一種特殊的方法,支持重載
4.4 小結
成員變量與局部變量的區別
成員變量的默認值
方法的重載
可變參數
方法的值傳遞機制
方法的遞歸
構造方法
五、this關鍵字
5.1 this關鍵字概述
在Java中,this關鍵字比較難理解,它的作用和其詞義很接近。單詞含義是這個 的意思 。this關鍵字可以使用在方法和構造方法體內。
- 它在方法內部使用,即這個方法所屬對象的引用;
- 它在構造器內部使用,表示該構造器正在初始化的對象。
- this 可以調用類的屬性、方法和構造器
5.2 this 入門案例
我們先看如下案例,發現構造方法的參數名不能和成員變量名一樣,否者無法初始化;示例代碼如下:
public class User {int id;String name;int age;/***java 使用變量有就近原則 從當前最近{} 范圍查找變量,找到就是使用,找不到才去成員變量找* 所以,這里面的id=id name = name age=age其實是參數給參數自己賦值,根本沒有調用成員變量*//* User(int id,String name,int age){id = id;name = name;age = age;}*/// this關鍵字,表示該構造方法正在初始化的對象User(int id,String name,int age){this.id = id;this.name = name;this.age = age;}void show(){System.out.println("id:"+id+",name:"+name+",age:"+age);}/*程序入口*/public static void main(String[] args) {User user = new User(1,"張三",18);user.show();User user2 = new User(2,"李四",19);user2.show();} }5.3 this關鍵字應用場景
this關鍵字可以使用在方法和構造方法體內。
- 它在方法內部使用,即這個方法所屬對象的引用;
- 它在構造器內部使用,表示該構造器正在初始化的對象。
- this 可以調用類的屬性、方法和構造器
示例1:this在構造方法中應用
public class User {int id;String name;int sex;User(int id,String name,int sex){//this代表當前正在初始化的user對象,// 含義是user.id = id; user.name = name user.sex = sex;//但此時只能通過this引用正在初始化的對象。this.id = id;this.name = name;this.sex = sex;}User(int id,String name){// this(參數列表)調用的是構造方法 調用的上面的構造方法this(id,name,0);// 代表當前正在初始化的user對象 this.show()等價于user.show(),但此時只能通過this引用正在初始化的對象。this.show();}void show(){System.out.println("id:"+id+",name:"+name+",sex:"+sex);}/*程序入口*/public static void main(String[] args) {User user = new User(1,"張三");} }示例2:this在普通方法中應用
public class User {int id;String name;int sex;User(int id, String name, int sex) {this.id = id;this.name = name;this.sex = sex;}void method1(){System.out.println("方法");}void show(){//在方法中不可以調用構造器,不能使用this(1,"張三",1);//當前方法所屬對象調用method1()this.method1();//當前方法所屬對象 id name sex 屬性System.out.println("id:"+this.id+",name:"+this.name+",sex:"+this.sex);}}5.4 小結
this可以使用在構造器和方法中,在構造器中可以使用
- this.屬性
- this.方法
- this(構造方法參數列表)
在普通方法中可以使用
- this.屬性
- this.方法
六、總結
總結
以上是生活随笔為你收集整理的day06_类与对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 朋友圈点赞收费吗_微信点赞
- 下一篇: 等待事件 latch:cache buf