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 = ; //静态数据成员初始化
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();
ac2.reiseInterest();
cout<<"The current interest is "<<Account::interest()<<endl;
return ;
}

运行结果如下:

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 stub
StaticTest 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);
}
}

运行结果如下:

C\C++与Java中的static关键字的更多相关文章

  1. (转)Java中的static关键字解析

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

  2. 关于Java中的static关键字

    Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...

  3. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  4. (转)Java中的static关键字解析

    转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...

  5. Java中的static关键字解析 转载

    原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到 ...

  6. Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  7. Java中的static关键字

    写在前面: 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰 ...

  8. java中的static关键字详解

    static对于我们这些初学者在编写代码和阅读代码是一个难以理解的关键字,也是大量公司面试题最喜欢考的之一.下面我就来就先讲述一下static关键字的用法和我们初学者容易误解的地方. static关键 ...

  9. 【Java学习笔记之十五】Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  10. 再议Java中的static关键字

    再议Java中的static关键字 java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:<Java中的static关键字解析>. 今天我们再来谈一谈st ...

随机推荐

  1. c#——表达式树在LINQ动态查询

    一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件 简单方式这样操作就可以了 public IQueryable<FileImport> DynamicCh ...

  2. Flash Builder 相关

    1.Flex SDK 4.1 兼容性 Flex SDK 4.1 兼容 Flash Builder 4.0 ,因此在 Flash Builder 4.0 中使用 4.1 SDK 时可以使用设计视图 Fl ...

  3. 10招步骤保护IIS服务器安全

    问题 IIS(Internet Information Server)是黑客特别喜欢的目标.因此,对于管理IIS网页服务器的管理员来说,确保服务器安全是一件至关重要的事.IIS 4.0和IIS 5.0 ...

  4. Linq to Entity 多条件 OR查询

    技术背景:框架MVC,linq to Entity 需要一定的lambda书写能力 问题:在简单的orm中完成一些简单的增删查改是通过where insert delete update 完成的,但是 ...

  5. 【BZOJ2124】等差子序列 树状数组维护hash值

    [BZOJ2124]等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N ...

  6. activeMQ安装与测试

    Apache ActiveMQ简介 activeMQ是JMS的一种具体的实现,是最流行的,能力强劲的开源消息总线.activeMQ具有以下优势: 多种语言和协议编写客户端(java.C.C++.AJA ...

  7. [LintCode] 用栈实现队列

    class Queue { public: stack<int> stack1; stack<int> stack2; Queue() { // do intializatio ...

  8. 14.wamp自定义网站根目录

    1.首先打开Apache 中的配置文件httpd.conf crtl+f 搜索  documentroot  ,在找到的目录中将目录修改自己的网站的目录,注意\ 与/ 2.在向下移动,找到<Di ...

  9. js 中和c类似

    w <script type="text/javascript"> <!-- var w = 123 alert(w) function fun(){ alert ...

  10. <2014 04 29> *nix环境编程常用库总结

    -------------------------linux常用头文件如下:POSIX标准定义的头文件<dirent.h>        目录项<fcntl.h>        ...