您好我有以下代码块
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
我知道有办法得到我想要的东西,但请回答为什么这不起作用。
答案 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);
}
}