java - super 函数在java中是如何工作的?

标签 java oop decorator

<分区>

这是 Head First 设计模式书中的一段代码片段:

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 类通过 super(in) 初始化 InputStream 对象,后来似乎使用使用 super.read() 函数读取此对象。

我对 super 函数在这里的工作方式有点困惑。在 Mocha 示例中,很明显它在内部包装了一个饮料对象并调用了它的方法并修改了结果,而在 LowerCaseInputStream 类中,行为修改是如何发生的并不直接。

最佳答案

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

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

关于java - super 函数在java中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25060651/

相关文章:

javascript - 如何使用 babel 为我的 js 服务模块实现经过身份验证的 es 7 装饰器

java - 防止 JPanel 在 repaint() 调用时重绘背景

java - 以下代码中符合垃圾回收条件的对象数量?

javascript - Coffeescript 类命名空间方法

php - CodeIgniter 在同一 Controller 中加载多个模型

Python 装饰器处理装饰函数的默认参数

python-2.7 - functools.wrapper - AttributeError : attribute '__doc__' of 'type' objects is not writable

java - 在 ArrayAdapter 中使网络调用安全吗?

java - 为什么 @JacksonXmlProperty 在使用 Kotlin 的 Spring Boot 中忽略参数?

c# - 适当使用静态方法