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!");
}
}