【问题标题】:Passed parameter into void method (integer or object)将参数传递给 void 方法(整数或对象)
【发布时间】:2018-09-26 16:53:24
【问题描述】:

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

【问题讨论】:

  • 你试过在调试器下一步步运行这段代码吗?

标签: java object methods parameters


【解决方案1】:

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

对于问题 #7,变量 b,它是一个 Beta,被分配给 c,一个 Alpha 引用。当调用c.g(400) 时,编译器必须调用g(Object),因为这是g 的唯一重载,在Alpha 中可用。在运行时,多态性表明,因为对象是Beta,所以选择Beta 中的g(Object) 覆盖,将x 设置为35。这是因为编译器选择了方法重载,而方法覆盖是在运行时通过多态选择的。

【讨论】:

  • 哇.. 非常感谢!现在更有意义了
【解决方案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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2012-01-20
    • 2022-01-22
    相关资源
    最近更新 更多