2018-03-14 一、this這個關鍵字,相當於普通話里的“我” ,例如: 小明說 “我吃了” 這個時候,“我” 代表小明 小紅說 “我吃了” 這個時候,“我” 代表小紅 "我"代表當前人物 。 1、this即代表當前對象: 2、通過this關鍵字訪問對象的屬性: 3、通過this調用其他的構造 ...
2018-03-14
一、this這個關鍵字,相當於普通話里的“我” ,例如:
小明說 “我吃了” 這個時候,“我” 代表小明
小紅說 “我吃了” 這個時候,“我” 代表小紅
"我"代表當前人物 。
1、this即代表當前對象:
public class Hero { String name; //姓名 float hp; //血量 float armor; //護甲 int moveSpeed; //移動速度 //列印記憶體中的虛擬地址 public void showAddressInMemory(){ System.out.println("列印this看到的虛擬地址:"+this); } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "蓋倫"; //直接列印對象,會顯示該對象在記憶體中的虛擬地址 //格式:Hero@c17164 c17164即虛擬地址,每次執行,得到的地址不一定一樣 System.out.println("列印對象看到的虛擬地址:"+garen); //調用showAddressInMemory,列印該對象的this,顯示相同的虛擬地址 garen.showAddressInMemory(); Hero teemo = new Hero(); teemo.name = "提莫"; System.out.println("列印對象看到的虛擬地址:"+teemo); teemo.showAddressInMemory(); } }
2、通過this關鍵字訪問對象的屬性:
public class Hero { String name; //姓名 float hp; //血量 float armor; //護甲 int moveSpeed; //移動速度 //參數名和屬性名一樣 //在方法體中,只能訪問到參數name public void setName1(String name){ name = name; } //為了避免setName1中的問題,參數名不得不使用其他變數名 public void setName2(String heroName){ name = heroName; } //通過this訪問屬性 public void setName3(String name){ //name代表的是參數name //this.name代表的是屬性name this.name = name; } public static void main(String[] args) { Hero h =new Hero(); h.setName1("teemo"); System.out.println(h.name); h.setName2("garen"); System.out.println(h.name); h.setName3("死歌"); System.out.println(h.name); } }
3、通過this調用其他的構造方法:
如果要在一個構造方法中,調用另一個構造方法,可以使用this()
public class Hero { String name; //姓名 float hp; //血量 float armor; //護甲 int moveSpeed; //移動速度 //帶一個參數的構造方法 public Hero(String name){ System.out.println("一個參數的構造方法"); this.name = name; } //帶兩個參數的構造方法 public Hero(String name,float hp){ this(name); System.out.println("兩個參數的構造方法"); this.hp = hp; } public static void main(String[] args) { Hero teemo = new Hero("提莫",383); System.out.println(teemo.name); } }
二、變數有兩種類型:基本類型和類類型;參數也是變數,所以傳參分為基本類型傳參和類類型傳參:
1、基本類型傳參:
在方法內,無法修改方法外的基本類型參數
public class Hero { String name; //姓名 float hp; //血量 float armor; //護甲 int moveSpeed; //移動速度 public Hero(){} //回血 public void huixue(int xp){ hp = hp + xp; //回血完畢後,血瓶=0 xp=0; } public Hero(String name,float hp){ this.name = name; this.hp = hp; } public static void main(String[] args) { Hero teemo = new Hero("提莫",383); //血瓶,其值是100 int xueping = 100; //提莫通過這個血瓶回血 teemo.huixue(xueping); System.out.println(xueping); } }
2、引用與=
如果一個變數是基本類型,比如 int hp = 50;我們就直接管hp叫變數,=表示賦值的意思。
如果一個變數是類類型,比如 Hero h = new Hero();我們就管h叫做引用。
=不再是賦值的意思,=表示指向的意思:
比如 Hero h = new Hero();這句話的意思是:引用h,指向一個Hero對象。
3、類類型傳參:
類類型又叫引用
第24行的引用 teemo與 第17行的引用hero,是不同的引用
通過調用garen.attack(teemo, 100); 使得這兩個引用都指向了同一個對象
所以在第18行hero.hp = hero.hp - damage; 就使得該對象的hp值,發生了變化
因此第25行,列印該對象的Hp值就是變化後的值
public class Hero { String name; // 姓名 float hp; // 血量 float armor; // 護甲 int moveSpeed; // 移動速度 public Hero(String name, float hp) { this.name = name; this.hp = hp;
} // 攻擊一個英雄,並讓他掉damage點血 public void attack(Hero hero, int damage) { hero.hp = hero.hp - damage; } public static void main(String[] args) { Hero teemo = new Hero("提莫", 383); Hero garen = new Hero("蓋倫", 616); garen.attack(teemo, 100); System.out.println(teemo.hp); } }