static关键字修饰的成员就是类成员,有类变量,类方法,静态初始化块,静态内部类,static不能修饰构造器,以static修饰的成员就是类成员。类成员属于整个类,而不属于某个对象。
类变量属于整个类,当系统第一次准备该类时,系统会为该类变量分配内存空间,类变量开始生效,直到该类被卸载,该类的类变量所占用的内存才联系垃圾回收机制回收。类变量的生存范围几乎等同于该类的生存范围。当类初始化完成后,类变量也就初始化完成。
- static修饰成员变量(属性):静态变量
属性:按照是否使用static修饰,又分为静态变量和非静态变量(实例变量)。
实例变量:我们创建一个对象的时候,每个对象都独立拥有一套类中的非静态属性,当修改其中一个对象的属性时,另一个对象的属性不会发生变化。
静态变量:我们创建了类的多个对象,多个对象共享一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时时修改过的。可以通过类变量调用静态变量,但是不能调用实例变量,可以通过对象调用静态变量和实例变量。
由于类只加载一次,则静态变量在内存中也只会存一份,存在静态方法区中。当我们在开发中如果遇到这个属性是被多个对象来共享的我们就应该把他声明为静态类,类中的常量也应该声明为静态类。 - static修饰方法(静态方法)
随着类的加载而加载,可以通过“类.方法”来调用。
可以通过类来调用静态方法,但是不能调用非静态方法,但是对象既可以调用静态方法,也可以调用非静态方法。
在静态方法中只能调用静态的属性和方法,但是在非静态方法中既可以调用静的属性和方法也可以嗲用非静态的属性和方法。
在static修饰的方法中不能使用super,this等,因为静态方法随着类的创建而创建,而super是用来构造器的,构造器的加载晚于类的加载,所以不能用。
//不能在静态方法中调用构造器
public static void sleep(){
this();
}
单例模式:
饥汉式:
public class Singleton {
//定义一个类变量来创建实例变量,用private封装,
private static Singleton instance = new Singleton();
//定义一个私有构造器,不能让外部类来创建实例变量
private Singleton(){
}
//放会创建的类变量
public static Singleton getInstance (){
return instance;
}
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
}
}
懒汉式:
public class Singleton2 {
//使用类变量来缓冲一个实例变量
private static Singleton2 instance = null;
//隐藏构造器
private Singleton2() {
}
//提供一个静态方法来返回Singleton2实例
public static Singleton2 getInstance(){
//先判断是否为空,如果之前有创建过直接返回,没有创建就进去
if ( instance == null){
//同步锁保证线程安全
synchronized ( Singleton2.class){
//穿件一个对象并将缓存起来;
if ( instance == null){
instance = new Singleton2();
}
}
}
return instance;
}
public static void main(String[] args) {
Singleton2 s1 = Singleton2.getInstance();
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s1 == s2);
}
}