當前位置:首頁 » 文件傳輸 » 靜態一定不能訪問非靜態嗎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

靜態一定不能訪問非靜態嗎

發布時間: 2022-05-15 21:17:51

1. Java靜態方法為什麼不能訪問非靜態方法

  1. 非靜態方法的是可以直接訪問對象的變數的,這意味著,對象的變數不一樣,運行這個非靜態方法的結果可能就不一樣。這是很有意義的,比如我有1塊錢(狀態),那我就可以買辣條(操作),你有1毛錢,那你就買不到辣條。因為人買辣條的操作需要跟他的錢關聯。

  2. 靜態方法的意義在於不依賴對象的狀態,是類所有。靜態方法不能訪問非靜態方法,就是因為靜態方法不可以跟對象的狀態有關系,而非靜態方法是可以跟對象狀態產生關聯的。

2. 為什麼靜態函數中不能訪問非靜態成員而我這代碼可以

本來「靜態函數中不能訪問非靜態成員」就是 為了讓規則簡單而失去了重要的細節,以至於從正確走向錯誤 的陳述。
縮句:本來「靜態函數中不能訪問非靜態成員」就是錯誤的陳述。

非靜態函數(面向對象中稱為「方法」method)以 a.f(blahblah) 的方式調用,其中 a 代表一個對象,方法 f 可以用訪問(讀取和修改) a 的成員。靜態函數通常以 Ty.f(blahblah) 的方式調用,其中 Ty 是類,因為點號的左邊沒有對象,所以不能訪問「根本不存在」的對象的成員。

3. java中為什麼靜態方法不能訪問非靜態方法或者變數

因為靜態方法是屬於類的,而非靜態屬於對象的,當你用類的方法訪問對象的,那麼這個對象哪來的?所以無法訪問非靜態 。

4. java初學,為什麼靜態的方法不能訪問非靜態的成員

1、是一種規范啦,構造方法調用構造方法,總要跟調用方法有點區別吧,一個類裡面構造方法的名稱只能是類名,改變的是他的參數,所以寫括弧裡面(等同於類名(各種參數))(且this只能寫在第一行,因為構造方法執行的順序優先方法);而方法有多個,且名字隨便取,這里的this.方法名(),(不是類名哦) this代表了本類的實例對象,等同於類名.方法名();

2、你的第二個問題我回答了好多次了,靜態修飾的東西,他是不依賴實例來的,就是你只需要聲明了這個對象,他就會先去給靜態的開辟空間並且賦值。而非靜態的屬性,是要依賴實例的,比如你聲明了一個對象,沒有去new,直接去調用他們裡面的屬性,一定會報空指針異常。因為你還沒有給這個對象開辟空間(用new關鍵字開辟空間)。
靜態的方法只能訪問靜態的成員這樣理解:你聲明了對象,你調用靜態方法,要使用的就是已經生成的屬性(只有靜態屬性才在聲明時就生成了) 而非靜態的要new了以後才能生成。這就是你老師說的,靜態方法先進來,非靜態的後進來(new 了之後再進來)。
非靜態的可以訪問靜態的,因為你能調用非靜態的方法,說明你已經實例化這個對象了,就是new了對象,他去調用在new之前就生成了的靜態屬性,有何不可呢?

5. 為什麼靜態方法不能訪問非靜態方法

簡單點說:靜態成員屬於類,不需要生成對象就存在了.而非靜態需要生成z對象才產生.
所以靜態成員不能直接訪問.
下面說說靜態的特點:
1.隨著類的載入而載入
也就是,說靜態會隨著類的消失而消失,說明靜態的生命周期最長
2.優先於對象的存在
明確一點:靜態是先存在的對象是後存在的
3.被所有對象共享
4.可以直接被類名多調用
實例變數和類變數的區別
1.存放位置類變數隨著類的載入存在於方法區中,實例變數隨著對象的對象的建立存在於堆內存里
2.生命周期類變數生命周期最長,隨著「類」的載入而載入,隨著類的消失而消失
實例變數隨著「對象」的消失而消失
靜態的使用注意事項:
1.靜態方法只能訪問靜態成員(包括成員變數和成員方法)
非靜態方法可以訪問靜態也可以訪問非靜態
2.靜態方法中不可以定義this,super關鍵字
因為靜態優先於對象存在,所以靜態方法中不可以出現this,super關鍵字
3.主函數是靜態的。靜態的利弊利:對
對象的共享數據進行單獨空間的存儲,節省空間,沒有必要沒一個對象中都存儲一份
可以直接被類名所調用弊:生命周期過長,訪問出現局限性(只能訪問靜態)

