我正在尝试从另一个 class 调用方法,但它未定义

I'm trying to call method from another class but it is undefined

我在 class ReadFitsData 中创建了一个方法 sReadFitsData。我想在任何 class 中调用此方法。例如,来自 class TestRead。但相反,我遇到了编译错误:“方法 sReadFitsData(String) 未定义类型 TestRead”。

这是我的代码:

ReadFitsData.java

package readFits;

import java.io.IOException;

import nom.tam.fits.BasicHDU;
import nom.tam.fits.Fits;
import nom.tam.fits.FitsException;
import nom.tam.fits.Header;

public class ReadFitsData {

public int[][][] sReadFitsData(String fitsFileName) throws IOException, FitsException {
    int[][][] myData;
    Fits f; // fits object
    Header hdr;
    Object fData;

    try {
        f = new Fits (fitsFileName); 
    } catch (FitsException fEx) {
        throw new IOException ("Failed to open FITS file; "+fEx.getMessage());
    }

    try {
        BasicHDU hdu = f.getHDU(0); // 0 is for first header, 1 is for second one.
        f.close();
        //hdr = hdu.getHeader();

        //int size = (int) hdr.getDataSize();

        fData = hdu.getData().getData(); // Object fData
    } catch (FitsException fEx) {
            throw new IOException ("Failed to get Data; "+fEx.getMessage());
    }


    if (!fData.getClass().isArray()) {
        throw new IOException ("Unknown HDU Data type: " + fData.getClass().getName());// + fEx.getMessage());
    }

    myData = (int[][][]) fData; // cast the fData to an int[][][]

    return myData;
}

}

调用此方法的另一个 class:

TestRead.java

package readFits;

public class TestRead {
    public static void main(String[] args){
        String fname = "myFitsFile.fits";
        int[][][] arr = sReadFitsData(fname); // here is the compilation error.
    }

}

ADDITION 根据答案:

首先,我将方法 sReadFitsData 作为 public static 用于对象的独立性。

其次我导入了 class:

TestRead.java

import projectName.readFits.ReadFitsData;

同样的编译错误仍然存​​在。应该吗?:

int[][][] arr = sReadFitsData(fname); // error is still there

当我将这段代码导入或不导入时都可以:

int[][][] arr = ReadFitsData.sReadFitsData(fname); // working!

为了能够从不同的 classes(更具体地说:不同的文件)调用方法,您需要 import 那些 classes.

问题是,classTestRead怎么知道sReadFitsData是谁的方法,至少不是他自己的方法。 另一件事是,如果 TestRead 还定义了一个名为 sReadFitsData 的方法,您希望以某种方式能够区分这两种方法。

有两种方法可以解决这个问题。首先,您可以在方法调用前指定full class path。为此,您可以将 TestRead 中的呼叫交换为:readFits.ReadFitsData.sReadFitsData(fname).
完整的 class 路径由所有包和 class 本身组成。

其次,您可以 import class,在这种情况下您可能更喜欢什么。只需将此行添加到 TestRead class 的开头,紧跟在包声明之后:import readFits.ReadFitsData;
它应该看起来像 ReadFitsData class.

的其他导入

好的,这是第一个问题。但是,它现在也不会编译。您必须创建 class ReadFitsData 的实例并在其上调用方法:

ReadFitsData data = new ReadFitsData();
data.sReadFitsData(fname);

如果想让方法独立于对象,就需要做到static:

public static int[][][] sReadFitsData(String fitsFileName) throws ... {

然后您可以从任何地方(导入后)通过 ReadFitsData.sReadFitsData(...) 调用该方法。

在这一点上我应该说你正在努力处理一些非常基本的 Java 事情。您阅读或观看一些初学者教程或书籍可能会更好:)

您可能会得到一个 IDE,例如 eclipse,用于与 Java 一起工作。这些程序会自动导入 classes,因为它们会检测到您可能想要使用的方法。他们还让你选择是否有多个。