1

我有以下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();
    }
}
4

8 回答 8

6

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

于 2010-12-22T15:38:25.207 回答
3

没有不同。

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

我的喜好,按顺序:

  • 在类本身中,我只会引用没有限定符的字段

  • 使用类名

  • 仅当您觉得字​​段/方法的静态性质可能会改变时才使用this或实例,并且这是一个设计细节,类的客户不应该依赖它是静态的(在这种情况下,我会考虑将其设为无论如何都要确保如何访问实例方法)

于 2010-12-22T15:38:07.357 回答
2

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

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

于 2010-12-22T15:37:56.243 回答
1

来自Java 教程:了解实例和类成员

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

Bicycle.numberOfBicycles

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

注意:您还可以使用对象引用来引用静态字段,例如

myBike.numberOfBicycles

但不鼓励这样做,因为它没有明确说明它们是类变量。

于 2010-12-22T15:40:56.273 回答
0

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

因此,尽管您可以从任何实例访问它,但不鼓励这种用法,因为它暗示密码是特定于实例的。

于 2010-12-22T15:38:54.660 回答
0

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

于 2010-12-22T15:41:10.317 回答
0

好吧,静态变量不是实例变量。因此,静态实例变量不是一个有效术语。

于 2010-12-22T15:41:44.407 回答
0

你也不需要使用。

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

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

于 2014-09-02T20:47:45.507 回答