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 = ; //静态数据成员初始化
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关键字的更多相关文章
- (转)Java中的static关键字解析
转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...
- 关于Java中的static关键字
Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...
- Java中的static关键字解析
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- (转)Java中的static关键字解析
转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...
- Java中的static关键字解析 转载
原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到 ...
- Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- Java中的static关键字
写在前面: 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰 ...
- java中的static关键字详解
static对于我们这些初学者在编写代码和阅读代码是一个难以理解的关键字,也是大量公司面试题最喜欢考的之一.下面我就来就先讲述一下static关键字的用法和我们初学者容易误解的地方. static关键 ...
- 【Java学习笔记之十五】Java中的static关键字解析
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- 再议Java中的static关键字
再议Java中的static关键字 java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:<Java中的static关键字解析>. 今天我们再来谈一谈st ...
随机推荐
- CodeFirst中DbContext动态添加DbSet
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 优化phpstorm运行卡顿问题
在PHPSTORM中点击导航菜单:Help -> Edit Custom VM Options 如果是第一次点击,会提示是否新建配置文件,点击“yse” 在弹出的编辑框末尾加上以下配置 -Daw ...
- Java 面试题 自己写的答案
基本概念 操作系统中 heap 和 stack 的区别 栈(stack)与堆(heap)都是Java用来在内存中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 在函 ...
- Android去掉标题的方法
我们写程序的时候经常要全屏显示或者不显示标题.比如我们做地图导航的时候就不要标题了,下面介绍三种方法来实现Android去掉标题. 第一种:也一般入门的时候经常使用的一种方法 在setContentV ...
- ryu启动问题总结
在Mininet中启动ryu控制器,首先切换到ryu中的app目录下: cd ryu/ryu/app 启动ryu: ryu-manager simple_switch.py 遇到了如下的错误提示: 这 ...
- Handlebars.js,Json+ajax+拼html
英文版:http://handlebarsjs.com./ 原文链接:http://www.cnblogs.com/diligenceday/p/4105229.html, http://segmen ...
- 160629、 DBCP、C3P0、Proxool 、 BoneCP开源连接池的比较
简介 使用评价 项目主页 DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用 可以设置最大和最小连接,连接等 ...
- python文件上传工具实现
0x00 之前验收waf模块webshell效果,组网pc--waf--webserver,收集网络上的webshell样本,进行上传测试.由于数量较多8000+个样本, 只好写了个工具进行验收. w ...
- MFC 单选按钮组向导添加和动态创建
单选按钮组的动态生成 单选按钮也属于CButton类,但由于单选按钮总是成组使用的,所以它在制作和使用上与普通按钮有一定区别. 假设有三个单选按钮组成一组,初始时,第一个单选按钮处于选中状态. 我们先 ...
- learnyou 相关网站
http://learnyouahaskell.com/ http://learnyouahaskell-zh-tw.csie.org/ http://learnyousomeerlang.com/