静态引用变量的行为

时间:2013-07-24 11:09:28

标签: java static

我有一个静态参考变量

static IMail mailer = null;

我在类SearchManager

的构造函数中为其分配值
public SearchManager(ILog logger, String basePath, String indexPath, String nwId, IMail mailer) {
        this.logger = logger;
        this.basePath = basePath;
        this.indexPath = indexPath;
        this.nwId = nwId;
        this.mailer = mailer;
    } 

我正在使用代码中的邮件程序。可以多次调用此类的构造函数。所以我有一个查询,告诉每次调用构造函数时这个静态引用变量的行为。当我第一次调用构造函数时,它只会占用我传递的值吗?或者每次调用构造函数时它会采用不同的值吗?

6 个答案:

答案 0 :(得分:4)

首先,您不应将'this'关键字与静态变量一起使用。您可以执行以下操作(但不推荐)

public SearchManager(ILog logger, String basePath, String indexPath, String nwId, IMail mailerarg) {
        this.logger = logger;
        this.basePath = basePath;
        this.indexPath = indexPath;
        this.nwId = nwId;
        mailer = mailerarg;
    } 

是的,它是一个静态变量,每次创建类的新对象时都会改变.Static变量属于Class而不是它的各个实例。因此,无论何时更改它的值,它都会反映在所有相应的类对象中(所有对象都有它们的类信息)。

答案 1 :(得分:1)

  

当我第一次调用构造函数时,它只会占用我传递的值吗?或者每次调用构造函数时它会采用不同的值吗?

它将采用不同的值,因为它由实例共享,并且每个实例都会看到相同的值。

根据JLS 8.3.1.1

  

如果一个字段被声明为static,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身。静态字段(有时称为类变量)在初始化类时实现

答案 2 :(得分:1)

  

当我第一次调用构造函数时,它只会占用我传递的值吗?或者每次调用构造函数时它会采用不同的值吗?

每次调用构造函数时都会使用不同的值。

静态变量并不特别特别。为变量赋值时,变量将获取该值。对于静态变量也是如此,因此如果多次分配静态变量,则每次都会更新其值。


在这种情况下,如果你使用不同的参数多次调用一个构造函数(可能),听起来非常像应该是一个实例 - spceific字段,而不是一个静态变量。这样,每个SearchManager都会引用 it 所构建的mailer,而不是最近构建的经理的邮件程序。

即使您不同意这一点,并且觉得整个应用程序应该有一个mailer,我建议您更改当前管理的方式。传递给构造函数的值倾向于用于那个实例。因此,在构造函数中设置静态变量可能会非常混乱,而且只要您想要更改值,就可以更明确地调用类似MailerSupport.setGlobalMailer(mailer)的内容。

答案 3 :(得分:1)

  

对象的所有实例共享静态数据。因此,所有的Insatnces(你的呼吁   SearchManager构造函数)将共享邮件程序。

,即首先调用SearchManager的邮件值为“X”,另一次调用SearchManager会为邮件程序设置值“Y”,现在所有实例的邮件都为Y值。

答案 4 :(得分:0)

您可以在任何时间更改其值,但所有实例都会看到相同的值。

答案 5 :(得分:0)

值可以随时更改,但所有实例都具有相同和最新的值。上次调用