代码之家  ›  专栏  ›  技术社区  ›  dragi

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

  •  1
  • dragi  · 技术社区  · 6 年前

    我试图找出以下代码的输出,除了两行代码外,我几乎都答对了。第3行和第7行。

    预期输出为:

    1 : 10 
    2 : 20 
    3 : 20 
    4 : 15 
    5 : 40 
    6 : 75 
    7 : 35 
    8 : 75 
    9 : 20
    

    正如我提到的,除了3号和7号,我什么都做对了。第三行对我来说是25行,第七行是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 回复  |  直到 6 年前
        1
  •  3
  •   rgettman    6 年前

    对于问题3,变量 a 是一个 Alpha 之前 a.f(100) 被称为, a.f() 被调用,它设置 x 20 .呼叫时 a、 f(100) 这个 地方的 变量 十、 设置为 25 在方法中 f(int x) ,而不是 实例变量 十、 .实例变量保持不变 20

    对于问题#7,变量 b ,这是 Beta ,将分配给 c 阿尔法 参考什么时候 c.g(400) 则编译器必须调用 g(Object) ,因为这是 g 在中提供 阿尔法 。在运行时,多态性指示这一点,因为对象是 测试版 ,替代 g(对象) 在里面 测试版 选择,设置 十、 35 。这是因为编译器选择方法重载,而方法重写是在运行时使用多态性选择的。

        2
  •  2
  •   Garreth Golding    6 年前

    第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; }
    }