javac声称I';我并没有重写抽象类实现中的方法

javac声称I';我并没有重写抽象类实现中的方法,java,methods,implementation,abstract,Java,Methods,Implementation,Abstract,我会尽可能简短和中肯,但这是一个复杂的问题。我在Linux平台上用Java编写,不管它值多少钱 目标的简短版本:我希望有一个名为Client的抽象类,它充当客户端连接的通用容器客户端应该对其每个连接执行线程。我还有一些经过半测试的代码,它们以类似的编码方式与此服务器对应。抽象的客户机应该被实现成更具体、更具体的东西。在我的例子中,我有一个名为FileClientGui的类,它扩展了Client,并用从服务器接收文件内容并显示它们的基本方法覆盖了Client的所有抽象方法。由于抽象客户机本身是ja

我会尽可能简短和中肯,但这是一个复杂的问题。我在Linux平台上用Java编写,不管它值多少钱

目标的简短版本:我希望有一个名为
Client
的抽象类,它充当客户端连接的通用容器<代码>客户端应该对其每个连接执行线程。我还有一些经过半测试的代码,它们以类似的编码方式与此服务器对应。抽象的
客户机
应该被实现成更具体、更具体的东西。在我的例子中,我有一个名为
FileClientGui
的类,它扩展了
Client
,并用从服务器接收文件内容并显示它们的基本方法覆盖了
Client
的所有抽象方法。由于抽象
客户机
本身是
java.lang.Thread
的扩展,这一点更加复杂

以下是我的文件结构(通用术语):

/class/path/lib/client/client.java

/class/path/com/fileclient/FileClientGui.java

这两个文件都引用了其他几个自定义类,但我没有从中得到任何错误。如果我需要发布这些项目的代码,请告诉我,我会发布它们

因此,我在终端上运行这个长javac命令,设置类路径和构建目录,以及所有需要编译的相关文件。我收到的任何代码的唯一错误是:

com/fileclient/FileClientGui.java:26: com.fileclient.FileClientGui is not abstract and does not override abstract method cleanClients() in lib.client.Client
我的代码(见下文)清楚地实现了Client.java中定义的方法和所有其他抽象方法。我浏览了互联网,似乎大多数遇到这个错误的人都在尝试实现一个
ActionListener
,并对这个实现感到困惑,很多时候,这只是一个简单的拼写或大写问题。我已经一遍又一遍地检查我的代码,以确保这不是一个简单的“oops”问题。我怀疑这实际上是我的类名和某个其他类名之间的某种冲突,不知何故最终出现在我的类路径或Java的本机框架/库中,但我找不到任何明显的东西

无论如何,这是我的密码

Client.java:

package lib.client;

import lib.clientservercore.Connection;
import lib.simplefileaccess.Logger;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.lang.Thread;

/**
 *
 * @author Ryan Jung
 */
public abstract class Client extends Thread {

    ArrayList<Connection> connections;
    boolean isRunning;
    Logger log;

    public Client (String logFile) {
        log = new Logger(logFile);

        log.write("Initializing client...");
        
        connections = new ArrayList<Connection>(50);

        log.write("Client initialized.");
    }
    
    public void logOut(String contents) {
        log.write(contents);
    }
    
    public Logger getLogger() {
        return this.log;
    }
    
    public ArrayList<Connection> getConnections() {
        return connections;
    }
    
    public void addConnection(Connection c) {
        connections.add(c);
    }
    
    public void removeConnection(Connection c) {
        connections.remove(c);
    }
    
    public boolean getIsRunning() {
        return isRunning;
    }
    
    public void setIsRunning(boolean r) {
        isRunning = r;
    }

    public Connection connect(String host, int port) {
        log.write("Creating new connection...");

        Socket s;
        Connection c = null;

        // Validate port
        if (port <= 1024 || port > 65536) {
            log.write("Invalid server port: " + port + ".  Using 12321.");
            port = 12321;
        }

        try {
            s = new Socket(host, port);
            c = connectClient(s);
        } catch (IOException exIo) {
            log.write("Could not connect to the server at " + host + ":" + port + ".  Exception: " + exIo.getMessage());
            exIo.printStackTrace();
        }

        log.write("Connected client to " + host + ":" + port);
        
        return c;
    }

    @Override
    public void run() {
        log.write("Running client.");
        runClient();
        log.write("Client finished running.");
    }

    abstract Connection connectClient(Socket sock);

    abstract void runClient();

    abstract void cleanClients();

}
我会接受任何我能得到的帮助,我提前感谢你提供的任何建议。我完全被这件事弄糊涂了

也许最令人困惑的是(也许这提供了问题的线索?)我可以注释掉抽象方法的其他实现(例如runClient或connectClient),而我没有遇到任何其他问题,只有相同的问题。此外,如果我将@Override指令添加到其他指令中,如下所示:

@Override
Connection connectClient(Socket sock) {
    logOut("Client controller is creating a new connection...");
    FileClientConnectionGui c = new FileClientConnectionGui(sock, getLogger(), this);
    addConnection(c);
    c.start();
    logOut("Client controller created a new connection.");
    return c;
}
我得到一个额外的错误:

com/fileclient/FileClientGui.java:96: method does not override or implement a method from a supertype
它显然是在覆盖其超类型(即客户机)中的方法。我尝试过用完整的类路径(lib.Client.Client)替换“Client”,但没有任何错误被更改


有什么我遗漏的吗?我没有尝试的东西?

我相信这是因为您有包级别的抽象方法,这些方法在您的子类中不可见。试着让它们受到保护

下面是一对简单的类,它们再现了这个问题:

package x1;

public abstract class P1
{
    abstract void foo();
}
然后:

package x2;

public class P2 extends x1.P1
{
    void foo() {}
}
汇编这些文件可提供:

P2.java:3: P2 is not abstract and does not override abstract method foo() in P1
public class P2 extends x1.P1
       ^
1 error

使
foo
在两个类中都受保护可以解决问题。

类不能声明为受保护,IIRC。您是否建议抽象类将其抽象方法声明为抽象?我将尝试这样做并提供结果。谢谢你的快速回复。真漂亮!非常感谢。在abstract Client.java中,我保护了抽象函数定义,在实现文件clientgui.java中,我保护了函数实现。代码立即编译,没有错误。我执行了代码,得到了我期望的确切结果。再次感谢。这是正确的答案。
P2.java:3: P2 is not abstract and does not override abstract method foo() in P1
public class P2 extends x1.P1
       ^
1 error