为静态变量赋值的正确方法是什么?

时间:2014-01-08 13:14:00

标签: java

我正在尝试在类构造函数中初始化变量,但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;
    }
}

6 个答案:

答案 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() {

    }
}