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成员;

原文地址:https://www.cnblogs.com/1203ljh/p/5239797.html