将参数传递给void方法(整数或对象)

时间:2018-04-16 20:46:11

标签: java object methods parameters

我试图找出以下代码的输出是什么,除了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);
  }
}

2 个答案:

答案 0 :(得分:3)

对于问题#3,变量aAlpha。在调用a.f(100)之前,会调用a.f(),将x设置为20。在调用a.f(100)时,本地变量x在方法25中设置为f(int x),而不是实例变量 x。实例变量仍为20

对于问题#7,变量bBeta)被分配到cAlpha引用。调用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; }
}