【问题标题】:Java riddle: static bindingJava之谜:静态绑定
【发布时间】:2015-06-13 13:55:08
【问题描述】:

我获得了C 类和A 接口,我不能对它们进行任何更改。我应该写 B 类,这样代码总是会输出 success!

for 循环内C 类的代码中有两件事我不明白。

1) 我不明白调用了哪个 bar 方法。

2) 到达返回时返回到哪里?

我应该更改B 的实现以使其正常工作吗?

public interface A {

    public String bar();
}



public class C extends B {

    public int foo = 100;

    public C(String s) {
        super(s);
    }

    @Override
    public void barbar() {
        foo++;
    }

    public static void main(String[] args) {
        String input = args[0];
        StringBuilder builder = new StringBuilder(input);
        C c = new C(input); //c=args[0]
        B b = c; //b=args[0]
        A a = b; //a=args[0]

        for (int i = 0; i < args.length; i++) {
            if (!builder.toString().equals(a.bar())) { //which bar is called?
                return; //where does it return to? does it exist the for loop?
            }
            builder.append(input);
            c.foo++;
        }

        if (c.foo - 99 == b.foo.length() / input.length()) {
            System.out.println("success!");
        }
    }
}


public class B implements A {



    public String foo;

    public B(String s) {
        this.foo=s;
    }

    public void barbar() {
        // TODO Auto-generated method stub

    }

    @Override
    public String bar() {
        return this.foo;
    }

}

【问题讨论】:

    标签: java class binding static-methods


    【解决方案1】:
    1. class B 中定义的bar() 被称为当然。如果你相信来自interface A 的方法被调用,我必须告诉你来自接口的方法永远不会CALLED。由于接口只有实现非抽象类必须定义的方法声明(除非它是default 方法)。并执行return this.foo 行。

    2. 来自main 方法的return 语句结束程序。它返回给 JVM,而后者又返回给操作系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多