如何使用非静态(动态实例)对象作为Java中静态方法的返回?

如何使用非静态(动态实例)对象作为Java中静态方法的返回?,java,static,return,Java,Static,Return,我在stackoverflow和其他一些网站上搜索过,遗憾的是没有找到这个问题,更不用说答案了。也许我的方法最好是另一种方法?我是Java新手;我认为这应该是一个非常简单的答案 问题: 我有一个静态方法,我想从中返回值。为了方便和整洁,我希望使用自己的类,而不是ArrayList、String[]或类似的类。问题是我不能在静态方法中实例化我的类(正如我所预料的那样,这可能是一个问题)。有趣的是:使用字符串[]或对象作为返回确实有效(这是这些类的一个实例)。。。那么为什么我不能使用我自己的类实例呢

我在stackoverflow和其他一些网站上搜索过,遗憾的是没有找到这个问题,更不用说答案了。也许我的方法最好是另一种方法?我是Java新手;我认为这应该是一个非常简单的答案

问题: 我有一个静态方法,我想从中返回值。为了方便和整洁,我希望使用自己的类,而不是ArrayList、String[]或类似的类。问题是我不能在静态方法中实例化我的类(正如我所预料的那样,这可能是一个问题)。有趣的是:使用字符串[]或对象作为返回确实有效(这是这些类的一个实例)。。。那么为什么我不能使用我自己的类实例呢

示例:

public static String[] decodeText(String codeString) {
    //Parse codestring and return values (not included in this example)
    String[] data = new String[3];
    data[0]="This";
    data[1]="does";
    data[2]="work";                
    return data;
}
上述方法非常有效,但当我使用自己的类返回值时,编译器会给我一个“非静态变量,这不能从静态上下文引用”(注意:编辑以显示这些类嵌套在JInputs类中,这显然是重现错误所必需的):

public class JInputs extends JOptionPane {    
    //A lot of missing code here (which shouldn't be necessary to reproduce issue)

    public class UserData {
        public String userName;
        public String code;
        public long milliTime;

        UserData() {            
        }
        UserData(String userName, String code, long milliTime) {
            this.userName = userName;
            this.milliTime = milliTime;
            this.code = code;
        }
    }

    public static UserData decodeText(String codeString) {
        //Parse codestring and return values (not included in this example)
        UserData data = new UserData();
        data.milliTime = System.currentTimeMillis();
        data.code = "blah";
        data.userName = "Me";                
        return data;
    }
}

显然,我可以使我的UserData类成为一个静态类,但是随后对该方法的调用不会改变原始调用的值吗?Java程序员如何从静态方法返回整洁的数据?为什么它允许实例化内置类而不允许实例化用户定义的类?

此代码唯一的问题是放错了花括号:

public class UserData {
    public String userName;
    public String code;
    public long milliTime;

    UserData() {            
    }
    UserData(String userName, String code, long milliTime) {
        this.userName = userName;
        this.milliTime = milliTime;
        this.code = code;
    }
} //end of class!

//this method is outside the class!
public static UserData decodeText(String codeString) {
    //Parse codestring and return values (not included in this example)
    UserData data = new UserData();
    data.milliTime = System.currentTimeMillis();
    data.code = "blah";
    data.userName = "Me";                
    return data;
}
我想你想要的是:

public class UserData {
    public String userName;
    public String code;
    public long milliTime;

    UserData() {            
    }
    UserData(String userName, String code, long milliTime) {
        this.userName = userName;
        this.milliTime = milliTime;
        this.code = code;
    }


    public static UserData decodeText(String codeString) {
        //Parse codestring and return values (not included in this example)
        UserData data = new UserData();
        data.milliTime = System.currentTimeMillis();
        data.code = "blah";
        data.userName = "Me";                
        return data;
    }
}
上述方法非常有效,但当我使用自己的类返回值时,编译器会给我一个“非静态变量,不能从静态上下文引用”

您发布的代码不会导致该错误。您要么复制了错误的代码,要么正在查看旧错误

显然,我可以使我的UserData类成为一个静态类,但是随后对该方法的调用不会改变原始调用的值吗

你所描述的“静态类”的概念其实并不存在。静态类只是一个内部类,可以在没有外部类实例的情况下访问它。它的所有成员的行为仍然像普通类的成员

Java程序员如何从静态方法返回整洁的数据?为什么它允许实例化内置类,而不允许实例化用户定义的类


你发布的内容会很好用。Java不区分“内置”类和“用户定义”类。

查看您的错误,您的问题可能遗漏了一些代码,可能类似于:

public class SomeClass {
      public class UserData {
            ....
      }

      public static UserData decodeText(String codeString) {
            UserData data = new UserData();
            ....
      }
}
内部类 所以您使用的是内部类的概念。这些类需要访问要创建的父类的实例(这里UserData需要访问SomeClass的实例)。当通过“This”指针从非静态方法中创建内部类时,JVM提供了这种访问。但是,在静态方法中无法访问“this”:这是编译器告诉您的:无法创建UserData,因为它需要访问该方法(“非静态变量this不能从静态上下文引用”)

但是您可以在SomeClass或UserData及其任何子类的任何非静态方法中创建UserData的新实例

您的用例 在您的情况下,您似乎不需要内部类。只有在希望访问父类的成员时,才需要嵌套类。否则,静态嵌套类就足够了

你的问题 我可以使我的UserData类成为静态类,但是随后对该方法的调用不会改变原始调用的值吗

否对该方法的后续调用不会更改以前对该方法的调用创建的实例的值。静态类并不意味着它的变量是静态的,也不意味着它是静态的。静态类基本上类似于标准类,只是它嵌套在另一个类定义中。
有关静态嵌套类和非静态嵌套类之间差异的更多信息,请参阅关于此的。

有趣的。。。不,我确实想让这个类只是一个数据容器——decodeText方法是另一个类的一部分,只是因为它返回UserData类型的数据。这是否允许外部类引用和使用UserData类(如果保持公共)?虽然不是我所期望的,但这可能是实现我想要的最好的方式?谢谢你的回复@DatuPuti您可以将整个decodeText()函数复制到另一个类中,它将正常工作。您发布的代码不会生成您描述的错误。嗯。。。对我来说仍然如此。可能我没有提供足够的信息,因为这些都包含在基类中,如下所示:公共类JInputs extensed JOptionPane{public class UserData{///etc…}}@DuPuti我敢打赌在复制粘贴步骤中丢失了一些东西。你发布的代码对我来说很好,无论是我发布的方式还是在不同的类中。我怀疑您的实际代码包含一个您发布的代码没有包含的错误-您在复制过程中修复了自己的错误@DatuPuti如果
UserData
类位于另一个类中,并且您希望以这种方式使用它,则应将其标记为
static
,如下所示:
public static class UserData{…}
。否则,非静态的内部类将始终具有对封闭类的引用。谢谢!你帮助我提供了我需要的概念信息。就我所受的教育而言,我还通过使UserData成为它自己的类而不是嵌套类来解决这个问题。那么,对于仅用于从方法返回值的小型类来说,最好的方法是什么呢?为每个类创建一个类,或者创建一个包含多个静态嵌套类的“ReturnValues”类?或