访问静态变量
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
静态变量由类而不是其各个实例(对象)拥有。 在类之外引用静态变量是由ClassName.myStaticVariable
引入的,但在类中它与其他实例变量类似。
您始终可以在非静态方法中使用静态变量,但是在静态方法中不能使用非静态变量,因为在加载静态方法时,不会创建其他非静态实例变量。
所以你的陈述id = ++numberOfBicycles;
是完全有效的,将编译没有错误。
在类中, Bicycle
限定符对静态变量是可选的,就像this
限定符在实例变量上是可选的一样
静态变量是共享变量。 因此,您可以使用Classname.staticVariable或使用类instance.staticVariable的对象来访问它们。 无论如何,无论您创建多少个对象,您都将在内存中引用变量的单个副本。
可能是你的讲师所说的关于从课外访问他们而不是课堂内的人。 static
变量可以在类外部访问,如ClassName.VariableName
或object.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,这可能会给你一张什么是发生。