java什麼時候用this
A. java中this的用法
1. this指當前對象。
當在一個類中要明確指出使用對象變數或函數時加上this引用。如下面例子中:
public class Hello {
String s = "Hello";
public Hello(String s){
System.out.println("s = " + s);
System.out.println("1 -> this.s = " + this.s);
this.s = s;
System.out.println("2 -> this.s = " + this.s);
}
public static void main(String[] args) {
Hello x=new Hello("HelloWorld!");
}
}
運行結果:
s = HelloWorld!
1 -> this.s = Hello
2 -> this.s = HelloWorld!
在這個例子中,構造函數Hello中,參數s與類Hello的變數s同名,這時直接對s進行操作則是對參數s進行操作。對類Hello的成員變數s進行操作就應該用this進行引用。運行結果的第一行就是直接對構造函數中傳遞過來的參數s進行列印結果;
第二行是對成員變數s的列印;第三行是先對成員變數s賦傳過來的參數s值後再列印,所以結果是HelloWorld!
2. this作為參數傳遞
當你要把自己作為參數傳遞給別的對象時如:
public class A {
public A() {
new B(this).print();
}
public void print() {
System.out.println("Hello from A!");
}
}
public class B {
A a;
public B(A a) {
this.a = a;
}
public void print() {
a.print();
System.out.println("Hello from B!");
}
}
運行結果:
Hello from A!
Hello from B!
在這個例子中,對象A的構造函數中,new
B(this)把對象A作為參數傳遞給了對象B的構造函數。
B. Java中怎麼使用this關鍵字什麼時候可以使用
請看下面的這段文字,你看懂了這個文章,也就理解this了。。。。這是我空間收藏的文章,拜讀之後,受益匪淺。。。。=======================================================在Java中,this通常指當前對象,super則指父類的。當你想要引用當前對象的某種東西,比如當前對象的某個方法,或當前對象的某個成員,你便可以利用this來實現這個目的,當然,this的另一個用途是調用當前對象的另一個構造函數,這些馬上就要討論。如果你想引用父類的某種東西,則非super莫屬。由於this與super有如此相似的一些特性和與生俱來的某種關系,所以我們在這一塊兒來討論,希望能幫助你區分和掌握它們兩個。
在一般方法中
最普遍的情況就是,在你的方法中的某個形參名與當前對象的某個成員有相同的名字,這時為了不至於混淆,你便需要明確使用this關鍵字來指明你要使用某個成員,使用方法是「this.成員名」,而不帶this的那個便是形參。另外,還可以用「this.方法名」來引用當前對象的某個方法,但這時this就不是必須的了,你可以直接用方法名來訪問那個方法,編譯器會知道你要調用的是那一個。下面的代碼演示了上面的用法:
public class DemoThis{
private String name;
private int age;
DemoThis(String name,int age){
setName(name); //你可以加上this來調用方法,像這樣:this.setName(name);但這並不是必須的
setAge(age);
this.print();
}
public void setName(String name){
this.name=name;//此處必須指明你要引用成員變數
}
public void setAge(int age){
this.age=age;
}
public void print(){
System.out.println("Name="+name+" Age="+age);//在此行中並不需要用this,因為沒有會導致混淆的東西
}
public static void main(String[] args){
DemoThis dt=new DemoThis("Kevin","22");
}
}
這段代碼很簡單,不用解釋你也應該能看明白。在構造函數中你看到用this.print(),你完全可以用print()來代替它,兩者效果一樣。下面我們修改這個程序,來演示super的用法。
class Person{
public int c;
private String name;
private int age;
protected void setName(String name){
this.name=name;
}
protected void setAge(int age){
this.age=age;
}
protected void print(){
System.out.println("Name="+name+" Age="+age);
}
}
public class DemoSuper extends Person{
public void print(){
System.out.println("DemoSuper:");
super.print();
}
public static void main(String[] args){
DemoSuper ds=new DemoSuper();
ds.setName("kevin");
ds.setAge(22);
ds.print();
}
}
在DemoSuper中,重新定義的print方法覆寫了父類的print方法,它首先做一些自己的事情,然後調用父類的那個被覆寫了的方法。輸出結果說明了這一點:
DemoSuper:
Name=kevin Age=22
這樣的使用方法是比較常用的。另外如果父類的成員可以被子類訪問,那你可以像使用this一樣使用它,用「super.父類中的成員名」的方式,但常常你並不是這樣來訪問父類中的成員名的。
在構造函數中
構造函數是一種特殊的方法,在對象初始化的時候自動調用。在構造函數中,this和super也有上面說的種種使用方式,並且它還有特殊的地方,請看下面的例子:
class Person{
public static void prt(String s){
System.out.println(s);
}
Person(){
prt("A Person.");
}
Person(String name){
prt("A person name is:"+name);
}
}
public class Chinese extends Person{
Chinese(){
super(); //調用父類構造函數(1)
prt("A chinese.");//(4)
}
Chinese(String name){
super(name);//調用父類具有相同形參的構造函數(2)
prt("his name is:"+name);
}
Chinese(String name,int age){
this(name);//調用當前具有相同形參的構造函數(3)
prt("his age is:"+age);
}
public static void main(String[] args){
Chinese cn=new Chinese();
cn=new Chinese("kevin");
cn=new Chinese("kevin",22);
}
}
在這段程序中,this和super不再是像以前那樣用「.」連接一個方法或成員,而是直接在其後跟上適當的參數,因此它的意義也就有了變化。super後加參數的是用來調用父類中具有相同形式的構造函數,如1和2處。this後加參數則調用的是當前具有相同參數的構造函數,如3處。當然,在Chinese的各個重載構造函數中,this和super在一般方法中的各種用法也仍可使用,比如4處,你可以將它替換為「this.prt」(因為它繼承了父類中的那個方法)或者是「super.prt」(因為它是父類中的方法且可被子類訪問),它照樣可以正確運行。但這樣似乎就有點畫蛇添足的味道了。
最後,寫了這么多,如果你能對「this通常指代當前對象,super通常指代父類」這句話牢記在心,那麼本篇便達到了目的,其它的你自會在以後的編程實踐當中慢慢體會、掌握。另外關於本篇中提到的繼承,請參閱相關Java教程。
C. java 的this的運用
在java中,this關鍵字有很多種用法。 在java中,這是一個引用當前對象的引用變數。
java this關鍵字的用法如下:
this關鍵字可用來引用當前類的實例變數。
this關鍵字可用於調用當前類方法(隱式)。
this()可以用來調用當前類的構造函數。
this關鍵字可作為調用方法中的參數傳遞。
this關鍵字可作為參數在構造函數調用中傳遞。
this關鍵字可用於從方法返回當前類的實例。
建議:如果你是java初學者,只學習 this 關鍵字的前三個用法就可以了。
更詳細可以查詢一些教程,例如:https://www.yii.com/java/this-keyword.html
D. java 中this具體什麼時候能用,用了又代表什麼
this用在類內部,表示類實例本身。
this 關鍵字是類內部當中對自己的一個引用,可以方便類中方法訪問自己的屬性。
舉例:
publicclassA{
privateinta;//定義一個成員變數a
publicvoidshow(inta){
this.a=2;//通過this表示訪問的是類A中的屬性a
}
}
E. Java中怎麼使用this關鍵字什麼時候可以使用
當你想要引用當前對象的某種東西,比如當前對象的某個方法,或當前對象的某個成員,你便可以利用this來實現這個目的。
比如說吃飯這個方法它是由上帝來定義的,世界上所有的人來執行。吃飯這個行為發生的時候,主體就是在吃飯的這個人,也就是要有人執行吃飯這個行為。 有時候我們需要在一個行為(方法)里,能明確知道這個行為是誰來執行的,確切的說就是我要知道誰在吃飯。
function eatSomthing() { this.eat }
在編程語言裡面每一個定義的方法里,都會有一個this關鍵字,這個this關鍵不是由在那兒定義來決定的,而是由誰來執行的決定的。這是判斷this關鍵。
his表示的對像,是這個方法活動的"上下文"。所謂的"上下文",也就是表示當前的這些代碼的活動范圍,當前的活動(代碼的執行)在那個對像上的發生的意思。
吃飯這個活動,是在張三這個對像上發生的,則張三是吃飯的下下文。在body里去查找的div元素,則body是這個查找活動的上下文。那這個this,就是這個方法運行活動的范圍了。
方法里this當前這個方法運行的上下文,但上下文不僅限於是this(就是整體與個體的區別)。
F. java中this的用法
java中this有兩種用法:
1、代表當前類
public class Dog{
private String name;
private float age;
public setName(String name){
this.name = name;
}
.......
}
這里的this就代表的當前的這個Dog類。this.name可以理解為dog.name,只是理解,不是等於。
2、在構造函數中的使用
public class Dog{
private String name;
private int age;
//有一個參數的構造函數
public Dog(String name){
this.name = name;
}
public Dog(String name,int age){
this.name = name;
this.age = age;
}
//這個無參構造方法里調用的有兩個參數的構造方法,這個也就是this的第二種用法了!
public Dog(){
this("nihao",20);
}
}
G. java中「this」的用法是什麼
一、指自己所在的對象。
比如在一個方法中,調用其他對象的變數或方法時,可以使用那個對象的對象名,比如aa.abc();
而調用自己所在對象的方法或變數時,不知道別人給起了什麼名,所以直接用this.abc()就可以了。
二、看一個小例子中「this」的用法!
/**
* @author feng-neusoft
*
* 本示例為了說明this的三種用法!
*/
package test;
public class ThisTest {
private int i=0;
//第一個構造器:有一個int型形參
ThisTest(int i){
this.i=i+1;//此時this表示引用成員變數i,而非函數參數i
System.out.println("Int constructor i——this.i: "+i+"——"+this.i);
System.out.println("i-1:"+(i-1)+"this.i+1:"+(this.i+1));
//從兩個輸出結果充分證明了i和this.i是不一樣的!
}
// 第二個構造器:有一個String型形參
ThisTest(String s){
System.out.println("String constructor: "+s);
}
// 第三個構造器:有一個int型形參和一個String型形參
ThisTest(int i,String s){
this(s);//this調用第二個構造器
//this(i);
/*此處不能用,因為其他任何方法都不能調用構造器,只有構造方法能調用他。
但是必須注意:就算是構造方法調用構造器,也必須為於其第一行,構造方法也只能調
用一個且僅一次構造器!*/
this.i=i++;//this以引用該類的成員變數
System.out.println("Int constructor: "+i+"/n"+"String constructor: "+s);
}
public ThisTest increment(){
this.i++;
return this;//返回的是當前的對象,該對象屬於(ThisTest)
}
public static void main(String[] args){
ThisTest tt0=new ThisTest(10);
ThisTest tt1=new ThisTest("ok");
ThisTest tt2=new ThisTest(20,"ok again!");
System.out.println(tt0.increment().increment().increment().i);
//tt0.increment()返回一個在tt0基礎上i++的ThisTest對象,
//接著又返回在上面返回的對象基礎上i++的ThisTest對象!
}
}
運行結果:
Int constructor i——this.i: 10——11
String constructor: ok
String constructor: ok again!
Int constructor: 21
String constructor: ok again!
14
細節問題注釋已經寫的比較清楚了,總結一下,其實this主要要三種用法:
1、表示對當前對象的引用!
2、表示用類的成員變數,而非函數參數,注意在函數參數和成員變數同名是進行區分!其實這是第一種用法的特例,比較常用,所以那出來強調一下。
3、用於在構造方法中引用滿足指定參數類型的構造器(其實也就是構造方法)。但是這里必須非常注意:只能引用一個構造方法且必須位於開始!
還有就是注意:this不能用在static方法中!所以甚至有人給static方法的定義就是:沒有this的方法!雖然誇張,但是卻充分說明this不能在static方法中使用!
H. 在java中this的用途
this表示指向當前對象的引用:一般用在出現局部變數和實例變數同名的情況,對變數前加this表示這個是實例變數,this目的就是為了區分局部變數和實例變數同名同名情況。例如:
public class Test{
private String name;//類實例變數
public void setName(String name)
{
this.name = name;
//這里出現了 setName方法的局部變數name與Test類的實例變數name同名的情況,那麼this.name即代表是類的實例變數name(即這個name是調用這個setName()方法的當前對象的實例變數name);
所以在這個方法中就用this區分了局部變數name和類實例變數name
}
}
I. 在java中什麼時候用this,什麼時候用super
定義類的時候對本類對象和方法的引用this
this.^^^表示的是引用當前類的對象和方法,其中^^^表示當前類的對象名和方法名
而super是引用父類的對象和方法
super.^^^表示的是引用當前類的父類的對象和方法,其中^^^表示當前類的父類的對象名和方法名
J. java中this的作用及用法在什麼情況下需要用this
使用this調用本類中的屬性
現在觀察以下代碼,看會有那些問題:
public void setName(String name){
name = name ;
}
這裡面的兩個name都是setName方法中的name參數。
此時,特別希望可以通過一個指定的標識明確的表示要把傳入的name參數的值給類中的屬性,所以此時就需要使用this關鍵字,使用this.name就表示類中的屬性。
class Person{
private String name ;
private int age ;
public Person(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void print(){
System.out.println("姓名:"+this.name+",年齡:"+this.age) ;
}
};
public class Demo35{
public static void main(String args[]){
Person p1 = new Person("張三",30) ;
p1.print() ;
}
};
使用this還可以從一個構造方法中調用其他構造方法。
例如:有以下一個要求,一個類中存在了三個構造方法,但是要求,不管怎麼調用,最終都要求可以在對象實例化的時候列印一個「新的對象產生了」的提示。
class Person{
private String name ;
private int age ;
public Person(){
System.out.println("新的對象產生了。。。") ;
}
public Person(String name){
System.out.println("新的對象產生了。。。") ;
this.setName(name) ;
}
public Person(String name,int age){
System.out.println("新的對象產生了。。。") ;
this.setName(name) ;
this.setAge(age) ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void print(){
System.out.println("姓名:"+this.name+",年齡:"+this.age) ;
}
};
以上代碼雖然可以實現功能,但是同樣的代碼出現了三次,而且後面的兩次出現純屬多餘吧。用this()的形式可以調用類中的無參構造方法。
class Person{
private String name ;
private int age ;
public Person(){
System.out.println("新的對象產生了。。。") ;
}
public Person(String name){
// 最終都是調用無參構造方法
this() ;
this.setName(name) ;
}
public Person(String name,int age){
this(name) ;
this.setAge(age) ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void print(){
System.out.println("姓名:"+this.name+",年齡:"+this.age) ;
}
};
public class Demo36{
public static void main(String args[]){
Person p1 = new Person("張三",30) ;
p1.print() ;
}
};
注意點1:
如果使用了this調用其他構造方法,則此語句,必須寫在構造方法的首行。
public void fun(){
// 發現在調用fun方法的時候,必須先設置name的值
this("zhangsan") ;
}
public Person(String name,int age){
this.setAge(age) ;
this(name) ; //--> 必須放在首行
}
注意點2:
使用this可以調用本類中的其他構造方法,但是至少留一個構造方法,作為程序的出口。
public Person(){
this("a",10) ;
System.out.println("新的對象產生了。。。") ;
}
public Person(String name){
// 最終都是調用無參構造方法
this() ;
this.setName(name) ;
}
public Person(String name,int age){
this(name) ; //--> 必須放在首行
this.setAge(age) ;
}
this最重要的特性 —— 表示當前對象
當前對象在程序中用以下形式體現:
· 當前操作此方法的對象,就稱為當前對象。
class Demo{
public void print(){
System.out.println(this) ;
}
};
public class Demo38{
public static void main(String args[]){
Demo d1 = new Demo() ;
System.out.println(d1) ;
d1.print() ;
System.out.println("---------------------") ;
Demo d2 = new Demo() ;
System.out.println(d2) ;
d2.print() ;
}
};
回顧:
之前講解的兩個對象比較的程序。
// 在類的內部增加一個比較的方法
public boolean compare(Person p){
Person p1 = this ;
Person p2 = p ;
if(p1.name.equals(p2.name)&&p1.age==p2.age){
return true ;
}else{
return false ;
}
}
分析程序的運行過程:
class A{
private B b = null ;
public A(){
this.b = new B(this) ;
this.b.fun() ;
}
public void hello(){
System.out.println("Hello World!!!") ;
}
};
class B{
private A a = null ;
public B(A a){
this.a = a ;
}
public void fun(){
this.a.hello() ;
}
};
public class OODemo40{
public static void main(String args[]){
A aa = new A() ;
}
};