关键字static
static的主要作用在于创建独立于具体对象的域变量或者方法
简单理解:
被static修饰的变量或方法相当于是类的固有属性,可以不依靠对象来进行访问。
只要类被加载了,就可以通过类名去进行访问。
并且不会因为对象的多次创建 而在内存中建立多份数据。
需要注意的是:
- 静态成员 在类加载时加载并初始化。
- 无论一个类存在多少个对象 , 静态的属性, 永远在内存中只有一份( 可以理解为所有对象公用 )
- 在访问时: 静态不能访问非静态 , 非静态可以访问静态 !
代码块
普通代码块
在执行的流程中 出现的 代码块, 我们称其为普通代码块。
构造代码块
在类中的成员代码块, 我们称其为构造代码块, 在每次对象创建时执行, 执行在构造方法之前。
静态代码块
在类中使用static修饰的成员代码块, 我们称其为静态代码块, 在类加载时执行。 每次程序启动到关闭 ,只会
执行一次的代码块。
经典面试题目:
构造方法 与 构造代码块 以及 静态代码块的执行顺序:
答:静态代码块 --> 构造代码块 --> 构造方法
权限修饰符
修饰符 | 本类 | 本包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
defaul | √ | √ | × | × |
private | √ | × | × | × |
单例设计模式
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。选择单例模式就是为了避免不一致状态,避免政出多头。
单例模式特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性。单例模式也保证程序在内存中只有一个对象存在(被程序所共享)
单例设计模式有两种实现方式:
一、懒汉式:随着类的加载在内存中对象为null,当调用 getInstance 方法时才创建对象(延迟加载)
二、饿汉式:随着类的加载直接创建对象(推荐开发中使用)
单例设计模式的实现步骤:
1.保证一个类只有一个实例,实现方式:构造方法私有化
2.必须要自己创建这个实例,实现方式:在本类中维护一个本类对象(私有,静态)
3.必须向整个程序提供这个实例,实现方式:对外提供公共的访问方式(getInstance方法,静态)
懒汉式实现如下:
class Single{
private Single(){}
private static Single s1 = null;
public static Single getInstance(){
if(s1 == null){
s1 = new Single();
}
return s1;
}
}
饿汉式实现如下:
class Single2{
private Single2(){}
private static Single2 s = new Single2();
public static Single getInstance(){
return s;
}
void print(){
System.out.println("Hello World!");
}
}