我是java的新手,我目前正在尝试了解pass by value的工作原理。我有一个名为Test的主类和一个名为TestMax的第二个类。我在下面的代码中尝试实现的是在类TestMax中设置2个参数i和j的主类中的值,并通过传递我刚刚传递的参数值来调用方法max()
先前。
控制台的输出应该是这样的:
The maximum between 2 and 10 is 10.
我知道将值传递给方法(int res = max(i,j)
的方式有问题,但我花了最后2小时才弄清楚为什么这不起作用,我无法弄明白。< / p>
package testproject;
public class Test {
/** Main method */
public static void main(String[] args) {
TestMax pass = new TestMax();
pass.setI(2);
pass.setJ(10);
int res = max(i,j);
System.out.println("The maximum between " + pass.getI() +
" and " + pass.getJ() + " is " + res);
}
}
二级TestMax:
package testproject;
public class TestMax {
int i ;
int j ;
public static int max(int num1, int num2) {
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
//Getters & Setters
public void setJ(int j) {
this.j = j;
}
public int getJ() {
return j;
}
public void setI(int i) {
this.i = i;
}
public int getI() {
return i;
}
答案 0 :(得分:4)
这与传值和传递引用无关。问题是这行代码:
int res = max(i,j);
值i
和j
超出范围,max()
不在您当前的类中,因此您需要使用getter来访问值并通过上课,像这样:
int res = TestMax.max(pass.getI(), pass.getJ());
答案 1 :(得分:2)
这一行:
int res = max(i,j);
没有意义:在该范围内未声明max
,i
和j
。你的编译器应该拒绝这个。
你一定要写:
int res = TestMax.max(pass.getI(), pass.getJ());
答案 2 :(得分:1)
int res = max(i,j);
在上面一行中,max()
和i and j
参数都没有在该范围内声明。所以它是编译错误。
你应该把它写成:
int res = TestMax.max(pass.getI(), pass.getJ());
答案 3 :(得分:0)
您还可以更改max方法,使其不再是静态的,而是使用变量i和j作为输入,如下面的代码所示:
...
public int max() {
int result;
if (i > j)
result = i;
else
result = j;
return result;
}
...
现在您需要省略main方法中以下行中的参数:
int res = max(i,j);
更改为:
int res = max();
但是,如果以这种方式更改TestMax类,则需要创建一个扩展Exception的类,以便在将值分配给i和j之前,如果有人调用max()方法,则可以抛出它。另一种避免这种情况的方法是构建一个构造函数并在那里得到i和j。