我试图找出以下代码的输出是什么,除了2行之外,我几乎得到了所有这些代码。 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);
}
}
答案 0 :(得分:3)
对于问题#3,变量a
是Alpha
。在调用a.f(100)
之前,会调用a.f()
,将x
设置为20
。在调用a.f(100)
时,本地变量x
在方法25
中设置为f(int x)
,而不是实例变量 x
。实例变量仍为20
。
对于问题#7,变量b
(Beta
)被分配到c
,Alpha
引用。调用c.g(400)
时,编译器必须调用g(Object)
,因为这是g
中唯一可用的Alpha
重载。在运行时,多态性指示由于对象是Beta
,因此选择g(Object)
中Beta
的覆盖,将x
设置为35
。这是因为编译器选择方法重载,而在运行时使用多态来选择方法重写。
答案 1 :(得分:2)
第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; }
}