第三章户誓、面向?qū)ο?this關(guān)鍵字

1、this關(guān)鍵字

package this_keyword;

{

/**

* 關(guān)于java語言當(dāng)中的this關(guān)鍵字:

* 1夷家、this是一個關(guān)鍵字蒸其,翻譯為:這個

* 2、this是一個引用库快,this是一個變量摸袁,this變量中保存了內(nèi)存地址指向自身,this存儲在jvm堆內(nèi)存java對象內(nèi)部

* 3义屏、創(chuàng)建100個java對象靠汁,每一個對象都有this,也就是說有100個不同的this

* 4闽铐、從內(nèi)存圖中分析蝶怔,每個對象的this就是指向這個對象的引用

* 5、當(dāng)使用c1訪問對象時兄墅,整個過程中出現(xiàn)的this就是c1踢星,當(dāng)時使用c2訪問對象時,這時出現(xiàn)的this就是c2隙咸。

*

*/

public class this_keyword {

public static void main(String[] args)

{

//創(chuàng)建Customer對象

Customer c1=new Customer();

c1.name="zhangsan";

//再創(chuàng)建Customer對象

Customer c2=new Customer();

c2.name="lisi";

c2.shopping();//此時顯示lisi在購物

//調(diào)用dosome方法(修飾符列表上有static)

//采用“類名.”沐悦,的方式訪問成洗,

Customer.doome();

Customer.doOther();

}

}

//this存在于堆內(nèi)存中的java對象內(nèi)部,是一塊內(nèi)存空間藏否,其保存著自身的內(nèi)存地址泌枪。

package this_keyword;

public class Customer {

String? name;//實例變量:必須采用引用.的方式訪問,所以訪問實例變量必須先創(chuàng)建對象秕岛,才能通過引用訪問這個變量。成員變量分為實例變量和靜態(tài)變量误证,沒有static修飾的變量就是實例變量使用引用.的方式調(diào)用继薛,有static修飾的就是靜態(tài)變量使用類名.的方式調(diào)用。

public Customer()

{

}

//帶static關(guān)鍵字的一個方法,實質(zhì)上帶static的類時一個專用方法愈捅,里面的屬性都是一樣的遏考,不需要變化,因此只需要類名.的方式引用蓝谨,

//而不帶static的類時通用類灌具,這種類隨著對象的不同而變化需要用引用名.方法名。

//顧客的購物行為

//每一個顧客購物的最終結(jié)果是不一樣的

//所以購物這個行為是屬于對象級別的行為

//由于每一個對象在執(zhí)行購物這個動作時最終結(jié)果不同譬巫,所以購物這個動作必須由“對象”的參與咖楣。

//重點:沒有static關(guān)鍵字的方法被稱為“實例方法”

//重點:沒有static關(guān)鍵字的變量被稱為“實例變量”

//當(dāng)一個行為/動作執(zhí)行的過程中是需要對象參與的,那么這個方法一定定義為“實例方法”芦昔,不要帶static關(guān)鍵字

//以下方法定義為實例方法诱贿,因為每一個顧客在真正購物的時候,最終的結(jié)果是不同的咕缎,所以在這個動作完成時必須由對象的參與珠十。

//this可以出現(xiàn)在“實例方法當(dāng)中”,this指向當(dāng)前正在執(zhí)行這個動作的對象凭豪。(this代表當(dāng)前對象)

public void shopping()

{

//因為name是一個實例變量焙蹭,

//所以這個name訪問的時候一定訪問的是當(dāng)前對象的name,

//this可以省略不寫,也就是System.out.println(name+"在購物嫂伞!")孔厉;

System.out.println(this.name+"在購物!")末早;

//這樣就可以增加復(fù)用性

}

public static void doSome()

{

System.out.println(name);//報錯烟馅,這個執(zhí)行過程沒有當(dāng)前對象,因為帶有static的方法是通過類名的方式訪問的

//或者說這個“上下文”當(dāng)中沒有當(dāng)前對象然磷,自然也不存在this(this代表的是當(dāng)前正在執(zhí)行這個動作的對象)

//name是實例變量郑趁,要是用引用.的方式訪問,因此必須要用this.name姿搜,但是沒有對象寡润,因此報錯捆憎。

//重點:this不能使用帶有static的方法當(dāng)中

}

//修改之后可以運行的東西

public static void doOther()

{

//假設(shè)想訪問name這個實例變量的話應(yīng)該怎么做

//System.out.println(name);編譯報錯

//可以采用以下方案梭纹,但是以下方案躲惰,絕對不是訪問當(dāng)前對象的name

//創(chuàng)建對象

Customer c=new customer();

System.out.println(c.name)//這里訪問的name是c引用指向?qū)ο蟮膎ame变抽。但是這個對象并不是當(dāng)前對象础拨,因此想要調(diào)用只能用類名.的方式調(diào)用,而這種方式绍载,只能一次性對一個對象進行操作诡宗。

}

}

public class thisTest

{

public static void main(String[] args)

{

//調(diào)用dosome方法

thisTest.dosome();

dosome();

//調(diào)用doother對象

//編譯錯誤

//thisTest.doother();實例方法必須先創(chuàng)建對象,通過引用.的方式訪問

//doother是實例方法

//實例方法調(diào)用必須有對象的存在

//以下代碼表示含義:調(diào)用當(dāng)前對象的doother方法

//但是由于main方法中的this击儡,所以以下方法不能調(diào)用

//doother();編輯錯誤

//this.doother()編譯錯誤

thisTest tt=new thisTest()塔沃;

tt.doother();

}

public static void dosome()

{

System.out.println("do some!")

}

public? void doother()

{

System.out.println("do other!")

}

public? void run()

{

System.out.println("run execute!")

doother();//完整寫法是this.doother

//可以通過因為實例方法一定是存在對象才能調(diào)用實例方法阳谍,也就是說這里一定有this蛀柴。

//以上方法是調(diào)用當(dāng)前對象的doother()方法

}

}

最終結(jié)論:在帶有static的方法中無法直接訪問實例變量和實例方法,而是必須創(chuàng)建對象去通過引用.的方式引用矫夯。

不帶static的方法中可以直接訪問實例變量和實例方法鸽疾,這是省略的寫法,不省略的寫法是this.實力變量/實例方法茧痒。

this什么時候不能拾谷汀?

用來區(qū)分局部變量和實例變量的時候

publicclass User

{

private int id;//實例變量

private String name;//實例變量

//構(gòu)造函數(shù)

//setter and getter

public void setid(int a)

{

id=a;

}

//以下程序的id和實例變量id無關(guān)旺订,不能采用這樣的方式

//public void setid(int id)

//{

//id=id;//報錯弄企,此時由于java采取就近原則因此,兩個id都成為了setid函數(shù)的局部變量因此区拳,必須使用this進行區(qū)分拘领。

//}

public void setid(int id)

{

this.id=id;//正確

}

}

public class data

{

private int year;

private int month;

private int day;

//構(gòu)造函數(shù)

public data(int year, int month, int day) {

super();

this.year = year;

this.month = month;

this.day = day;

//需求:當(dāng)程序員調(diào)用以下無參數(shù)構(gòu)造方法的時候,默認(rèn)創(chuàng)建的日期是“1970-1-1”

public data() {

this.year=1970

this.year=1;

this.day=1;

}

//setter 和 getter

public int getYear() {

return year;

}

}

public void setYear(int year) {

this.year = year;

}

public int getMonth() {

return month;

}

public void setMonth(int month) {

this.month = month;

}

public int getDay() {

return day;

}

public void setDay(int day) {

this.day = day;

}

//對外提供一個方法可以將日期打印輸出到控制臺

public void print()

{

System.out.println(this.years+"年"+this.month+"月"+this.day+"日");

}

package this_keyword;

public class data_Test {

public.static.void main(String[]args)

//創(chuàng)建日期對象

data time1=new data();

data time2=new data(2008,8,8);

time1.print();

time1.print();

}

//代碼可運行但是代碼重復(fù)了

//下面的代碼利用率高

public class data

{

private int year;

private int month;

private int day;

//構(gòu)造函數(shù)

public data(int year, int month, int day) {

super();

this.year = year;

this.month = month;

this.day = day;

public data() {

//需求:當(dāng)程序員調(diào)用以下無參數(shù)構(gòu)造方法的時候樱调,默認(rèn)創(chuàng)建的日期是“1970-1-1”

//以上代碼可以通過調(diào)用另一個構(gòu)造方法來完成

//但前提是不能創(chuàng)建新的對象约素,以下代碼表示創(chuàng)建了一個全新的對象。

//new data(1970,1,1)

//需要采用以下的語法來完成構(gòu)造方法的調(diào)用

//這種方式不會創(chuàng)建新的java對象笆凌,但同時又可以達到調(diào)用其他的構(gòu)造方法圣猎。

? ? this(1970,1,1);//非常的重要

//代替以下注釋的部分功能

// public data() {

// this.year=1970

// this.year=1;

// this.day=1;

// } //

}

//setter 和 getter

public int getYear() {

return year;

}

}

public void setYear(int year) {

this.year = year;

}

public int getMonth() {

return month;

}

public void setMonth(int month) {

this.month = month;

}

public int getDay() {

return day;

}

public void setDay(int day) {

this.day = day;

}

//對外提供一個方法可以將日期打印輸出到控制臺

public void print()

{

System.out.println(this.years+"年"+this.month+"月"+this.day+"日");

}

this可以使用在哪里

1、可以使用在實例函數(shù)中乞而,代表當(dāng)前對象【語法格式:this.】

2送悔、可以使用在構(gòu)造方法當(dāng)中,通過當(dāng)前的構(gòu)造方法調(diào)用其他的構(gòu)造方法【語法格式:this(實參);】

重點【記憶】:this()這種語法只能出現(xiàn)在構(gòu)造方法的第一行欠啤。

package this_keyword;

public class data_Test {

public.static.void main(String[]args)

//創(chuàng)建日期對象

data time1=new data();

data time2=new data(2008,8,8);

time1.print();

time1.print();

總結(jié):

public class Test

{ int i=10;

public static void main(String[]args)

{

//要求在這里編寫程序調(diào)用method1

//使用完整方式調(diào)用

Test.method1();//也可以使用引用.的方式調(diào)用 Test b=new Test();

? // b.method1();

? //但是這種方式并不是合法的荚藻,只不過java包容了它

? //不鼓勵用這種方式訪問帶static的方法。

//使用省略方式調(diào)用

method1();//同一類體中調(diào)用有static方法洁段,直接用方法名应狱。

//要求在這里編寫程序調(diào)用method2

//使用完整方式調(diào)用

Test b=new Test();

b.method2();

//使用省略方式調(diào)用

//無法用省略方法

}

public static void method1()

{

//調(diào)用dosome//帶static的函數(shù)調(diào)用帶static的函數(shù)

//使用完整方式調(diào)用

Test.dosome();

//使用省略方式調(diào)用

dosome();

//調(diào)用doOther//帶static的函數(shù)調(diào)用不帶static的函數(shù)

//使用完整方式調(diào)用

Test a=new Test();

a.doOther();

//使用省略方式調(diào)用

//沒有省略方式

//訪問//帶static的函數(shù)訪問實例變量

//使用完整方式調(diào)用

System.out.println(a.i)

//使用省略方式調(diào)用

//不能直接訪問i,因為是實力變量不能直接訪問必須通過引用訪問祠丝。

public? void method2()

{

//調(diào)用dosome//不帶static的函數(shù)調(diào)用帶static的函數(shù)

//使用完整方式調(diào)用

Test.dosome();

//使用省略方式調(diào)用

dosome();

//調(diào)用doOther//不帶static的函數(shù)調(diào)用不帶static的函數(shù)

//使用完整方式調(diào)用

this.doOther();

//使用省略方式調(diào)用

doother();

//訪問帶static的函數(shù)訪問實例變量

//使用完整方式調(diào)用

System.out.println(this.i)

//使用省略方式調(diào)用

System.out.println(i)

}

//沒有statid變量

int i=10疾呻;

//帶有static的變量

public static void dosome()

System.out.println("do some!");

}

//沒有static的方法

public void doOther()

{

System.out.println("do other!");

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市写半,隨后出現(xiàn)的幾起案子罐韩,更是在濱河造成了極大的恐慌,老刑警劉巖污朽,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異龙考,居然都是意外死亡蟆肆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門晦款,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炎功,“玉大人,你說我怎么就攤上這事缓溅∩咚穑” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵坛怪,是天一觀的道長淤齐。 經(jīng)常有香客問我,道長袜匿,這世上最難降的妖魔是什么更啄? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮居灯,結(jié)果婚禮上祭务,老公的妹妹穿的比我還像新娘。我一直安慰自己怪嫌,他們只是感情好义锥,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岩灭,像睡著了一般拌倍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上川背,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天贰拿,我揣著相機與錄音蛤袒,去河邊找鬼。 笑死膨更,一個胖子當(dāng)著我的面吹牛妙真,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荚守,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼珍德,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矗漾?” 一聲冷哼從身側(cè)響起锈候,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敞贡,沒想到半個月后泵琳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡誊役,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年获列,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛔垢。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡击孩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹏漆,到底是詐尸還是另有隱情巩梢,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布艺玲,位于F島的核電站括蝠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饭聚。R本人自食惡果不足惜又跛,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望若治。 院中可真熱鬧慨蓝,春花似錦、人聲如沸端幼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婆跑。三九已至此熬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犀忱。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工募谎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阴汇。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓数冬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搀庶。 傳聞我的和親對象是個殘疾皇子拐纱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容