亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么“非靜態變量不能從靜態上下文中引用”,而不是為一個程序生成,而不是另一個程序?

為什么“非靜態變量不能從靜態上下文中引用”,而不是為一個程序生成,而不是另一個程序?

瀟湘沐 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 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號