C\C++与Java中的static关键字
C\C++里面的static:
面向過程的static:
在c和c++面向過程的設計里,在全局變量前加上static關鍵字則可將該變量定義為一個靜態全局變量,比如:
static int a;
那么c和c++中的靜態全局變量有什么特點呢:
1、????? 變量在全局數據區分配內存(局部變量在棧內,通過new和malloc動態分配的變量在堆里);
2、????? 未經初始化的全局變量會被程序自動初始化為0;
3、????? 靜態全局變量或函數在聲明它的文件內是可見的,在文件外是不可見的;(可以起到保護作用)
講講第三點,如果我們只是在某個頭文件中聲明了一個普通的全局變量a,那么在引用這個頭文件的時候,我們也可以通過extern關鍵字將這個變量引用到當前文件中;但是如果你在聲明那個變量的時候就加了static關鍵字,那么全局變量a對于其他任何文件都是不可見的。
同樣的,如果以static方式定義了一個函數,那么這個函數只在定義它的文件內可見。
面向對象的static:
在面向對象設計里面,使用static有幾點要注意:
1、????? 靜態成員函數的聲明在類內要加上static關鍵字,但是在類外實現的時候不需要;
2、????? 靜態成員函數沒有this指針,所以不要嘗試顯示或隱式地在靜態成員函數內引用這個指針,這種做法會導致編譯期間報錯。因此也就不要嘗試些什么在構造函數中給靜態成員變量初始化的動作了。
下面寫個小例子感受一下面向對象的static:
首先定義一個頭文件account.h,在頭文件中定義一個類:
#pragma once class Account { public:static void reiseInterest(double var );static double interest(){return dInterest; } //類內給出實現,語句簡單,無遞歸,與類外實現并聲明為inline函數都是相同的,均為內聯函數 private:static double dInterest ; }; double Account::dInterest = 5; //靜態數據成員初始化 inline void Account::reiseInterest(double var) {dInterest += var; }接著在源文件中進行測試:
#include <iostream> #include "account.h" using namespace std; int main() {//double Account::dInterest = 5; //錯誤!!static關鍵字限制了可視域!!cout<<"The initial interest is "<<Account::interest()<<endl;Account ac1;Account ac2;ac1.reiseInterest(18);ac2.reiseInterest(17);cout<<"The current interest is "<<Account::interest()<<endl;return 0; }運行結果如下:
?
?
Java部分:
Java中,在一個類里面,一個變量一旦聲明,即使沒有對變量進行初始化,它們也會獲得一個默認值。不過需要注意的是,只有當變量作為一個類的數據成員被使用的時候才能確保獲得初值。
所以static對于java是沒有所謂賦予默認初值的說法的。
但是如果一個變量不屬于任何類,比如說只是一個局部變量:
int a;
那么這個a得到的可能是任意值,而不會被自動初始化為0。
那么Java中static的作用到底是什么?
Java中的Static:
每當我們聲明一個類,需要用到其中的方法和變量的時候我們都需要通過new來創建對象,再用該對象去調用具體的方法和變量。
但是有兩種情況是比較特殊的:
情形1:我只想為某一特定數據分配一份存儲控件,而不用去考慮究竟要創建多少對象,或者是甚至根本不去創建任何對象;
情形2:我希望某個方法不與包含它的類的任何對象關聯在一起,即是,即使沒有創建對象,我也能夠調用這個方法。
這個時候我們就需要用到static。
下面進行一些小測試:
class StaticTest {static int a = 47;public StaticTest(){} }class StaticFun {static void Fun(){StaticTest.a++;} }public class StaticT {public static void main(String[] args) {// TODO Auto-generated method stubStaticTest st1 = new StaticTest();StaticTest st2 = new StaticTest();StaticTest.a++;System.out.println("st1's a is "+st1.a);System.out.println("st2's a is "+st2.a);StaticFun.Fun();System.out.println("current a is "+StaticTest.a);System.out.println("st1's a is "+st1.a);System.out.println("st2's a is "+st2.a);} } View Code運行結果如下:
轉載于:https://www.cnblogs.com/nerohwang/p/3491307.html
總結
以上是生活随笔為你收集整理的C\C++与Java中的static关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ]Kinect for Windows
- 下一篇: java 生成 顺序 uuid_Java