我正在写一个简单的金钱追踪器作为一个实践项目。这是我的代码的缩短版本:
public class MoneyTracker {
float salary1;
public void enterSalary1(float newValue){
salary1 = newValue;
}
public static void main(String[] args) {
MoneyTracker monthlySpend = new MoneyTracker();
monthlySpend.enterSalary1(1385.50f);
System.out.println(salary1);
}
}
这将产生错误:
non-static variable salary1 cannot be referenced from a static context.
阅读一些线程后,我将变量更改为读取以解决问题。static float salary1;
但是,我有另一个简单的程序,它是我在Oracle网站上的java教程之后构建的,它具有非常相似的设置,据我所知,应该会导致相同的错误,但是这可以编译并运行而不会出现问题。代码:
public class Bicycle{
//declare instance fields
int gear = 1;
int speed = 0;
int pedalRPM = 0;
//constructor classes
public void changePedalRPM(int newValue){
pedalRPM = newValue;
}
public void changeGear(int newValue){
gear = newValue;
}
public void speedUp(int increment){
speed = speed + increment;
}
public void applyBrake(int decrement){
speed = speed + decrement;
}
public void printStates(){
System.out.println("pedalRPM:" + pedalRPM + " speed:" + speed + " gear:" + gear);
}
public static void main(String[] args) {
Bicycle bike = new Bicycle();
bike.changeGear(2);
bike.changePedalRPM(85);
bike.speedUp(15);
bike.printStates();
bike.speedUp(5);
bike.printStates();
}
}
我意识到这里有一个从主方法内部调用的方法,这是唯一的区别,但是我已经用我的钱跟踪器尝试了一下,我仍然得到非静态变量错误。printStates
有没有人能向我解释为什么我从相对相似的程序中得到两个不同的结果?奇怪的是,如果main方法必须是静态的,并且没有教程会提到这一点,这就是使用变量的地方。
编辑 - 请允许我澄清我的想法。
在我的钱跟踪器示例中,我在与自行车等效的地方使用等效代码。自行车代码直接来自Oracle,因此它必须是一种有效的做事方式。
我有:
float salary1;
在同一个地方
int gear = 1;
我的构造函数
public void enterSalary1(float newValue){
salary1 = newValue;
}
与(例如)位于同一位置
public void changeGear(int newValue){
gear = newValue;
}
然后,我在 main 方法中创建了该类的新实例:
MoneyTracker monthlySpend = new MoneyTracker();
自行车程序编译,而资金跟踪器不会。我确实理解那些说我不能从静态方法调用非静态变量的答案 - 但似乎其中一个程序允许我这样做,那么区别在哪里?
MMMHUHU
心有法竹
ITMISS
相关分类