static在C++和Java中的区别
一.static涉及普通变量、函数:
1.静态全局变量/静态函数------隐藏特性
仅在声明它的文件中可见,同一工程的其它文件中不可见,可解决不同文件的变量/函数重名问题;
2.静态局部变量------记忆特性
作为static局部变量在函数内定义,其作用域同普通局部变量,但生存周期为整个源程序,在程序刚开始运行完成唯一的一次初始化;
二.static涉及成员变量、函数:
1.静态成员变量具有如下特性:
a.依附于类而存在,为所有对象共享,在程序中维持一份拷贝,故可通过类名/对象名两种方式访问,它的值可修改;
注:关于this指针的讨论只存在于非静态成员函数访问非静态成员变量的情况;当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数;
b.静态成员变量必须在类体外初始化(ISO C++禁止非const静态成员变量在类体内初始化),静态成员变量还有const修饰的情况除外;
c.静态成员变量初始化与一般成员变量的初始化格式不同,<数据类型><类名>::<静态数据成员名> = <值>(否则对象在堆中将找不到需赋值的静态成员变量);
d.初始化在类体外进行,而前面不加static,不加该成员的访问权限控制符private,public等;
e.静态成员变量和普通成员变量一样遵从public,protected,private访问规则;
2.静态成员函数具有如下特性:
a.静态成员函数只能访问静态成员变量,非静态成员函数的访问无限制;
b.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
c.出现在类体外的函数定义不能指定关键字static;
d.由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
Java中static的作用:
1.Java中的static是不允许用来修饰局部变量;
2.与C++中涉及成员变量、函数的作用类似,即不依赖对象而存在;
3.静态代码块的使用,来优化程序性能,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次;
4.static内部类不可访问外部类的非static成员;
posted on 2016-03-03 19:31 huashunli 阅读(1787) 评论(0) 编辑 收藏 举报