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

Dat*_*uti 7 java static return

我搜索了stackoverflow以及其他一些网站,遗憾的是没有找到这个问题,更不用说回答.也许我的方法最好尝试另一种方式?我是Java新手; 这应该是我想的一个非常简单的答案.

问题: 我有一个静态方法,我想从中返回值.为了方便和整洁,我想使用我自己的类而不是ArrayList,String []或类似的.问题是我无法在静态方法中实例化我的类(正如我预期的那样可能是一个问题).有趣的是:使用String []Object作为返回工作(这是这些类的一个实例)...所以为什么我不能使用我自己的类实例?

例:

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;
}
Run Code Online (Sandbox Code Playgroud)

上面的工作很好但是当我使用自己的类返回值时,编译器给我"非静态变量,不能从静态上下文中引用" (注意:编辑以显示这些类嵌套在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*man 6

这段代码唯一的问题是错误的花括号:

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;
}
Run Code Online (Sandbox Code Playgroud)

我想你想要的是这样的:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的工作很好,但当我使用自己的类返回值时,编译器给我"非静态变量,这不能从静态上下文中引用"

您发布的代码不会导致该错误.您要么将代码复制错误,要么查看旧错误.

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

你所描述的方式确实没有"静态类"的概念.静态类只是一个内部类,可以在没有外部类的实例的情况下访问它.它的所有成员仍然像普通班的成员一样行事.

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

你发布的内容可以正常工作.Java没有区分"内置"类和"用户定义"类.


Ale*_*aux 2

查看您遇到的错误,您的问题可能遗漏了一些代码,它可能是这样的:

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

      public static UserData decodeText(String codeString) {
            UserData data = new UserData();
            ....
      }
}
Run Code Online (Sandbox Code Playgroud)

内部类

所以你正在使用内部类的概念。这些类需要有权访问其要创建的父类的实例(此处 UserData 需要有权访问 SomeClass 的实例)。当通过“this”指针从非静态方法内创建内部类时,JVM 会提供此访问权限。但是,在静态方法中无法访问“this”:这就是编译器告诉您的内容:无法创建 UserData,因为它需要访问 this(“非静态变量 this 不能从静态方法引用”)。语境”)。

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

您的用例

就您而言,您似乎不需要内部类。仅当您想要访问父类的成员时,才需要嵌套类。否则静态嵌套类就足够了。

你的问题

我可以将我的 UserData 类设置为静态类,但是随后对该方法的调用不会更改原始调用的值吗?

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