回 帖 发 新 帖 刷新版面

主题:麻烦大虾给我看看输出中的12233是怎么来的?

interface Incrementable
{
    void increment();
}

class Callee1 implements Incrementable
{
    private int i = 0;
    public void increment(){
        i++;
        System.out.println(i);
    }
}

class MyIncrement
{
    public void increment(){
        System.out.println("Other operation");
    }
    static void f(MyIncrement mi){mi.increment();}
}

class Callee2 extends MyIncrement
{
    private int i = 0;
    public void increment(){
        super.increment();
        i++;
        System.out.println(i);
    }
    private class Closure implements Incrementable
    {
        public void increment(){
            Callee2.this.increment();
        }
    }
    Incrementable getCallbackReference(){
        return new Closure();
    }
}

class Caller
{
    private Incrementable callbackReference;
    Caller(Incrementable cbh){callbackReference = cbh;}
    void go(){callbackReference.increment();}
}

public class Callbacks 
{
    public static void main(String[] args) 
    {
        Callee1 c1 = new Callee1();
        Callee2 c2 = new Callee2();
        MyIncrement.f(c2);
        Caller caller1 = new Caller(c1);
        Caller caller2 = new Caller(c2.getCallbackReference());
        caller1.go();
        caller1.go();
        caller2.go();
        caller2.go();
    }
}


输出:
Other operation
1
1
2
Other operation
2
Other operation
3

回复列表 (共2个回复)

沙发

“Other operation
1”
是MyIncrement.f(c2);的结果。初始化MyIncrement时有第一句话,初始化c2时打印1。
“1”是第一个caller1.go();的结果,“2”是第二个caller1.go();的结果,
“Other operation
2”是第一个caller2.go();的结果,
“Other operation
3”是第二个caller2.go();的结果

调用来调用去的很麻烦,看代码的人很无奈,建议你尽量减少使用这样的代码的几率。
如果看不懂这类有答案的题目,你可以适当的在代码中加些输出语句或者改变输出的方式,来帮助理解。

板凳


谢谢了~

我来回复

您尚未登录,请登录后再回复。点此登录或注册