本文目錄一覽:
- 1、C語言中非Static局部變量在什麼中生成?
- 2、靜態方法和非靜態方法的區別是什麼
- 3、C語言中全局變量可以是非靜態變量嗎
- 4、C語言調用C++非靜態成員函數
- 5、在C語言中,什麼叫做非靜態成員函數
- 6、c#中靜態欄位與非靜態欄位有什麼區別
C語言中非Static局部變量在什麼中生成?
局部變量,一般都是在函數體當中的定義,當程序執行到這個函數體的時候,也就是進入到這個函數體的作用域範圍,win32操作系統對於局部變量是使用時候才申請空間,程序退出局部變量的作用域範圍以後,這個局部變量就失去意義,對於這樣的局部變量,系統都是在棧中給予分配空間的,
所以:而非Static局部變
量在__________________________中生成? as:棧
靜態方法和非靜態方法的區別是什麼
一、相同點:
靜態類和非靜態類在C#中定義基本是一樣的,只是靜態類定義需要加上static修飾符而已。
二、生命周期:
靜態方法(Static Method)與靜態成員變量一樣,屬於類本身,在類裝載的時候被裝載到內存(Memory),不自動進行銷毀,會一直存在於內存中,直到JVM關閉。
非靜態方法(Non-Static Method)又叫實例化方法,屬於實例對象,實例化後才會分配內存,必須通過類的實例來引用。不會常駐內存,當實例對象被JVM回收之後,也跟着消失。
三、效率:
靜態方法的使用效率比非靜態方法的效率高。
按照上面的概念,只要內存夠用,都可以使用靜態的。
四、線程安全:
靜態方法是共享代碼段,靜態變量是共享數據段。既然是「共享」就有並發(Concurrence)的問題。
非靜態方法是針對確定的一個對象的,所以不會存在線程安全的問題。
靜態方法和實例方法是一樣的,在類型第一次被使用時加載。調用的速度基本上沒有差別。
五、靜態成員與非靜態成員比較:
1、靜態成員屬於類所有,非靜態成員屬於類的實例所有。
2、每創建一個類的實例,都會在內存中為非靜態成員新分配一塊存儲;非靜態成員屬於類所有,為各個類的實例所公用,無論類創建了多少實例,類的靜態成員在內存中只佔同一塊區域。
六、使用不同:
1、靜態方法屬於類所有,類實例化前即可使用。
2、非靜態方法可以訪問類中的任何成員,靜態方法只能訪問類中的靜態成員。
3、因為靜態方法在類實例化前就可以使用,而類中的非靜態變量必須在實例化之後才能分配內存,static內部只能出現static變量和其他static方法!而且static方法中還不能使用this….等關鍵字..因為它是屬於整個類!
4、靜態方法效率上要比實例化高,靜態方法的缺點是不自動進行銷毀,而實例化的則可以做銷毀。
5、靜態方法和靜態變量創建後始終使用同一塊內存,而使用實例的方式會創建多個內存.
C語言中全局變量可以是非靜態變量嗎
在C語言中,全局變量可以是非靜態變量的。
原因如下:
靜態變量的關鍵static對局部變量和全局變量的作用不一樣。
對於局部變量來說,用static修飾時,該變量在函數調用後的值一直保持上次的結果。
對於全局變量來說,用static修飾的全局變量表示這個全局變量只能在當前這個全局變量定義的文件內使用;如果沒有static修飾,表示這個文件定義的全局變量也可以被其它文件調用。
舉例如下:
#includestdio.h
static int a; // 定義一個靜態的全局變量,只能在本文件中引用
int b; // 定義一個非靜態的全局變量,在同一工程下的其他文件也可引用(需用extern關鍵字聲明)
void main()
{
a = 2;
b = 4;
printf(“%d%d”, a, b);
}
C語言調用C++非靜態成員函數
不管是不是靜態的,都不能直接調用
而是要加一層C++的封裝。
而且封裝的函數,必須加extern “C”才可以。
在C語言中,什麼叫做非靜態成員函數
#include iostream.h
class ok
{
int a;
static int s;//聲明靜態數據成員
public:
ok(int a);
static void show();//聲明靜態成員函數
};
int ok::s=0;//定義並初始化靜態數據成員
ok::ok(int a)
{
this-a=a;
s+=a; //非靜態成員函數可以訪問靜態數據成員
}
void ok::show() //靜態成員函數的實現
{
//coutaendl; //錯誤代碼,a是非靜態數據成員
cout”s=”sendl;
}
void main()
{
ok cat(2);
cat.show();
ok dog(3);
dog.show();
ok::show();
}
/*————————————————————
○靜態成員之間可以相互訪問,如靜態成員函數訪問靜態數據成員和靜態成員函數;
○靜態成員函數沒有this指針。無法訪問屬於類對象的非靜態數據成員和非靜態成員函數,
○非靜態成員函數可以訪問靜態成員函數和靜態數據成員;
○靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;
○由於沒有this指針的額外開銷,因此靜態成員函數與類的非靜態函數相比速度上會有少許的增長;
○非靜態成員函數總是具體的屬於某個類的具體對象,this是缺省的;
————————————————————-*/
c#中靜態欄位與非靜態欄位有什麼區別
c#中靜態欄位與非靜態欄位有什麼區別 c#中靜態欄位和非靜態欄位以static標識區分,主要區別是靜態欄位可以直接以類名.欄位名方式使用,而非靜態欄位必須建立類例項才可以使用,示例如下:
class Program{ static void Main(string[] args) { Console.WriteLine(test.v1); Console.WriteLine((new test()).v2); }}class test{ public static string v1 { get { return “v1”; } } public string v2 { get { return “v2”; } }}
另外,靜態欄位在裝載程式集的時候就分配記憶體空間,而非靜態欄位要在例項初化時候才分配記憶體空間。
java中,靜態欄位和例項欄位有什麼區別
靜態方法和例項方法的區別主要體現在兩個方面:
在外部呼叫靜態方法時,可以使用”類名.方法名”的方式,也可以使用”物件名.方法名”的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。
靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問例項成員變數和例項方法;例項方法則無此限制。
具體來說:
一、例項欄位要例項化才能使用,沒有例項化不能使用。靜態欄位反之。如:
name欄位的使用:
cla1 i = new cla1();
i.name = “張三”;
sex欄位的使用:
cla1.sex = “男”;
二、普通欄位要在例項化時候才分配記憶體空間,而靜態欄位在裝載程式集的時候就分配記憶體空間了。
java靜態方法與非靜態方法有什麼區別
靜態方法和例項方法的區別主要體現在兩個方面:
在外部呼叫靜態方法時,可以使用”類名.方法名”的方式,也可以使用”物件名.方法名”的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。
靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問例項成員變數和例項方法;例項方法則無此限制。
下面幾個例子展示了這一區別。
1、呼叫靜態方法示例。
———–檔名hasStaticMethod.java,程式編號1—————–public class hasStaticMethod{定義一個靜態方法public static void callMe(){System.out.println(“This is a static method.”);}}
下面這個程式使用兩種形式來呼叫靜態方法。
———–檔名invokeStaticMethod.java,2—————–
public class invokeStaticMethod{public static void main(String args[]){hasStaticMethod.callMe(); 不建立物件,直接呼叫靜態方法 hasStaticMethod oa = new hasStaticMethod(); 建立一個物件oa.callMe(); 利用物件來呼叫靜態方法}} 程式3.36兩次呼叫靜態方法,都是允許的,程式的輸出如下:
This is a static method.This is a static method.
允許不建立物件而呼叫靜態方法,是Java為了減少程式設計師呼叫某些常用方法時的麻煩,而允許程式設計師按照傳統的C語言中使用函式的方式來使用方法。典型的例子是前面某些程式中使用”Math.ramdon()”來獲取隨機數。
2、靜態方法訪問成員變數示例。
———–檔名aessMember.java,程式編號3.37—————–class aessMember{private static int sa; 定義一個靜態成員變數private int ia; 定義一個例項成員變數下面定義一個靜態方法static void statMethod(){int i = 0; 正確,可以有自己的區域性變數sa = 10; 正確,靜態方法可以使用靜態變數otherStat(); 正確,可以呼叫靜態方法ia = 20; 錯誤,不能使用例項變數insMethod(); 錯誤,不能呼叫例項方法}static void otherStat(){} 下面定義一個例項方法 void insMethod(){int i = 0; 正確,可以有自己的區域性變數sa = 15; 正確,可以使用靜態變數ia = 30; 正確,可以使用例項變數statMethod(); 正確,可以呼叫靜態方法}}
本例其實可以概括成一句話:靜態方法只能訪問靜態成員,例項方法可以訪問靜態和例項成員。之所以不允許靜態方法訪問例項成員變數,是因為例項成員變數是屬於某個物件的,而靜態方法在執行時,並不一定存在物件。同樣,因為例項方法可以訪問例項成員變數,如果允許靜態方法呼叫例項方法,將間接地允許它使用例項成員變數,所以它也不能呼叫例項方法。基於同樣的道理,靜態方法中也不能使用關鍵字this。
main()方法是一個典型的靜態方法,它同樣遵循一般靜態方法的規則,所以它可以由系統在建立物件之前就呼叫。
首先,兩者本質上的區別是:靜態方法是在類中使用staitc修飾的方法,在類定義的時候已經被裝載和分配。而非靜態方法是不加static關鍵字的方法,在類定義時沒有佔用記憶體,只有在類被例項化成物件時,物件呼叫該方法才被分配記憶體。
其次,靜態方法中只能呼叫靜態成員或者方法,不能呼叫非靜態方法或者非靜態成員,而非靜態方法既可以呼叫靜態成員或者方法又可以呼叫其他的非靜態成員或者方法。
靜態方法可以直接用類名點出來方法,而普通方法需要建立類的物件後才能呼叫! 靜態的方法和變數會呼叫時在記憶體生成一個唯一的標示,你可以理解成在實體記憶體中給靜態一個位子,這樣的話在呼叫的時候可以直接找到,而且會節省記憶體,但是如果你宣告的靜態過多的話那麼每一個都會在記憶體有一個位子,那麼你就沒有資源執行別的,會報記憶體溢位! 普通方法是由java的gc機制(垃圾回收機制)來控制,可能同一個物件或變數在使用的過程中,這個時間的在記憶體佔了一個位子,而上個時間的還沒有從記憶體中刪除,這樣的話就可能有2個一樣的在記憶體中,這個2個一樣東西只是內容值一樣,但是記憶體值不一樣,你可以用”==”和”equals”來檢視(這個只適用物件和String型別).java的gc機制會根據執行時的記憶體狀態來自動清除一些用不到變數或物件,就算你手動呼叫gc也是一樣的!
靜態方法在建立物件前就可以使用了,非靜態方法必須通過new出來的物件呼叫。
如:
public class Per{
public static String getType(){
return “人類”;
}
public String getName(){
return “張三”;
}
}
上面這個類中的getType方法,在沒有new物件前這就可以這樣用:
String type=Per.getType();type=”人類”;
而getName方法則不能這樣使用,編譯都不會通過
getName必須這樣:
Per p=new Per();
String name=p.getName();name=”張三”;
當然,getType方法也可能通過物件呼叫:
String type=p.getType();type=”人類”;
綜上所述:
靜態方法是在建立例項之前就存在了,而非靜態方法是在建立物件之後才有的。
靜態方法可以直接用類名點出來方法,而普通方法需要建立類的物件後才能呼叫!
靜態的方法和變數會呼叫時在記憶體生成一個唯一的標示,你可以理解成在實體記憶體中給靜態一個位子,這樣的話在呼叫的時候可以直接找到,而且會節省記憶體,但是如果你宣告的靜態過多的話那麼每一個都會在記憶體有一個位子,那麼你就沒有資源執行別的,會報記憶體溢位!
普通方法是由java的gc機制來控制,可能同一個物件或變數在使用的過程中,這個時間的在記憶體佔了一個位子,而上個時間的還沒有從記憶體中刪除,這樣的話就可能有2個一樣的在記憶體中,這個2個一樣東西只是內容值一樣,但是記憶體值不一樣,你可以用”==”和”equals”來檢視(這個只適用物件和String型別).java的gc機制會根據執行時的記憶體狀態來自動清除一些用不到變數或物件,就算你手動呼叫gc也是一樣的!
java靜態與非靜態區別
靜態方法和例項方法的區別主要體現在兩個方面:
在外部呼叫靜態方法時,可以使用”類名.方法名”的方式,也可以使用”物件名.方法名”的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。
靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問例項成員變數和例項方法;例項方法則無此限制。
c#靜態方法與非靜態方法有啥區別
靜態方法,也稱為類方法。其特點是:不需要例項化類就可以呼叫
非靜態方法,也成例項方法,其特點是:先例項化類,然後通過例項呼叫
class MyClass{ 靜態方法 public static void SomeStaticMethod() { …… } 非靜態方法 public void SomeMethod() { …… }} 呼叫靜態方法: 通過 類.靜態方法 格式呼叫MyClass.SomeStaticMethod( );************************************************ 對於非靜態方法MyClass c = new MyClass();c.SomeMethod(); 非靜態方法必須通過例項來呼叫
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/277478.html