繁体   English   中英

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

[英]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,变量aAlpha 在调用af(100)之前,将调用af() ,它将x设置为20 在调用af(100)局部变量x在方法f(int x)设置为25 ,而不是实例变量 x 实例变量仍为20

对于问题7,将变量b (即Beta )分配给Alpha引用c 调用cg(400) ,编译器必须调用g(Object) ,因为这是Alphag唯一可用的重载。 在运行时,多态决定,由于对象是Beta ,的重写g(Object)Beta被选择,它设置x35 这是因为编译器选择方法重载,而在运行时使用多态选择方法重写。

第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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM