超函数如何在Java中工作?

存在

这是第一本设计模式书中的代码片段:

public class LowerCaseInputStream extends FilterInputStream {

    public LowerCaseInputStream(InputStream in) {
        super(in);
    }

    public int read() throws IOException {
        int c = super.read();
        return (c == -1 ? c : Character.toLowerCase((char)c));
    }

    public int read(byte[] b, int offset, int len) throws IOException {
        int result = super.read(b, offset, len);
        for (int i = offset; i < offset+result; i++) {
            b[i] = (byte)Character.toLowerCase((char)b[i]);
        }
        return result;
    }
}

同一章中还有另一个玩具示例:

public class Mocha extends CondimentDecorator {
    Beverage beverage;

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }

    public double cost() {
        return .20 + beverage.cost();
    }
}

两者非常相似,不同之处在于Macha类内部有一个具体的对象可以初始化和使用,而LowerCaseInputStream类通过初始化InputStream对象super(in),后来似乎通过使用该super.read()函数来使用此对象

我对超级功能在这里的工作方式感到困惑。在Mocha示例中,非常清楚的是,它在内部包装了一个饮料对象,并调用其方法并修改了结果,而在LowerCaseInputStream类中,行为修改是如何进行的却不是直截了当的。

约翰·B

第一种情况super是在基类中引用构造函数FilterInputStream如果父类的构造函数有参数,则扩展它的任何类都必须使用显式调用适当的构造函数super如果基类仅具有无参数构造函数,super则Java隐式提供该构造函数

在第二种情况下,FilterInputStream read方法已被重载LowerCaseInputStream这意味着对的任何调用都LowerCaseInputStream.read()将转到其实现中。因此,LowerCaseInputStream为了调用read实现FilterInputStream(以获得标准行为),必须引用实现,super否则它将是一个无限循环。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章