2012-03-23 3 views
1

Привет я следующий блок кодаBasic Java Концепция

public class Driver { 

static String x = "x"; 
static String y = "y"; 

public static void main(String[] args) throws Exception { 
     setX(x); 
     System.out.println("but x is still "+x);   
} 

static void setX(String x){ 
     x="a"; 
     System.out.println("now x should be = "+x);   
    } 
} 

и это печатает

now x should be = a 
but x is still x 

Я надеялся получить

now x should be = a 
but x is still a 

Я знаю, есть способы, чтобы получить то, что я хотите, но ответьте, почему это не работает.

ответ

4
static void setX(String x){ 
     //x="a"; //refers to local variable , from parameter 
     //make it as follows 
     Driver.x="a"; 
     System.out.println("now x should be = "+x);   
} 
+0

спасибо, я просто забыл о доминировании локальной переменной над переменной класса. – vishesh

1

В setX вы временно меняете значение переменной, используемой для хранения фактического параметра. Сделайте этот метод общедоступным и измените назначение на this.x=..., чтобы ссылаться на это поле, или используйте Driver.x как предложено @cloudeus.

+0

вы не можете использовать это в статическом методе ..... – kandarp

+0

driver.x будет делать, как Исправленная предложил – vishesh

+0

@kandarp, спасибо. – ShiDoiSi

1

Чтобы установить значение, вы должны использовать Driver.x. Вы не можете обновить статическую переменную только с определения x="a"

static void setX(String x){ 
    Driver.x="a"; 
    System.out.println("now x should be = "+Driver.x);  
} 
+1

вы не можете использовать это в статическом методе ..... – kandarp

+0

@kandarp, К сожалению, это была ошибка. Я исправил его – Starx

1

переменная х передается по значению (копия), поэтому метод не изменяет значение переменной.

0

потому что вы определили x как статическую переменную. Если вы хотите напечатать a, то удалите статическую переменную x и замените ниже код в основном методе:

setX (новый драйвер() x);

System.out.println («но x по-прежнему» + новый драйвер(). X);

3

Ну, посмотрите на свой метод:

static void setX(String x){ 
    x="a"; 
    System.out.println("now x should be = "+x);   
} 

Вы можете игнорировать тот факт, что у вас есть статическая переменная x, потому что скрытый параметром здесь. Так может и не существовать. Что касается этого метода. Если это то, что озадачивает вас, то исправление удалить параметр целиком:

// In main 
setX(); 
... 
static void setX(){ 
    x="a"; 
    System.out.println("now x should be = "+x);   
} 

Если вы ожидали изменения значения параметра влияет на аргумент, а также ... Все аргументы передаются по значению в Java - это означает, что аргумент оценивается на сайте-вызове и используется как начальное значение для параметра. Но помимо этого аргумент и параметр не связаны - если вы измените значение параметра, то не изменить аргумент.

Людей иногда утверждают, что Java передает аргументы по ссылке, потому что, если тип параметра является изменяемыми ссылочным типом, то вы можете увидеть изменения в объекта, что значение параметра относится, и эти изменения будут видно вызывающим:

StringBuilder builder = new StringBuilder("x"); 
appendHello(builder); 
System.out.println(builder); // Prints xhello 

... 
static void appendHello(StringBuilder parameter) { 
    parameter.append("hello"); 
} 

это делает не изменить значение параметра, которое просто ссылка - вы можете сказать, это не изменяет значение параметра, потому что нет никакого оператора присваивания ...

0

для Setx() метод, вы бы лучше изменить параметр от х до или что-то другое, например .:

setX(String a) { 
    Driver.x = a; 
} 

Локальная переменная х может быть принято приоритет статического х.

+0

да, вот ответ. благодаря – vishesh

0

Вы используете статические переменные, и нужно использовать имя класса в доступе к переменным ...

public class Driver { 

static String x = "x"; 
static String y = "y"; 

public static void main(String[] args) throws Exception { 
     setX(x); 
     System.out.println("but x is still "+ Driver.x);   
} 

static void setX(String x){ 
     Driver.x="a"; 
     System.out.println("now x should be = "+ Driver.x);   
    } 
} 
1

Избегайте статических varibales. Вместо этого используйте

public class Driver { 

    private String x = "x"; 
    private String y = "y"; 

    public static void main(String[] args) throws Exception { 
    Driver d = new Driver(); 
    System.out.println("Original x "+d.x);  
    d.setX("a"); 
    System.out.println("New x "+d.x);   
    } 
    public void setX(String x){ 
    this.x=x; 
    } 
} 
Смежные вопросы