摘要:分別使用這四個構造器方法去創建對象。出口是指的是我們在創建構造器的時候,不能每一個構造器方法中都使用方法,因為如果全部都使用,程序執行的就會陷入遞歸調用就會報錯。在下面的代碼中,我們需要了解的知識是就是指我們當前的調用的構造器方法。
具體內容
在 Java 程序中,當局部變量和全局變量數據類型和名稱都相同的時,此時全局變量會被隱藏而變得不能使用。即:局部變量會覆蓋掉全局變量。
在 Java 程序中,利用 this 關鍵字可以顯示類屬性的調用、類方法的調用、表示當前對象。
使用 this 的語法格式如下:
this.成員變量名 this.成員方法名()this 具體使用 調用成員變量
Demo.java
// 定義一個內部類 BookInfo class BookInfo { // 內部類的屬性 String title; double price; // 內部類的方法 public void getInfo() { // 打印的結果是當前對象的屬性,是當前對象 System.out.println("圖書名稱:" + this.title + ",價格為:" + this.price); } } public class Demo { public static void main(String[] args) { // 實例化 兩個BookInfo 的對象 BookInfo bookA = new BookInfo(); BookInfo bookB = new BookInfo(); // 給 bookA 增加屬性 bookA.price = 89.8; bookA.title = "Java 開發"; // 給 booA 這個對象賦值, // 給 bookB 增加屬性 bookB.price = 69.8; bookB.title = "JSP 開發"; // 給 booB 這個對象賦值 // 分別調用 getInfo() 方法 bookA.getInfo(); bookB.getInfo(); } }
控制臺輸出
圖書名稱:Java 開發,價格為:89.8 圖書名稱:JSP 開發,價格為:69.8
說明
通過控制臺的輸出,可以看到程序上面實例化的兩個對象:bookA、bookB,分別通過 getInfo() 打印出來的數據都是自己的,即在調用 BookInfo 中的 getInfo() 時,調用時候的 this 就是執行當時的調用對象。例如:當 bookA 調用 getInfo() 時,當前的 this 就是指的是 bookA。
成員變量的作用域Demo.java
class BookInfo { String title; double price; public void getInfo() { String title = "我是默認值"; // 局部變量 // 輸出的結果也為局部變量 System.out.println("title 值為:"+ title); // 輸出的結果為全局變量 System.out.println("圖書名稱:" + this.title + ",價格為:" + this.price); } } public class Demo { public static void main(String[] args) { // 實例化 BookInfo 對象 BookInfo bookA = new BookInfo(); // 給 bookA 增加屬性 bookA.price = 89.8; bookA.title = "Java 開發"; bookA.getInfo(); } }
控制臺輸出
title 值為:我是默認值 圖書名稱:Java 開發,價格為:89.8
說明
如果我們在 BookInfo 類中的 getInfo() 方法中,全部都是使用 title,而不是使用 this.title,那么輸出的結果就全部為 我是默認值。 那是因為我們的定義了局部變量,如果沒有 this 關鍵字去聲明,那么所有的 title 引入的指向都是 當前的局部變量。在上面的程序代碼中就是:我是默認值。
反過來看,當我們加上了 this 關鍵字,就是表示當前的對象,而 this.title 就是指的是我們定義的全局的屬性了。
調用成員方法 使用傳統的方式在使用 this 關鍵字之前,我們先看下傳統的方法。在下面的代碼中有四個構造器方法。分別使用這四個構造器方法去創建對象。并且輸出結果。
TestDemo.java
class Emp{ private int empno; private String ename; private double sal; private String dept; public Emp() { this.empno = 0; this.ename = "無名氏"; this.sal = 0.0; this.dept = "無"; } public Emp(int empno){ this.empno = empno; this.ename = "臨時工"; this.sal = 200; this.dept = "測試組"; } public Emp(int empno, String ename){ this.empno = empno; this.ename = ename; this.sal = 2000.0; this.dept = "技術部"; } 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 "雇員編號:" + this.empno + ", 雇員名稱" + this.ename + ", 工資" + this.sal + ",部門"+ 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, "經理部"); System.out.println(emp1.getInfo()); System.out.println(emp2.getInfo()); System.out.println(emp3.getInfo()); System.out.println(emp4.getInfo()); } }
控制臺輸出
雇員編號:0, 雇員名稱無名氏, 工資0.0,部門無 雇員編號:2, 雇員名稱臨時工, 工資200.0,部門測試組 雇員編號:3, 雇員名稱張三, 工資2000.0,部門技術部 雇員編號:4, 雇員名稱張三, 工資5000.0,部門經理部使用 this 調用方法
接下來,我們使用 this 來改寫,上面的寫法肯定不是最優的方案。因為存在好多的重復性的代碼。然后我們使用 this 來重構。但是在下面的代碼中,需要留有一個 this 出口。
++出口是指的是:我們在創建構造器的時候,不能每一個 構造器方法中都使用 this() 方法,因為如果全部都使用,程序執行的就會陷入“遞歸調用” 就會報錯。++
在下面的代碼中,我們需要了解的知識是:this() 就是指我們當前的調用的構造器方法。
TestDemo.java
package com.wq.study.reference; class Emp{ private int empno; private String ename; private double sal; private String dept; public Emp() { // 我們通過使用 this() 方法來調用我們的 四參構造方法 this(0, "無名氏", 0.0, "無"); // 當前一行就可以替換下面的四行代碼 /*由于改寫,這段代碼就注釋掉 this.empno = 0; this.ename = "無名氏"; this.sal = 0.0; this.dept = "無";*/ } public Emp(int empno){ this(empno, "臨時工", 200, "測試"); // 在這個地方我們也使用 this() 方法來改寫 /* 由于改寫,這段代碼就注釋掉 this.empno = empno; this.ename = "臨時工"; this.sal = 200; this.dept = "測試組";*/ } public Emp(int empno, String ename){ this(empno, ename, 2000, "技術部"); // 同樣我們使用 this() 方法來改寫 /* 由于改寫,這段代碼就注釋掉 this.empno = empno; this.ename = ename; this.sal = 2000.0; this.dept = "技術部";*/ } 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 "雇員編號:" + this.empno + ", 雇員名稱" + this.ename + ", 工資" + this.sal + ",部門"+ 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, "經理部"); System.out.println(emp1.getInfo()); System.out.println(emp2.getInfo()); System.out.println(emp3.getInfo()); System.out.println(emp4.getInfo()); } }
控制臺輸出
雇員編號:0, 雇員名稱無名氏, 工資0.0,部門無 雇員編號:2, 雇員名稱臨時工, 工資200.0,部門測試 雇員編號:3, 雇員名稱張三, 工資2000.0,部門技術部 雇員編號:4, 雇員名稱張三, 工資5000.0,部門經理部
說明
從控制臺的輸出可以看出,這個兩個結果是沒有區別的,即說明我們改寫成功,但是需要有一點說明就是一定要在某一個 構造方法中留有出口。
this 表示當前對象this 表示當前的對象,其實還是比較好理解。我們通過以下代碼來了解。
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(); } }
控制臺
bookA: BookInfo@7852e922 this = BookInfo@7852e922 -------------------- bookB: BookInfo@4e25154f this = BookInfo@4e25154f
說明
我們打印出來的消息可以看到,this 就是當前的對象地址,指的是當前的調用的對象。
通過復雜的代碼理解 this對于 this 的理解,我們可以通過下面的復雜點的代碼來理解。代碼上面有詳細的注釋。大家仔細看就好了。
class A{ private B b; // 將 B 作為私有的成員變量 public A() { this.b = new B(this); // 2.實例化對象b,將當前的this(指的是 A)傳遞到B的構造器中, 并且將實例化出來的 B對象 給到 A 對象中的 B(為 A 對象中的私有成員變量) this.b.get(); // 4.通過 b 調用 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.將傳遞過來的 A 賦值給 自己的私有變量 A,由于作用域的關系,this指向的是 B } public void get() { this.a.print(); // 5.通過這個地方調用 A的 print() } } public class Demo { public static void main(String[] args) { A temp = new A(); // 1.實例化對象 A } }總結
類中的屬性調用以后都要加上 this
類中的構造方法間的互相調用,一定要保留有出口(即存在有一個構造方法沒有使用 this() )
this 表示當前對象,指的是當前正在調用類中的方法的對象,this 不是一個固定的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76669.html
摘要:導入包注意使用了關鍵字上面使用了關鍵字之后,可以直接使用中的方法。通過關鍵字調用有參構造方法控制臺輸出總結屬性和方法可以再沒有實例化對象的時候直接由類名稱進行調用。屬性保存在全局數據區。 前面兩篇分別介紹了static的屬性以及方法。本篇就做一個收尾,介紹下剩下的。 在之前的總結: 不管多少個對象,都使用同一個 static 屬性 使用 static 方法可以避免掉用實例化方法之后才...
摘要:屬性聲明雖然是在類的結構中,但是并不受到對象的控制,是獨立存在的。所修飾的在靜態數據區。也就是說,在沒有產生實例化對象的情況下,依然可以使用對象。 static 關鍵字,我們在開發用的還是比較多的。在《Java編程思想》有下面一段話 static 方法就是沒有 this 的方法。在 static 方法內部不能調用非靜態方法,反過來是可以的。而且可以在沒有創建任何對象的前提下,僅僅通過類...
摘要:前面一篇已經介紹了部分關于的用法,主要是介紹的是修飾變量的一些知識?,F在的這篇介紹下修飾方法。方法調用非方法或者屬性錯誤的調用以下的操作都在下面進行的。只能調用屬性或者方法。所有的定于的結構不受實例化對象的控制。 前面一篇已經介紹了部分關于 static 的用法,主要是介紹的是 static 修飾變量的一些知識。現在的這篇介紹下 static 修飾方法。 static 修飾方法 沒有實...
摘要:一積累中如何快速查看包中的源碼最常用的大開發快捷鍵技巧將對象保存到文件中從文件中讀取對象中的用法的配置詳解和代碼的格式詳解格式化內容設置生成詳解注釋規范中設置內存調試的小知識單步執行命令的區別的動態代理機制詳解內容有瑕疵,樓指正泛型繼承的幾 一、積累 1.JAVA Eclipse中如何快速查看jar包中 的class源碼 最常用的15大Eclipse開發快捷鍵技巧 Java將對象保存到...
閱讀 1447·2021-09-03 10:29
閱讀 3469·2019-08-29 16:24
閱讀 2037·2019-08-29 11:03
閱讀 1424·2019-08-26 13:52
閱讀 2936·2019-08-26 11:36
閱讀 2797·2019-08-23 17:19
閱讀 571·2019-08-23 17:14
閱讀 819·2019-08-23 13:59