【问题标题】:java - extend a class to a library superclassjava - 将类扩展为库超类
【发布时间】:2016-12-26 09:00:01
【问题描述】:

我需要将自己的类扩展为库类 (org.jsoup.nodes.Node)。 超类是抽象的并且包含抽象方法。我的问题是其中一些抽象方法没有修饰符,这意味着默认情况下我没有访问权限,也无法覆盖它们。当我尝试这样做时,我会收到以下消息:

方法不会覆盖其超类中的方法

我该如何解决这个问题?

【问题讨论】:

    标签: java inheritance jsoup abstract extend


    【解决方案1】:

    没有访问修饰符的方法是包私有的。对您引用的类进行子类化的唯一方法是在包org.jsoup.nodes 中声明您的类,因此它在同一个包中。

    package org.jsoup.nodes;
    
    class MyNode extends Node {
        // ...
    }
    

    实际上没有什么能阻止你这样做。

    但鉴于该类声明了包私有成员,它可能并不意味着要在库之外进行子类化。

    【讨论】:

    • 感谢您的回答。我添加到我的项目中的这个库是只读访问,我想我不能将java类添加到包中,可以吗?
    • @TheDahaka:我不知道您所说的对库的“只读访问”是什么意思。您可以将一个类添加到您想要的任何非限制包中。我认为唯一受限制的包是java.lang,但我在 JLS 中找不到。
    • @T.J.Crowder 我们不能下载源 jar(如jsoup-1.9.2-sources.jar)并对其进行更改吗?这有效吗?
    • 抱歉,我对此不太放心。我已将 jsoup jar 文件附加到我的项目中(在 Intellij 上工作),如何找到 org.jsoup.nodes 包并在其中编写我的类?
    • @rD.:嗯,你可以,但是你必须保持修改后的版本同步。如果您可以将自己的类放入包中,则无需这样做。
    【解决方案2】:

    如果你必须在声明中扩展它,这里没有什么可做的,只是改变超类方法的可见性或将你自己的类移动到超类包中,因为默认情况下所有 java 方法都是“受保护的”,这意味着只有来自同一个包的类可以使用它们。如果运行时调用适合您的需要,您也可以尝试反射。

    【讨论】:

    • 错了。默认情况下,所有 java 方法都受保护。
    • 如果没有修饰符,方法编译为受保护
    • Default 访问说明符不同于 protected。请查看此答案一次:stackoverflow.com/a/31413248/2815219
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2013-10-30
    • 1970-01-01
    • 2016-01-15
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多