我正在尝试在类构造函数中初始化变量,但IDE显示此警告:
The static field SoapClient.url should be accessed in a static way.
请检查下面的代码吗?什么应该是初始化静态变量的正确方法?我应该忽略警告还是应该将变量设为非静态?
感谢。
public class SoapClient {
private static String url;
public SoapClient(String url) {
this.url = url;
}
}
答案 0 :(得分:3)
正确的方法是静态方式:
SoapClient.url = ""
但在这里你可能需要一个常规字段:
public class SoapClient {
private final String url;
public SoapClient(final String url) {
this.url = url;
}
}
答案 1 :(得分:1)
当变量为static
时,这意味着您将为所有实例分配一个url
,而不是每个对象。您不希望对象的每个构造都更改url
。但是,如果您仍想执行此操作,则可以像SoapClient.url
一样访问它。
(在您的代码中,url
将始终保存最后一个构造对象的值。)
答案 2 :(得分:0)
通过此访问变量url发出警告。变量,指的是对象的当前实例。
然而,主要问题来自于在构造函数中分配静态变量。你想要的行为是什么?你是否真的需要每次构建一个新的SoapClient对象时,为每个 SoapClient实例重写静态URL?或者你需要每个客户端存储一个不同的网址(这对我来说听起来更好)?在这种情况下,我会像其他人建议的那样将url字段实现为常规字段(只需从字段声明中取出static
修饰符)
答案 3 :(得分:0)
有两种方式
public Login(String url) {
Login.url = url;
}
但静态变量只在类中创建一次,所以为什么要在构造函数中初始化它。你可以创建另一个静态方法并初始化url。
public static void setUrl(String url) {
Login.url = url;
}
答案 4 :(得分:0)
静态变量特定于类,而成员变量特定于类的实例。当我们考虑使用SoapClient时,您可能会认为其URL特定于该类的每个不同实例,因为每个SoapClient可能具有不同的URL地址。
这意味着从URL中删除static关键字可能更好。 如果您使用url作为成员变量,那么您已正确地对其进行了转换。
如果要将其用作静态变量,请使用:
SoapClient.url = url;
答案 5 :(得分:0)
采取from Oracle:
有时,您希望拥有所有对象共有的变量。 这是通过静态修改器完成的。有的领域 声明中的static修饰符称为静态字段或类 变量。他们与班级有关,而不是与班级有关 宾语。该类的每个实例都共享一个类变量,即 在内存中的一个固定位置。任何对象都可以更改a的值 类变量,但类变量也可以在没有的情况下进行操作 创建一个类的实例。
所以你有两个选择:
public class SoapClient {
private String url;
public SoapClient(String url) {
this.url = url;
}
}
或者:
public class SoapClient {
private static String url = "http://stackoverflow.com";
public SoapClient() {
}
}