2015-03-19 154 views
0

當試圖通過保持參數名稱爲實例變量名稱從構造函數初始化實例變量時。我正在接收輸出爲0.而不是傳遞的值。請解釋一下?java中構造函數的混淆

public class Circle 
    { 
     int x; 
     int y; 
     int radius; 

    //Constructor with same parameters of field name 

    public Circle(int x,int y,int radius) 
    { 
     x=x; 
     y=y; 
     radius=radius; 
    } 
    //Overridden to String() 

    public String toString() 
    { 
     return "center("+x+" , "+y+") and radius ("+radius+")"; 
    } 

    //Main method 

    public static void main(String[] args) 
    { 
     System.out.println(new Circle(5,5,50)); 
    } 


    } 

當我將構造函數5,5,50的值傳遞給構造函數的參數。它們不應該顯示相同的值。

System.out.println(new Circle(5,5,50)); //值發送到構造器

公開的社交圈(INT X,INT Y,INT半徑)//將要採取的構造函數的參數值

+3

你目前認爲'x = x;'做什麼? – immibis 2015-03-19 09:18:42

+2

將其更改爲'this.x = x'等。 – alfasin 2015-03-19 09:19:35

回答

0

x=x;行沒有任何意義,因爲它分配值變量x變成相同的變量。

如果您有字段名稱爲x您應該使用this關鍵字this.x = x來引用它。在這種情況下,您將爲成員x分配參數x的值。

但這並不意味着您總是必須使用this來引用成員。你必須這樣做,如果你的局域變量具有與你的範圍相同的標識符。

+0

是的,我明白這一點。但是,因爲我將5,5,50的值傳遞給構造函數。 System.out.println(new Circle(5,5,50));不應該傳遞的值應該替換parameters.public Circle(int x,int y,int radius)。 – kemparaj565 2015-03-19 09:24:01

+0

這些值確實傳遞給您的構造函數。但是他們沒有分配給成員變量。他們被重新分配給構造函數的參數。 – AlexR 2015-03-19 09:26:27

+0

好的。但在這種情況下,當我發送值的構造函數參數,然後x = 5,y = 5,半徑= 50。現在在構造函數中,當我試圖設置值。不應該將該值設置爲。 X = 5,Y = 5,半徑= 50。對不起誇張,但我需要知道它。謝謝你的幫助。 – kemparaj565 2015-03-19 09:29:54

5

您需要使用this.x = x

x通過如一個參數陰影該字段。發生這種情況時,您可以使用this.x來表示該字段。

+0

好的。但在這種情況下,當我發送值的構造函數參數,然後x = 5,y = 5,半徑= 50。現在在構造函數中,當我試圖設置值。不應該將該值設置爲。 X = 5,Y = 5,半徑= 50。對不起誇張,但我需要知道它。謝謝你的幫助。 – kemparaj565 2015-03-19 09:34:03

1

構造函數的參數隱藏了類的成員。

構造函數更改爲:

public Circle(int x,int y,int radius) 
{ 
    this.x=x; 
    this.y=y; 
    this.radius=radius; 
} 

或爲成員的參數使用不同的名稱。

0

這是在您使用this

public Circle(int x,int y,int radius) 
{ 
    this.x=x; 
    this.y=y; 
    this.radius=radius; 
} 

沒有this你實際上只在局部變量工作 X,Y等

0

一個局部變量陰影的實例變量

在構造函數中的局部變量屏蔽實例變量 。無論您在分配和讀取一個實例變量,使用this關鍵字

考慮下面的例子

public class Employee{ 
    int id; 
    String name; 

public Employee(int id, String name){ 
    this.id = id; //sets the id to the Employee's id 
    this.name = name; //sets the name to Employee's name 
} 
} 

你在構造函數中做了什麼不會產生任何影響。如果使用的是Eclipse,你可以很容易地看到一條警告說The assignment to variable id has no effect

當你正在做new Circle(5,5,50)),構造函數只是重新分配地方varaibles,甚至不接觸實例變量。

但是,當您使用return "center("+x+" , "+y+") and radius ("+radius+")";打印值時,您指的是實例變量。因爲您的toString方法中沒有陰影。這就是爲什麼你得到0,因爲所有的實例變量初始化與默認值

+0

好的。但在這種情況下,當我發送值的構造函數參數,然後x = 5,y = 5,半徑= 50。現在在構造函數中,當我試圖設置值。不應該將該值設置爲。 X = 5,Y = 5,半徑= 50。對不起誇張,但我需要知道它。謝謝你的幫助。 – kemparaj565 2015-03-19 09:33:02

+0

@ kemparaj565請看看更新的答案 – shikjohari 2015-03-19 09:39:13

+0

是的,我確實看到了。謝謝shikjohari。但是還有一個問題。正如我們所知,局部變量應該分配給某個值。它沒有初始化爲實例變量的默認值。在這種情況下,我向他們發送價值5,5,50。不知道他們如何分配到值0. – kemparaj565 2015-03-19 09:46:25