访问静态变量

时间:2013-06-02 06:15:59

标签: java

public class Bicycle {

    private int cadence;
    private int gear;
    private int speed;
    private int id;
    private static int numberOfBicycles = 0;

    public Bicycle(int startCadence, int startSpeed, int startGear){
        gear = startGear;
        cadence = startCadence;
        speed = startSpeed;

        id = ++numberOfBicycles;
    }
       // ...
}

我在课堂上学到了Static variables should be accessed by calling with class name。即ClassName.VariableName

但是在上面的代码中,即使变量id = ++numberOfBicycles;numberOfBicycles

,如何编译此语句static也没有错误

8 个答案:

答案 0 :(得分:13)

静态变量由类而不是其各个实例(对象)拥有。引用类外部的静态变量是ClassName.myStaticVariable,但在类中它与其他实例变量类似。

您总是可以在非静态方法中使用静态变量,但是在静态方法中不能使用非静态变量,因为当加载静态方法时,不会创建其他非静态实例变量。

所以你的语句id = ++numberOfBicycles;完全有效,编译时没有错误。

答案 1 :(得分:5)

在类中,Bicycle限定符对静态变量是可选的,就像this限定符在实例变量上是可选的

答案 2 :(得分:3)

可能是你的讲师所说的关于从课外访问他们而不是课堂内的人。可以在类外staticClassName.VariableName访问object.VariableName个变量。但是第一种方法是可取的。

从类内部不需要你可以使用this关键字或classname-qualifier来消除方法和构造函数中具有相同名称的局部变量的歧义。

答案 3 :(得分:3)

静态变量是共享变量。因此,您可以使用Classname.staticVariable或使用类instance.staticVariable的对象来访问它们。无论如何,无论您创建多少个对象,您都将在内存中引用变量的单个副本。

答案 4 :(得分:2)

 public int getID(){
    return numberOfBicycles;
}

public static int getNOB(){
    return numberOfBicycles;
}


在自行车课上

    Bicycle bc = new Bicycle(30, 90, 1);
    System.out.println(Bicycle.getNOB());
    System.out.println(bc.getID());

    Bicycle bc2 = new Bicycle(30,90, 1);
    System.out.println(Bicycle.getNOB());
    System.out.println(bc2.getID());

    Bicycle bc3 = new Bicycle(30,90, 1);
    System.out.println(Bicycle.getNOB());
    System.out.println(bc3.getID());

    Bicycle bc4 = new Bicycle(30,90, 1);
    System.out.println(Bicycle.getNOB());
    System.out.println(bc4.getID());


在BicycleTest的主要班级对我来说工作得很好

答案 5 :(得分:1)

鉴于你的班级..

public class Bicycle
{
    private int cadence;
    private int gear;
    private int speed;
    private int id;
    private static int numberOfBicycles = 0;

    // ..
}

当我创建Bicycle类型的对象时,它将是这样的:

Bicycle a = new Bicycle (1,2,3);

Bicycle b = new Bicycle (2,3,4);

在记忆中,就像这样:

[a] --> { id:1, cadence:1, gear:2, speed:3 }

[b] --> { id:2, cadence:2, gear:3, speed:4 }

numberOfBicycles是静态的,所以它不是任何Bicycle对象的一部分,它与类不是一个对象有关,所以它在内存中会是这样的:

[Bicycle] --> { numberOfBicycles:2 }

为了访问静态成员,首先我们为它定义一个静态getter:

public static int getNumberOfBicycles ()
{
    return numberOfBicycles;
}

然后我们从课堂上调用它:

System.out.println(Bicycle.getNumberOfBicycles());

答案 6 :(得分:1)

非静态方法可以访问类的静态成员,因为只存在静态变量的单个副本,而实例变量只有在创建了该类型的新对象后才会创建。
我建议您测试另一个类,例如BicycleTest,它将拥有主类,然后创建4Bicycle对象,并在Bicycle类中使用2getters,每次创建对象时都会检索numberofBicycles和ID,这可能会给你一个发生了什么事。

答案 7 :(得分:1)

您没有写Bicycle.numberOfBicycles。 没必要,因为我们已经在该类中,因此编译器可以推断出来。