访问静态变量

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; 编译没有错误,即使变量numberOfBicyclesstatic

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

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

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

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

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

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

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

  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的主要class级工作对我来说很好

鉴于你的class级..

 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()); 

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