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

时间:2015-06-02 17:02:02

标签: 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;
}

上面的工作很好但是当我使用自己的类返回值时,编译器给我“非静态变量这个不能从静态上下文中引用”(注意:编辑表明这些类嵌套在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程序员如何从静态方法返回整洁的数据?为什么它允许实例化内置类而不允许用户定义的类?

2 个答案:

答案 0 :(得分: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;
}

我想你想要的是这个:

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没有区分"内置"类和"用户定义"类。

答案 1 :(得分:2)

看看你的错误,你的问题可能会错过一些代码,它可能就像:

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

      public static UserData decodeText(String codeString) {
            UserData data = new UserData();
            ....
      }
}

内部类

所以你正在使用内部类的概念。这些类需要访问要创建的父类的实例(此处UserData需要访问SomeClass的实例)。当通过" this"在非静态方法中创建内部类时,JVM提供此访问。指针。但是,一个人无法访问"这个"在静态方法中:这是编译器告诉你的:无法创建UserData,因为它需要访问它("非静态变量,这不能从静态上下文中引用")。

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

您的使用案例

在您的情况下,您似乎不需要内部类。当您想要访问父类的成员时,您只需要一个嵌套类。否则静态嵌套类就足够了。

您的问题

  

我可以将我的UserData类设为静态类,但是后来对方法的调用是否会改变原始调用的值?

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