Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以在Java中链接重写的方法吗_Java_Oop_Inheritance_Overriding_Subclass - Fatal编程技术网

可以在Java中链接重写的方法吗

可以在Java中链接重写的方法吗,java,oop,inheritance,overriding,subclass,Java,Oop,Inheritance,Overriding,Subclass,假设我有一个抽象类: abstract class DBTable { abstract boolean append(); } 我还有一个子类继承自DBTable: // Client objects are rows of a database table class Client extends DBTable { @Override boolean append() { } } 最后,假设我有一个Client的子类,我用它来表示客户机对象的非规

假设我有一个抽象类:

abstract class DBTable {

    abstract boolean append();

}
我还有一个子类继承自DBTable:

// Client objects are rows of a database table
class Client extends DBTable {

    @Override
    boolean append() {

    }
}
最后,假设我有一个Client的子类,我用它来表示客户机对象的非规范化形式(我觉得这没问题,它都在同一个包中,一个Client.Expand是一个客户机)

我想做的是重写Client.Expand中的append()方法,并让它链接到Client中的append()方法,然后再返回到只适用于该子类的工作。像这样的

    // Expand is a member class of Client
    static class Expand extends Client {

        @Override
        boolean append() {
            super.append();
            :
            :
        }
    }

Java允许这样做吗?当我试图重写父类中已经重写的方法时,我从IDE中得到错误。似乎我应该能够重写一个重写的方法,以提供子类所需的额外实现,但可能Java不是为这种继承而构建的?

您的示例中有几个问题:

  • 将类的成员声明为静态时,该成员与该类关联。它不能与该类的和实例一起使用。例如,当Expand的append方法中有一个代码,例如-super.append()-“super”指的是实例,而不是“class”。因此,它与静态定义相矛盾。正如注释中所建议的,您需要从类声明中删除static

  • 一个子类,不应该是一个内部类,这不是一个好的设计,即使它是允许的。因为,如果从语义上考虑,子类不是超类的成员(在这种情况下,父子词是误导性的,超类和子类更好)。超类不应该知道可能扩展它的类,它应该是自包含的。因此,最好将子类移动到单独的类中

  • 您的设计还存在一些其他问题:首先,命名不是对主题的描述。如果客户机表示一行,则表示行或表行。。。也许是一个更好的名字,下节课就花掉了

  • 但是,更重要的是,扩展表的行不是一个好主意。更好的方法可能是使用行类和表类组成行。大概是这样的:

    // Client objects are rows of a database table
    class Row {
    
        @Override
        boolean append() {
    
        }
    }
    
    class Expanded extends Row{
    
            @Override
            boolean append() {
                super.append();
                :
                :
            }
        }
    class DBTable {
    
        Row row;
    
    }
    

    我发现了问题所在。这很尴尬。作为我自己辩护的一部分,我将迂回地回答我自己的问题

    我喜欢设计我的类,这样一个类就可以服务于一个主题。所有与该主题相关的功能,我都喜欢尝试将它们放在同一个类中。这对于数据库数据模型类尤其有效,因为对于其他数据库模型类,类的结构通常可以重复

    我到底是什么意思

    这是我的客户机类的“结构”。如您所见,它包含几个成员类:

    +----------------------------+
    |  CLIENT                    |
    +---+------------------------+
        |  static EXPAND         |
        +------------------------+
        |  static GHOST          |
        +------------------------+
        |  static BUILDER        |
        +------------------------+
        |  static INQUISITOR     |
        +------------------------+
        |  static QUERYBUILDER   |
        +------------------------+
        |  static JDBCFactory    |
        +------------------------+
    
    我非常喜欢这个设计。这意味着为我构建客户机对象的类可以与客户机类位于同一个文件中,我可以使用半助记符“new Client.Builder()”调用它,或者我可以使用“new Client.QueryBuilder()”创建为客户机对象构建SQL查询的对象。其对象成为从JDBC结果集生成客户机对象的工厂的类可以用“new Client.JDBCFactory”等进行实例化。我非常喜欢这样

    缺点是。。。我有很多牙套

    而且。。。如果我不小心,我可能会键入错误的内容。在本例中,我输入了我希望位于EXPAND成员类中的append()方法的定义。。。实际上就在大括号外,我正在为客户机输入上下文

    客户机已经有了一个append()方法,所以IDE向我抱怨,我试图重写已经有append()方法的类中的一个方法


    是的,Java完全支持覆盖链接。我的IDE或JVM没有问题。。。就跟我来。再次感谢@Robe和其他人的输入。

    错误是怎么说的?Expand是一个成员类,也是客户端的一个子类吗?是的,Expand是客户端的一个静态嵌套类。这没关系,不过。。。静态嵌套类实际上与顶级类相同,只是绑定为成员类。它应该能够毫无问题地将客户机扩展为其成员类。是的,尝试将Expand移动到其自己的对象(即不是成员类),并从其声明中删除static关键字。如果您这样做,它应该会起作用。许多Java框架使用您描述的方法链接。@Bhesh,我得到的错误是“此方法已在客户端中被重写”。恕我直言,您可能对静态成员类有点困惑。请记住,对于JVM来说,静态成员类与顶级类没有什么不同。对于程序员来说,成员类保留了词法和语法关系(例如Client.Expand),但是编译器将静态成员类重命名为Client$Expand,并且它与任何其他顶级类一样。因为这个静态成员类继承自客户机,所以它的行为与作为超类的子类的任何其他顶级类一样,包括调用“super.append();”的能力。但同样,将静态成员类视为独立的顶级类是完全合适的。这包括静态成员类通过继承作为任何其他顶级超类的子类的关系。同样,我不相信您对静态嵌套类的概念有正确的看法;最后,讨论Client-是否是一个-DBTable以及子类化是否提供了最好的模型是有效的。事实上,DBTable所做的不仅仅是充当父级。它是一个抽象类,适合作为de的框架实现模式