摘要:分別使用這四個(gè)構(gòu)造器方法去創(chuàng)建對(duì)象。出口是指的是我們?cè)趧?chuàng)建構(gòu)造器的時(shí)候,不能每一個(gè)構(gòu)造器方法中都使用方法,因?yàn)槿绻慷际褂?,程序?zhí)行的就會(huì)陷入遞歸調(diào)用就會(huì)報(bào)錯(cuò)。在下面的代碼中,我們需要了解的知識(shí)是就是指我們當(dāng)前的調(diào)用的構(gòu)造器方法。
具體內(nèi)容
在 Java 程序中,當(dāng)局部變量和全局變量數(shù)據(jù)類(lèi)型和名稱都相同的時(shí),此時(shí)全局變量會(huì)被隱藏而變得不能使用。即:局部變量會(huì)覆蓋掉全局變量。
在 Java 程序中,利用 this 關(guān)鍵字可以顯示類(lèi)屬性的調(diào)用、類(lèi)方法的調(diào)用、表示當(dāng)前對(duì)象。
使用 this 的語(yǔ)法格式如下:
this.成員變量名 this.成員方法名()this 具體使用 調(diào)用成員變量
Demo.java
// 定義一個(gè)內(nèi)部類(lèi) BookInfo class BookInfo { // 內(nèi)部類(lèi)的屬性 String title; double price; // 內(nèi)部類(lèi)的方法 public void getInfo() { // 打印的結(jié)果是當(dāng)前對(duì)象的屬性,是當(dāng)前對(duì)象 System.out.println("圖書(shū)名稱:" + this.title + ",價(jià)格為:" + this.price); } } public class Demo { public static void main(String[] args) { // 實(shí)例化 兩個(gè)BookInfo 的對(duì)象 BookInfo bookA = new BookInfo(); BookInfo bookB = new BookInfo(); // 給 bookA 增加屬性 bookA.price = 89.8; bookA.title = "Java 開(kāi)發(fā)"; // 給 booA 這個(gè)對(duì)象賦值, // 給 bookB 增加屬性 bookB.price = 69.8; bookB.title = "JSP 開(kāi)發(fā)"; // 給 booB 這個(gè)對(duì)象賦值 // 分別調(diào)用 getInfo() 方法 bookA.getInfo(); bookB.getInfo(); } }
控制臺(tái)輸出
圖書(shū)名稱:Java 開(kāi)發(fā),價(jià)格為:89.8 圖書(shū)名稱:JSP 開(kāi)發(fā),價(jià)格為:69.8
說(shuō)明
通過(guò)控制臺(tái)的輸出,可以看到程序上面實(shí)例化的兩個(gè)對(duì)象:bookA、bookB,分別通過(guò) getInfo() 打印出來(lái)的數(shù)據(jù)都是自己的,即在調(diào)用 BookInfo 中的 getInfo() 時(shí),調(diào)用時(shí)候的 this 就是執(zhí)行當(dāng)時(shí)的調(diào)用對(duì)象。例如:當(dāng) bookA 調(diào)用 getInfo() 時(shí),當(dāng)前的 this 就是指的是 bookA。
成員變量的作用域Demo.java
class BookInfo { String title; double price; public void getInfo() { String title = "我是默認(rèn)值"; // 局部變量 // 輸出的結(jié)果也為局部變量 System.out.println("title 值為:"+ title); // 輸出的結(jié)果為全局變量 System.out.println("圖書(shū)名稱:" + this.title + ",價(jià)格為:" + this.price); } } public class Demo { public static void main(String[] args) { // 實(shí)例化 BookInfo 對(duì)象 BookInfo bookA = new BookInfo(); // 給 bookA 增加屬性 bookA.price = 89.8; bookA.title = "Java 開(kāi)發(fā)"; bookA.getInfo(); } }
控制臺(tái)輸出
title 值為:我是默認(rèn)值 圖書(shū)名稱:Java 開(kāi)發(fā),價(jià)格為:89.8
說(shuō)明
如果我們?cè)?BookInfo 類(lèi)中的 getInfo() 方法中,全部都是使用 title,而不是使用 this.title,那么輸出的結(jié)果就全部為 我是默認(rèn)值。 那是因?yàn)槲覀兊亩x了局部變量,如果沒(méi)有 this 關(guān)鍵字去聲明,那么所有的 title 引入的指向都是 當(dāng)前的局部變量。在上面的程序代碼中就是:我是默認(rèn)值。
反過(guò)來(lái)看,當(dāng)我們加上了 this 關(guān)鍵字,就是表示當(dāng)前的對(duì)象,而 this.title 就是指的是我們定義的全局的屬性了。
調(diào)用成員方法 使用傳統(tǒng)的方式在使用 this 關(guān)鍵字之前,我們先看下傳統(tǒng)的方法。在下面的代碼中有四個(gè)構(gòu)造器方法。分別使用這四個(gè)構(gòu)造器方法去創(chuàng)建對(duì)象。并且輸出結(jié)果。
TestDemo.java
class Emp{ private int empno; private String ename; private double sal; private String dept; public Emp() { this.empno = 0; this.ename = "無(wú)名氏"; this.sal = 0.0; this.dept = "無(wú)"; } public Emp(int empno){ this.empno = empno; this.ename = "臨時(shí)工"; this.sal = 200; this.dept = "測(cè)試組"; } public Emp(int empno, String ename){ this.empno = empno; this.ename = ename; this.sal = 2000.0; this.dept = "技術(shù)部"; } public Emp(int empno, String ename, double sal, String dept){ this.empno = empno; this.ename = ename; this.sal = sal; this.dept = dept; } public String getInfo() { return "雇員編號(hào):" + this.empno + ", 雇員名稱" + this.ename + ", 工資" + this.sal + ",部門(mén)"+ this.dept; } } public class TestDemo { public static void main(String[] args) { Emp emp1 = new Emp(); Emp emp2 = new Emp(2); Emp emp3 = new Emp(3, "張三"); Emp emp4 = new Emp(4, "張三", 5000, "經(jīng)理部"); System.out.println(emp1.getInfo()); System.out.println(emp2.getInfo()); System.out.println(emp3.getInfo()); System.out.println(emp4.getInfo()); } }
控制臺(tái)輸出
雇員編號(hào):0, 雇員名稱無(wú)名氏, 工資0.0,部門(mén)無(wú) 雇員編號(hào):2, 雇員名稱臨時(shí)工, 工資200.0,部門(mén)測(cè)試組 雇員編號(hào):3, 雇員名稱張三, 工資2000.0,部門(mén)技術(shù)部 雇員編號(hào):4, 雇員名稱張三, 工資5000.0,部門(mén)經(jīng)理部使用 this 調(diào)用方法
接下來(lái),我們使用 this 來(lái)改寫(xiě),上面的寫(xiě)法肯定不是最優(yōu)的方案。因?yàn)榇嬖诤枚嗟闹貜?fù)性的代碼。然后我們使用 this 來(lái)重構(gòu)。但是在下面的代碼中,需要留有一個(gè) this 出口。
++出口是指的是:我們?cè)趧?chuàng)建構(gòu)造器的時(shí)候,不能每一個(gè) 構(gòu)造器方法中都使用 this() 方法,因?yàn)槿绻慷际褂?,程序?zhí)行的就會(huì)陷入“遞歸調(diào)用” 就會(huì)報(bào)錯(cuò)。++
在下面的代碼中,我們需要了解的知識(shí)是:this() 就是指我們當(dāng)前的調(diào)用的構(gòu)造器方法。
TestDemo.java
package com.wq.study.reference; class Emp{ private int empno; private String ename; private double sal; private String dept; public Emp() { // 我們通過(guò)使用 this() 方法來(lái)調(diào)用我們的 四參構(gòu)造方法 this(0, "無(wú)名氏", 0.0, "無(wú)"); // 當(dāng)前一行就可以替換下面的四行代碼 /*由于改寫(xiě),這段代碼就注釋掉 this.empno = 0; this.ename = "無(wú)名氏"; this.sal = 0.0; this.dept = "無(wú)";*/ } public Emp(int empno){ this(empno, "臨時(shí)工", 200, "測(cè)試"); // 在這個(gè)地方我們也使用 this() 方法來(lái)改寫(xiě) /* 由于改寫(xiě),這段代碼就注釋掉 this.empno = empno; this.ename = "臨時(shí)工"; this.sal = 200; this.dept = "測(cè)試組";*/ } public Emp(int empno, String ename){ this(empno, ename, 2000, "技術(shù)部"); // 同樣我們使用 this() 方法來(lái)改寫(xiě) /* 由于改寫(xiě),這段代碼就注釋掉 this.empno = empno; this.ename = ename; this.sal = 2000.0; this.dept = "技術(shù)部";*/ } public Emp(int empno, String ename, double sal, String dept){ // 我們這個(gè)地方留有出口。就不會(huì)導(dǎo)致產(chǎn)生遞歸調(diào)用而報(bào)錯(cuò) this.empno = empno; this.ename = ename; this.sal = sal; this.dept = dept; } public String getInfo() { return "雇員編號(hào):" + this.empno + ", 雇員名稱" + this.ename + ", 工資" + this.sal + ",部門(mén)"+ this.dept; } } public class TestDemo { public static void main(String[] args) { Emp emp1 = new Emp(); Emp emp2 = new Emp(2); Emp emp3 = new Emp(3, "張三"); Emp emp4 = new Emp(4, "張三", 5000, "經(jīng)理部"); System.out.println(emp1.getInfo()); System.out.println(emp2.getInfo()); System.out.println(emp3.getInfo()); System.out.println(emp4.getInfo()); } }
控制臺(tái)輸出
雇員編號(hào):0, 雇員名稱無(wú)名氏, 工資0.0,部門(mén)無(wú) 雇員編號(hào):2, 雇員名稱臨時(shí)工, 工資200.0,部門(mén)測(cè)試 雇員編號(hào):3, 雇員名稱張三, 工資2000.0,部門(mén)技術(shù)部 雇員編號(hào):4, 雇員名稱張三, 工資5000.0,部門(mén)經(jīng)理部
說(shuō)明
從控制臺(tái)的輸出可以看出,這個(gè)兩個(gè)結(jié)果是沒(méi)有區(qū)別的,即說(shuō)明我們改寫(xiě)成功,但是需要有一點(diǎn)說(shuō)明就是一定要在某一個(gè) 構(gòu)造方法中留有出口。
this 表示當(dāng)前對(duì)象this 表示當(dāng)前的對(duì)象,其實(shí)還是比較好理解。我們通過(guò)以下代碼來(lái)了解。
Demo.java
class BookInfo { public void getInfo() { System.out.println("this ="+ this); } } public class Demo { public static void main(String[] args) { BookInfo bookA = new BookInfo(); System.out.println("bookA:"+bookA); bookA.getInfo(); System.out.println("--------------------"); BookInfo bookB = new BookInfo(); System.out.println("bookB:"+bookB); bookB.getInfo(); } }
控制臺(tái)
bookA: BookInfo@7852e922 this = BookInfo@7852e922 -------------------- bookB: BookInfo@4e25154f this = BookInfo@4e25154f
說(shuō)明
我們打印出來(lái)的消息可以看到,this 就是當(dāng)前的對(duì)象地址,指的是當(dāng)前的調(diào)用的對(duì)象。
通過(guò)復(fù)雜的代碼理解 this對(duì)于 this 的理解,我們可以通過(guò)下面的復(fù)雜點(diǎn)的代碼來(lái)理解。代碼上面有詳細(xì)的注釋。大家仔細(xì)看就好了。
class A{ private B b; // 將 B 作為私有的成員變量 public A() { this.b = new B(this); // 2.實(shí)例化對(duì)象b,將當(dāng)前的this(指的是 A)傳遞到B的構(gòu)造器中, 并且將實(shí)例化出來(lái)的 B對(duì)象 給到 A 對(duì)象中的 B(為 A 對(duì)象中的私有成員變量) this.b.get(); // 4.通過(guò) b 調(diào)用 get() 方法 } public void print() { System.out.println("Hello word!"); // 6.打印輸出 Hello word! } } class B{ private A a; // 將 A 作為私有的成員變量 public B(A a) { this.a = a; // 3.將傳遞過(guò)來(lái)的 A 賦值給 自己的私有變量 A,由于作用域的關(guān)系,this指向的是 B } public void get() { this.a.print(); // 5.通過(guò)這個(gè)地方調(diào)用 A的 print() } } public class Demo { public static void main(String[] args) { A temp = new A(); // 1.實(shí)例化對(duì)象 A } }總結(jié)
類(lèi)中的屬性調(diào)用以后都要加上 this
類(lèi)中的構(gòu)造方法間的互相調(diào)用,一定要保留有出口(即存在有一個(gè)構(gòu)造方法沒(méi)有使用 this() )
this 表示當(dāng)前對(duì)象,指的是當(dāng)前正在調(diào)用類(lèi)中的方法的對(duì)象,this 不是一個(gè)固定的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76669.html
摘要:導(dǎo)入包注意使用了關(guān)鍵字上面使用了關(guān)鍵字之后,可以直接使用中的方法。通過(guò)關(guān)鍵字調(diào)用有參構(gòu)造方法控制臺(tái)輸出總結(jié)屬性和方法可以再?zèng)]有實(shí)例化對(duì)象的時(shí)候直接由類(lèi)名稱進(jìn)行調(diào)用。屬性保存在全局?jǐn)?shù)據(jù)區(qū)。 前面兩篇分別介紹了static的屬性以及方法。本篇就做一個(gè)收尾,介紹下剩下的。 在之前的總結(jié): 不管多少個(gè)對(duì)象,都使用同一個(gè) static 屬性 使用 static 方法可以避免掉用實(shí)例化方法之后才...
摘要:屬性聲明雖然是在類(lèi)的結(jié)構(gòu)中,但是并不受到對(duì)象的控制,是獨(dú)立存在的。所修飾的在靜態(tài)數(shù)據(jù)區(qū)。也就是說(shuō),在沒(méi)有產(chǎn)生實(shí)例化對(duì)象的情況下,依然可以使用對(duì)象。 static 關(guān)鍵字,我們?cè)陂_(kāi)發(fā)用的還是比較多的。在《Java編程思想》有下面一段話 static 方法就是沒(méi)有 this 的方法。在 static 方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過(guò)來(lái)是可以的。而且可以在沒(méi)有創(chuàng)建任何對(duì)象的前提下,僅僅通過(guò)類(lèi)...
摘要:前面一篇已經(jīng)介紹了部分關(guān)于的用法,主要是介紹的是修飾變量的一些知識(shí)。現(xiàn)在的這篇介紹下修飾方法。方法調(diào)用非方法或者屬性錯(cuò)誤的調(diào)用以下的操作都在下面進(jìn)行的。只能調(diào)用屬性或者方法。所有的定于的結(jié)構(gòu)不受實(shí)例化對(duì)象的控制。 前面一篇已經(jīng)介紹了部分關(guān)于 static 的用法,主要是介紹的是 static 修飾變量的一些知識(shí)。現(xiàn)在的這篇介紹下 static 修飾方法。 static 修飾方法 沒(méi)有實(shí)...
摘要:中的詳解必修個(gè)多線程問(wèn)題總結(jié)個(gè)多線程問(wèn)題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開(kāi)源的運(yùn)行原理從虛擬機(jī)工作流程看運(yùn)行原理。 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 基于 POI 封裝 ExcelUtil 精簡(jiǎn)的 Excel 導(dǎo)入導(dǎo)出 由于 poi 本身只是針對(duì)于 ...
摘要:一積累中如何快速查看包中的源碼最常用的大開(kāi)發(fā)快捷鍵技巧將對(duì)象保存到文件中從文件中讀取對(duì)象中的用法的配置詳解和代碼的格式詳解格式化內(nèi)容設(shè)置生成詳解注釋規(guī)范中設(shè)置內(nèi)存調(diào)試的小知識(shí)單步執(zhí)行命令的區(qū)別的動(dòng)態(tài)代理機(jī)制詳解內(nèi)容有瑕疵,樓指正泛型繼承的幾 一、積累 1.JAVA Eclipse中如何快速查看jar包中 的class源碼 最常用的15大Eclipse開(kāi)發(fā)快捷鍵技巧 Java將對(duì)象保存到...
閱讀 1470·2021-09-03 10:29
閱讀 3483·2019-08-29 16:24
閱讀 2080·2019-08-29 11:03
閱讀 1448·2019-08-26 13:52
閱讀 2954·2019-08-26 11:36
閱讀 2816·2019-08-23 17:19
閱讀 582·2019-08-23 17:14
閱讀 838·2019-08-23 13:59