我搜索了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程序员如何从静态方法返回整洁的数据?为什么它允许实例化内置类而不允许用户定义的类?
答案 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。