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