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
也没有错误
答案 0 :(得分:13)
静态变量由类而不是其各个实例(对象)拥有。引用类外部的静态变量是ClassName.myStaticVariable
,但在类中它与其他实例变量类似。
您总是可以在非静态方法中使用静态变量,但是在静态方法中不能使用非静态变量,因为当加载静态方法时,不会创建其他非静态实例变量。
所以你的语句id = ++numberOfBicycles;
完全有效,编译时没有错误。
答案 1 :(得分:5)
在类中,Bicycle
限定符对静态变量是可选的,就像this
限定符在实例变量上是可选的
答案 2 :(得分:3)
可能是你的讲师所说的关于从课外访问他们而不是课堂内的人。可以在类外static
或ClassName.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。 没必要,因为我们已经在该类中,因此编译器可以推断出来。