12
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。IEClassName.VariableName

但是在上面的代码中,这条语句如何id = ++numberOfBicycles;编译没有错误,即使变量numberOfBicyclesstatic

4

8 回答 8

21

静态变量由类拥有,而不是由其单个实例(对象)拥有。在类外部引用静态变量是通过ClassName.myStaticVariable但在类内部它类似于其他实例变量。

您始终可以在非静态方法中使用静态变量,但不能在静态方法中使用非静态变量,原因是在加载静态方法时未创建其他非静态实例变量。

所以你的陈述id = ++numberOfBicycles;是完全有效的,并且会编译没有错误。

于 2013-06-02T06:58:38.370 回答
7

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

于 2013-06-02T06:19:08.307 回答
5

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

于 2013-06-02T06:21:37.283 回答
4

可能是您的讲师所说的关于从课外而不是从课内访问它们。static变量可以像这样ClassName.VariableNameobject.VariableName. 但是,第一种方法是可取的。

在类内部,您可以使用this关键字或classname-qualifier消除方法和构造函数中同名的局部变量的歧义。

于 2013-06-02T06:19:48.060 回答
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 的主要课程中对我来说工作得很好

于 2013-06-02T07:09:55.550 回答
1

鉴于你的课..

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

    // ..
}

当我创建一个自行车类型的对象时,它会是这样的:

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());
于 2013-06-02T06:47:14.393 回答
1

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

于 2013-06-02T07:05:21.987 回答
1

你没有写 Bicycle.numberOfBicycles。这不是必需的,因为我们已经在那个类中,所以编译器可以推断它。

于 2019-07-09T08:54:39.103 回答