[英]Passed parameter into void method (integer or object)
我试图找出以下代码的输出,除了两行外,我几乎都正确了。 3号线和7号线
预期的输出将是:
1 : 10
2 : 20
3 : 20
4 : 15
5 : 40
6 : 75
7 : 35
8 : 75
9 : 20
正如我提到的,除了3和7外,我一切都正确。对于我来说,第3行是25,而第7行是40。请您解释一下为什么第3行:20和第7行:35? 我曾尝试过查找它,但找不到很好的解释。
这不是功课!
public class Alpha {
protected int x;
public Alpha() { this(10); }
public Alpha(int x) { this.x = x; }
public void f() { x = 20; }
public void f(int x) { x = 25; }
public void g(Object a) { x = 30; }
public void h(Object a) { x = 50; }
public void h(Integer a) { x = 55; }
}
public class Beta extends Alpha {
public Beta() { super(15); }
public void g(Object a) { x = 35; }
public void g(Integer a) { x = 40; }
public void h(Object b) { x = 70; }
public void h(Integer b) { x = 75; }
public static void main(String[] args) {
Alpha a = new Alpha();
System.out.println("1 : " + a.x);
a.f();
System.out.println("2 : " + a.x);
a.f(100);
System.out.println("3 : " + a.x);
Beta b = new Beta();
System.out.println("4 : " + b.x);
b.g(200);
System.out.println("5 : " + b.x);
b.h(300);
System.out.println("6 : " + b.x);
Alpha c = b;
c.g(400);
System.out.println("7 : " + c.x);
c.h(500);
System.out.println("8 : " + c.x);
c.f();
System.out.println("9 : " + b.x);
}
}
对于问题3,变量a
是Alpha
。 在调用af(100)
之前,将调用af()
,它将x
设置为20
。 在调用af(100)
, 局部变量x
在方法f(int x)
设置为25
,而不是实例变量 x
。 实例变量仍为20
。
对于问题7,将变量b
(即Beta
)分配给Alpha
引用c
。 调用cg(400)
,编译器必须调用g(Object)
,因为这是Alpha
中g
唯一可用的重载。 在运行时,多态决定,由于对象是Beta
,的重写g(Object)
在Beta
被选择,它设置x
至35
。 这是因为编译器选择方法重载,而在运行时使用多态选择方法重写。
第3行之所以是20,是因为您要更改传递到方法中的'x'的值,而不是类级别变量'x'。 将您的代码更改为以下内容。 如果您阅读可变范围的书,您也会得到更好的理解。
public class Alpha {
protected int x;
public Alpha() { this(10); }
public Alpha(int x) { this.x = x; }
public void f() { x = 20; }
public void f(int x) { this.x = 25; }
public void g(Object a) { x = 30; }
public void h(Object a) { x = 50; }
public void h(Integer a) { x = 55; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.