基本的Java概念

时间:2012-03-23 07:08:30

标签: 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

我知道有办法得到我想要的东西,但请回答为什么这不起作用。

9 个答案:

答案 0 :(得分: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);         
}

答案 1 :(得分: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通过引用传递参数,因为如果参数类型是 mutable 引用类型,那么您可以看到对对象的更改<参数值引用的/ em>,调用者将看到这些更改:

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

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

改变参数的值,这只是一个参考 - 你可以告诉它不会改变参数的值,因为没有赋值运算符...

答案 2 :(得分:1)

setX中,您临时更改用于保存实际参数的变量的值。将该方法设为公开,并将作业更改为this.x=...以改为引用该字段,或使用Driver.x作为@cloudeus建议。

答案 3 :(得分:1)

您必须使用Driver.x来设置值。您只能通过定义x="a"

来更新静态变量
static void setX(String x){
    Driver.x="a";
    System.out.println("now x should be = "+Driver.x);    
}

答案 4 :(得分:1)

变量x由值(副本)传入,因此该方法不会更改变量的值。

答案 5 :(得分:1)

避免使用静态变量。 而是使用

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;
  }
}

答案 6 :(得分:0)

因为您将x定义为静态变量。如果你想打印一个然后从x变量中删除静态并在main方法中替换下面的代码:

  

setX(new Driver()。x);

     

System.out.println(“但x仍然是”+新的驱动程序()。x);

答案 7 :(得分:0)

对于setX()方法,您最好将参数从x更改为a或其他内容,例如:

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

局部变量x可能优先于静态x。

答案 8 :(得分: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);         
  }
}