Java

时间:2017-10-18 13:57:12

标签: java

package com.company;
public class A {
    public int a(int b, int c) {
        return --b;
    }

    public static void main(String args[]) {
        A a = new B();
        System.out.println(a.a(1000,1000));

    }
}

class B extends A {
    public int a(int b, int c) {
        if (b <= 0 && c == 0) {
            return ++b * ++c * ++b * c++;
        }
        return b > 0 ? a(super.a(b,c),c) : a(b, super.a(c,b));
    }
}

我编译程序:

  

2

我认为输出是-999,1000

我做的第一件事是找到主要方法

  

a a = new B();

因此,变量A由类型B

创建
  

的System.out.println(A.A(1000,1000));

a.a(1000,1000)在类B中调用public int a方法(在B类中不是A,因为变量a是B类)

由于b * c(1000,1000)不满足if语句中的条件,因此执行return语句中的if子句。

因为b> 0然后

  

a(super.a(b,c),c)被称为

超级关键字的使用意味着它被称为A类中的父构造函数并返回--b,即1000 - 1 = 999和C类原始方法中的C,等于1000

所以它变成

A(999,1000)

这将一直持续到B < 0,此时它将调用a(b,super.a(c,b)直到c == 0,最后返回2

但是,是否有更好的方法来分析这些(假设您无法访问编译器)?

1 个答案:

答案 0 :(得分:4)

理解更多的是++和继承的副作用。

简化为:

public int a(int b, int c) {
    if (b <= 0 && c == 0) {
        //return ++b * ++c * ++b * c++;
        //return ++b * 1 * ++b * 1;
        return (b+1) * (b+2);
        return 2; // When before recursion the original b >= 0
    }
    return b > 0 ? a(b-1, c) : a(c-1, b);
}

这看起来不是困难。