static 关键字主要有两种作用:
1.为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。
2.实现某个方法或属性 与类而不是对象关联在一起,也就是说在不创建对象的情况下可以通过类直接调用方法或调用类的属性。
具体而言,static主要有4种使用情况
1、 static成员变量
JAVA语言中没有全局变量的概念,但是可以通过static关键字定义来实现全局的效果。java提供了两种类型的变量:用static修饰的静态变量,和不用static修饰的实例变量。静态变量属于类,在内存中只有一个复制,只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。
对静态变量的引用有两种方式:
- 类.静态变量
- 对象.静态变量
接下来给出静态变量和实例变量的使用实例。
1 | public class jtbl { |
运行结果:
j.staticint:1
jtbl.staticint:1
j.sint:0
静态变量只有一个,被类拥有,所有对象都共享这个静态变量,而实例对象是与具体对象相关的。
JAVA语言中不能在方法体中定义static变量。
2、 static成员方法
static方法是类的方法,不需要创建对象就可以调用。
static方法中不能使用this和super关键字,不能调用非static方法,只能调用所属类的静态成员变量和成员方法
static一个很重要的用途是实现单例模式,单例设计模式的特点是该类只能有一个实例,为了实现这一功能,必须隐藏类的构造函数,即把构造函数声明为private,并提供一个创建对象的方法,由于构造对象被声明为private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样的目的只能把创建对象的方法声明为static,程序实例如下:
1 | class Singleton{ |
3、 static代码块
static代码块,不在任何一个方法体内,static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
1 | public class statictest { |
运行结果:
1
程序开始
4、static内部类
static内部类是指被static修饰的内部类。它可以不依赖于外部类实例对象而被实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法。
1 | public class Outer { |
运行结果:
Inner:outer.a=5
只有内部类才能定义为static