static
所有static修饰的数据,正规的访问方式是:类名.
static修饰的变量叫做静态变量
static修饰的方法叫做静态方法
什么情况下声明成静态变量?
所有的对象都有这个特征,并且这个特征所对应的值都是相同的。
没必要声明成成员变量,因为浪费内存。
应该声明成静态变量,在方法区中只存储一份,让所有的对象共享这一份数据。
多数的工具类中的方法都是静态的,目的是方便调用。
static修饰的数据被称作“静态的”
使用static关键字可以定义静态代码块。
静态代码块在类加载阶段执行,并且只执行一次,是自上而下的顺序依次执行。
实例代码块
每调用一次构造方法,则实例代码块就会执行一次。
实例代码块在构造方法调用之前执行。
实例代码块也是自上而下的顺序执行。
单例模式:
单例模式的特点/主要解决的问题:保证JVM中该类型的java对象只有一个
优点:节省内存
缺点:单例模式中因为构造方法私有化,所以单例模式无法被继承。因为在子类构造对象的时候必须使用父类中的构造方法。
//饿汉式单例模式(在类加载阶段对象已经创建。) public class Customer{ //静态变量 private static Customer c = new Customer(); //单例模式第一步:将所有的构造方法私有化。 //目的是:让外部程序不能直接调用构造方法创建对象。 //因为只要构造方法执行,就会有一个新对象诞生。 private Customer(){} //对外提供一个公开的获取Customer类型对象的方法。 public static Customer getInstance(){ return c; } }
//懒汉式单例模式 public class Customer{ //静态变量 private static Customer c; //单例模式第一步:将所有的构造方法私有化。 //目的是:让外部程序不能直接调用构造方法创建对象。 //因为只要构造方法执行,就会有一个新对象诞生。 private Customer(){} //对外提供一个公开的获取Customer类型对象的方法。 public static Customer getInstance(){ if(c==null){ c = new Customer(); } return c; } }
main方法调用
class T{ public static void main(String[] args){ //Customer c = new Customer(); Customer c1 = Customer.getInstance(); Customer c2 = Customer.getInstance(); System.out.println(c1==c2); } }