使用关键字this和Class name访问静态实例变量之间的区别

时间:2010-12-22 15:35:05

标签: java instance-variables this-keyword

我有以下java类。当我在构造函数中调用login方法时,我使用类名访问静态实例变量username,使用关键字password访问静态实例变量this。我的问题是这两种方法有什么区别?在什么情况下应该使用哪一个?

public class MyClass {
    private Main main;

    private static String username = "mylogindetails";

    private static String password = "mypassword";

    public MyClass(){
        this.main = new Main();
        this.main.login(MyClass.username, this.password);
    }


    public static void main(String args[]){
        MyClass myclass = new myclass();
    }
}

8 个答案:

答案 0 :(得分:6)

它们都是等价的 但是,使用this访问静态成员具有误导性,应该不惜一切代价避免使用。

答案 1 :(得分:3)

没有区别。

有些人认为应该通过类名访问static字段或方法,而不是通过this或实例,以突出显示它是static。例如,Eclipse有一个配置设置,用于标记有关通过实例引用访问的静态资源的警告。

我的偏好,按顺序:

    在课堂内
  • ,我只会引用没有限定符的字段

  • 使用班级名称

  • 仅当您认为字段/方法的静态特性可能发生变化时才使用this或实例,并且该类的客户端不应依赖静态设计细节(在这种情况下,我会考虑将其作为实例方法,以确保如何访问它。

答案 2 :(得分:2)

在这种情况下没有区别,我认为它被编译为相同的字节码(GETSTATIC)。

MyClass.username是首选,因为它反映了该领域的性质。

答案 3 :(得分:1)

来自Java Tutorial: Understanding Instance and Class Members

  

类变量由引用   类名本身,如

     

Bicycle.numberOfBicycles

     

这清楚表明它们是   类变量。

     

注意:您还可以使用像

这样的对象引用来引用静态字段      

myBike.numberOfBicycles

     

但这是不鼓励的,因为它没有说清楚它们是什么   类变量。

答案 4 :(得分:0)

您班级的所有实例共享相同的密码;密码属于到类,而不是每个实例,这就是静态的含义。

因此,尽管您可以从任何实例访问它,但不建议使用此类用法,因为它表明密码是特定于实例的。

答案 5 :(得分:0)

请记住,静态变量在MyClass的所有实例中共享,因此使用它来引用它们会产生误导。真的,这只是一种风格差异,但你不应该养成用它来引用它的习惯。

答案 6 :(得分:0)

嗯,静态变量不是实例变量。因此,静态实例变量不是有效的术语。

答案 7 :(得分:0)

您也不需要使用。

因为你有一个内部类,你可以直接访问静态变量,而不需要显式引用外部类或者这个

如果使用静态字段令人困惑,您可以将它们全部上限以区分它们。这通常保留给作为常量的最终静态字段。