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
但是,是否有更好的方法来分析这些(假设您无法访问编译器)?
答案 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);
}
这看起来不是困难。