6. 靜態成員函數為什麼不能訪問本類中的非靜態成員

和靜態數據成員一樣,靜態成員函數是類的一部分,而不是對象的一部分。如果要在類外調用公用的靜態成員函數,要用類名和域運算符「∷」。如 Box∷volume( ); 實際上也允許通過對象名調用靜態成員函數,如 a.volume( ); 但這並不意味著此函數是屬於對象a的,而只是用a的類型而已。 靜態成員函數的作用是為了能處理靜態數據成員。 可以說,靜態成員函數與非靜態成員函數的根本區別是:非靜態成員函數有this指針,靜態成員函數並不屬於某一對象,它與任何對象都無關,靜態成員函數沒有this指針。由此決定了靜態成員函數不能訪問本類中的非靜態成員。 在C++程序中,靜態成員函數主要用來訪問靜態數據成員,而不訪問非靜態成員。假如在一個靜態成員函數中有以下語句: cout<<height<<endl; //若height已聲明為static,則引用本類中的靜態成員,合法 cout<<width<<endl; //若width是非靜態數據成員,不合法 但是,並不是絕對不能引用本類中的非靜態成員,只是不能進行默認訪問,因為無法知道應該去找哪個對象。如果一定要引用本類的非靜態成員,應該加對象名和成員運算符「.」。如 cout<<a.width<<endl; //引用本類對象a中的非靜態成員

7. java中靜態方法里可以訪問非靜態變數嗎

不可以的 JAVA中的對應關系為:

靜態方法中 只可以訪問靜態變數,不可以訪問非靜態變數

8. 為什麼靜態成員不能訪問非靜態成員

簡單點說:靜態成員屬於類,不需要生成對象就存在了.而非靜態需要生成對象才產生. 所以靜態成員不能直接訪問. 下面說說靜態的特點: 1.隨著類的載入而載入 也就是,說靜態會隨著類的消失而消失,說明靜態的生命周期最長 2.優先於對象的存在 明確一點:靜態是先存在的對象是後存在的 3.被所有對象共享 4.可以直接被類名多調用 實例變數和類變數的區別 1.存放位置類變數隨著類的載入存在於方法區中,實例變數隨著對象的對象的建立存在於堆內存里 2.生命周期類變數生命周期最長,隨著「類」的載入而載入,隨著類的消失而消失 實例變數隨著「對象」的消失而消失 靜態的使用注意事項: 1.靜態方法只能訪問靜態成員(包括成員變數和成員方法) 非靜態方法可以訪問靜態也可以訪問非靜態 2.靜態方法中不可以定義this,super關鍵字 因為靜態優先於對象存在,所以靜態方法中不可以出現this,super關鍵字 3.主函數是靜態的。靜態的利弊利:對 對象的共享數據進行單獨空間的存儲,節省空間,沒有必要沒一個對象中都存儲一份 可以直接被類名所調用弊:生命周期過長,訪問出現局限性(只能訪問靜態)

9. JAVA 里既然靜態方法無法調用非靜態方法,那主方法main 裡面,為什麼可以通過對像,來調用非靜態方法的呢

非靜態成員函數在執行前必須先構造並實例化該函數所在的類。
如果允許非靜態的main,那麼main函數所在的類必須先進行實例化,
那麼就需要再寫個函數去實例化main所在的類,再調用main,這個實例化代碼又寫在哪呢?如果它也是非靜態的,豈不是又要寫個函數去實例化它所在的類嘛?
因此,java語言就規定了main必須是靜態的。