java中的this作用域
1. java問題:為什麼方法中不能用this調用構造方法
首先你要明白this的作用域,只能在裡面用不能再外面用,構造方法你可以這么寫this.age=age;其他不可以的,你想用this調構造方法。。。。。。構造方法是在new對象的時候自動運行的,你可以把代碼發一下我告訴你哪裡有問題
2. java中的this關鍵字到底指什麼
如果有兩個同類型的對象,分別叫作a和b,那麼您也許不知道如何為這兩個對象同時調用一個f()方法:
class Banana { void f(int i) { /* ... */ } }
Banana a = new Banana(), b = new Banana();
a.f(1);
b.f(2);
若只有一個名叫f()的方法,它怎樣才能知道自己是為a還是為b調用的呢?
為了能用簡便的、面向對象的語法來書寫代碼——亦即「將消息發給對象」,編譯器為我們完成了一些幕後工作。其中的秘密就是第一個自變數傳遞給方法f(),而且那個自變數是准備操作的那個對象的句柄。所以前述的兩個方法調用就變成了下面這樣的形式:
Banana.f(a,1);
Banana.f(b,2);
這是內部的表達形式,我們並不能這樣書寫表達式,並試圖讓編譯器接受它。但是,通過它可理解幕後到底發生了什麼事情。
假定我們在一個方法的內部,並希望獲得當前對象的句柄。由於那個句柄是由編譯器「秘密」傳遞的,所以沒有標識符可用。然而,針對這一目的有個專用的關鍵字:this。this關鍵字(注意只能在方法內部使用)可為已調用了其方法的那個對象生成相應的句柄。可象對待其他任何對象句柄一樣對待這個句柄。但要注意,假若准備從自己某個類的另一個方法內部調用一個類方法,就不必使用this。只需簡單地調用那個方法即可。當前的this句柄會自動應用於其他方法。所以我們能使用下面這樣的代碼:
class Apricot {
void pick() { /* ... */ }
void pit() { pick(); /* ... */ }
}
在pit()內部,我們可以說this.pick(),但事實上無此必要。編譯器能幫我們自動完成。this關鍵字只能用於那些特殊的類——需明確使用當前對象的句柄。例如,假若您希望將句柄返回給當前對象,那麼它經常在return語句中使用。
由於increment()通過this關鍵字返回當前對象的句柄,所以可以方便地對同一個對象執行多項操作。
1. 在構建器里調用構建器
若為一個類寫了多個構建器,那麼經常都需要在一個構建器里調用另一個構建器,以避免寫重復的代碼。可用this關鍵字做到這一點。
通常,當我們說this的時候,都是指「這個對象」或者「當前對象」。而且它本身會產生當前對象的一個句柄。在一個構建器中,若為其賦予一個自變數列表,那麼this關鍵字會具有不同的含義:它會對與那個自變數列表相符的構建器進行明確的調用。這樣一來,我們就可通過一條直接的途徑來調用其他構建器。如下所示:
其中,構建器Flower(String s,int petals)向我們揭示出這樣一個問題:盡管可用this調用一個構建器,但不可調用兩個。除此以外,構建器調用必須是我們做的第一件事情,否則會收到編譯程序的報錯信息。
這個例子也向大家展示了this的另一項用途。由於自變數s的名字以及成員數據s的名字是相同的,所以會出現混淆。為解決這個問題,可用this.s來引用成員數據。經常都會在Java代碼里看到這種形式的應用,本書的大量地方也採用了這種做法。
在print()中,我們發現編譯器不讓我們從除了一個構建器之外的其他任何方法內部調用一個構建器。
3. JAVA中的This.kind = kind;解釋
首先你得明白類是不能直接工作的,在Java中一切都是面向對象的,所以你要使用類就必須得先生成該類的對象。
舉個例子,你寫的Cube就是個類,而類本身只是個靜態的東西,必須用它生成一個對象後才能實實在在的存在於Java虛擬機中,這樣對象中的每個成員變數也才是實實在在 存在的。
而this就是指當前你所訪問的這個對象,那麼this.height就是指當前這個對象的成員變數height,加this是用以區別於同名參數變數height,其實就是通過變數作用域來區別相同名字的變數。
在這里,如果參數變數名不叫height,而叫height0,則可以直接寫成
height=height0;就可以了,不會出錯。但是當編譯該類時,編譯器還是會自動在height前加this.的,因為height的作用域就是在Cube的一個對象中。
4. java中this的作用有哪些
首先,this指向方法的隱式參數,即調用此變數或方法的對象(就是你說的當前對象)。
看下面這個例子:
class test{
private String a;
void a(String a){
this.a =a;
}
public static void main(String[] args){
test t1 = new test();
test t2 = new test();
t1.a("a");//調用a這個方法的時候,this指向t1這個對象
t2.a("a");//調用a這個方法的時候,this指向t2這個對象
}
}
第二,如果this(...)出現在構造器或其它方法的第一句,那麼說明這個構造器將調用同一類中的其他構造器或方法。
比如:
public a(int x,int y)
{
...
}
public a(int x,int y,String z)
{
this(x,y);//調用a(int x,int y)
z=...
}
5. java中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() ;
}
};
6. JAVA關鍵字this是干什麼的
我想這個 this 在考試中不會很重要吧
僅用於 C/C++、C# 和 Visual Basic。
「This」和「Me」窗口相同;只是名稱不同,這對程序員有幫助作用。這兩個窗口都顯示三個信息列:
名稱
在 C/C++ 或 C# 中顯示 this 指針指向的對象,在 Visual Basic 中顯示 me 對象。樹控制項 (Tree Control) 允許展開對象以查看元素。展開對象後,每個元素的名稱顯示在該列中。
值
顯示每個變數包含的值。默認情況下,整數變數以十進制格式表示。可以在「選項」對話框 ->「調試」->「常規」中將表示形式更改為十六進制,也可以通過右擊「自動窗口」並從快捷菜單中選擇「十六進制顯示」選項來進行此操作。
類型
標識「名稱」列中列出的每一變數的數據類型。
7. java中this問題
this指前象
this.a=a;
this.b=b;
其實this.a指class C類私變數a(private A a;)
display(A a,B b)a形式參數保存傳入參數引用
兩者其實掉this.a=athis.b=b
使用象C程與外部象 ab沒聯系
class C加入測試
public class C {
private A a;
privata B b;
public void display(A a,B b)
{
this.a=a;
this.b=b;
}
public void show()
{
System.out.println(a);
System.out.println(b);
}
}
其實想真弄明白需要弄明白幾:
1、this作用
2、參數何傳遞
3、變數作用域
幾容我偷懶解釋自找相關資料看看