Static关键字
我们可以一句话来概括:方便在没有创建对象的情况下来进行调用。
也就是说:被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。
1、修饰成员变量 -> 静态成员变量
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。
静态变量也被称为类变量。局部变量不能被声明为 static 变量。
如果某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量。
静态变量与实例变量的区别:
1.1内存存储的位置不同
Java栈:
- 构造方法函数调用;
Java堆:
- New对象(实例变量);
- 字符串常量池(jdk1.6之后);
方法区:
- 静态变量;
- 字符串常量池(jdk1.6之前 -> contant pool);
1.2 是否与对象有关
- 实例变量 -> 与对象有关 -> 一个对象(new)对应一份实例变量;
- 静态变量 -> 与对象无关,与类有关,一个类只有一个静态变量(多个对象共用);
2、修饰方法 -> 静态方法
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
静态方法与实例方法的区别:
-
调用静态方法 -> 类名.
-
静态方法不能调用普通的实例变量(不能提供 this. 方法);
-
有无 this
* 静态方法无法提供 this static -> 跟对象无关 * * 实例方法可以提供 this -> p1.eat(); 跟对象有关 *
结论:
1)静态方法不能调用实例变量
2)不能定义一个局部的静态变量
注意事项:
- 在静态方法中没有this关键字(因为静态是随着类的加载而加载,而this是随着对象的创建而存在的。静态比对象优先存在。)
- 静态可以访问静态的,但是静态不能访问非静态的。
- 非静态的可以去访问静态的。
static{ } -> 静态块:
static{ } -> 静态块 -> 只能初始化静态变量
{ } -> 实例块 -> 只用初始化实例变量
- 构造函数 -> 初始化实例变量
- 静态块 -> 初始化静态变量
结论:
当变量与对象个数无关,只与类有关系时,就将该变量定义为 static 静态变量,一个类仅此一份;
而静态变量必须使用静态方法,原因是静态变量不能用 this 修饰,实例方法 默认 含有 this 关键字,因此,静态变量必须使用静态方法。
3、修饰内部类
实例内部类和静态内部类区别:
- 实例内部类包含两个this(指向当前对象,外部类对象的this);
- 静态内部类包含一个this(指向当前对象) ;
4、单例模式
首先,让我们看看什么是单例模式,大家都知道在电脑上,像我的电脑,垃圾桶这种一台电脑只需有一个就行,不能创建多个,这个就是单例模式,简单来说,就是只能生成一个对象,此处的单例模式只是简单的在线程不安全下的单例模式。
特点:
- 1、 构造函数私有;
- 2、 提供静态的getInstance方法
前提 :
- 构造函数私有
- 提供public 静态函数(保证实例化一次)
单例模式分为快加载和慢加载:
此处的快慢仅指 new 对象时的先后顺序
慢加载:
//慢加载单例
public class Singleton {
private static Singleton p;
private Singleton(){
}
public static Singleton getInstance(){
if(p == null){
p = new Singleton();
}
return p;
}
}
快加载:
//快加载单例
public class Singleton {
private static Singleton p = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return p;
}
}