为了账号安全,请及时绑定邮箱和手机立即绑定

为什么“非静态变量不能从静态上下文中引用”,而不是为一个程序生成,而不是另一个程序?

为什么“非静态变量不能从静态上下文中引用”,而不是为一个程序生成,而不是另一个程序?

潇湘沐 2022-08-17 17:08:26
我正在写一个简单的金钱追踪器作为一个实践项目。这是我的代码的缩短版本: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();自行车程序编译,而资金跟踪器不会。我确实理解那些说我不能从静态方法调用非静态变量的答案 - 但似乎其中一个程序允许我这样做,那么区别在哪里?
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这很简单。

在第一个示例中,您将在静态方法之外生成变量。salary1

在第二个示例中,您将在静态方法中生成变量,该变量不是整个 Bike 类。bike


查看完整回答
反对 回复 2022-08-17
?
心有法竹

TA贡献1866条经验 获得超5个赞

当我开始使用Java时,我遇到了同样的问题,然后我把静态放在任何地方,这是错误的选择!


您的“静态上下文”是静态方法主(请注意方法名称前面的“static”关键字)。静态方法不是对象的方法,而是类的方法。静态方法只能访问类的字段(以 static 关键字为前缀的字段),这些类型的字段在此类的所有对象之间共享。


例如,尝试:


public class Counter {

    private static int cpt = 0;


    public int incr() {

        cpt = cpt + 1;

        return cpt;

    }


    public static void main(String args[]) {

        Counter counter1 = new Counter();

        Counter counter2 = new Counter();

        System.out.println(counter1.incr()); // print 1

        System.out.println(counter2.incr()); // print 2

    }

}

在这里,即使我只在“counter2”上调用了一次“incr”,它也返回“2”,因为“cpt”在counter1和counter2之间共享。


那么,如何解决您的问题。您必须访问对象的字段(也称为实例的字段)会抛出一个实例标识符,如“counter1.cpt”或在对象的方法中(如“incr()”)。这里有一个修复你的第一堂课:


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(monthlySpend.salary1);

    }

}

希望它能帮助你。


查看完整回答
反对 回复 2022-08-17
?
ITMISS

TA贡献1871条经验 获得超8个赞

这是因为main方法是静态的,并且您尝试在那里引用非静态字段(salary1),执行.在第二个示例中,您没有在静态 main 方法中引用任何非静态字段,这就是为什么没有错误的原因。使用 getters/setters。希望我帮助了:)System.out.println(salary1)



查看完整回答
反对 回复 2022-08-17
  • 3 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信