关键字:static(静态)
概念:
static是一个修饰符,用于修饰成员(成员变量和成员函数)。当成员被静态修饰后,就多了一种调用方式:除了可以被对象调用外,还可以直接被类名调用。格式:类名.静态成员;
特点:
随着类的加载而加载,随着类的消失而消失。所以生命周期长。
优先对象存在,被所以对象共享,可被类名所调用。
注意:
静态方法只能访问静态成员,非静态成员即可以访问静态也可以访问非静态。
静态方法中不能定义this、super关键字。主函数是静态的。
利:节省空间,可被类直接调用。
弊:生命周期长,访问出现局限性。
实例变量和类变量的区别:
存在位置:
静态变量(类变量)随着类的加载而存在于方法区中,实例变量随着对象的建立而存在于堆内存中。
生命周期:
静态变量随着类的消失而消失,实例变量随着对象的消失而消失。、
所属范围:
静态属于整个类,被整个类所共享,实例变量时对象的特有数据,所属对象。
静态代码块:
格式:static{
静态代码块执行的语句
}
特点:
随着类的加载而加载,只执行一次并优先于主函数执行,用于给类进行初化。
静态代码块和构造代码块:
相同点:
都是jvm加载类时且在构造方法执行前执行,在类中科定义多个。
不同点:
静态代码块只在第一次new时执行一次,之后不再执行,而构造函数在每一次new一次就执行一次。
构造代码块可在普通方法中定义,而静态代码块不行。
局部代码块&构造代码块&静态代码块的作用及使用情况:
什么时候使用static?
当成员变量所存储的数据,每个变量都拥有这个数据。此时就可以用static修饰该变量,让所有对象共享该数据。
当成员函数没有访问对象的特有数据时,就可以将该方法定义成静态。因为该方法没有访问到对象的特有数据,所有我们再创建对象去调用方法是没必要的,将该方法修饰为静态后,可直接用类名调用。
静态的应用:
1.每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以便复用
2.将方法都静态后,可方便于使用,但该类还可以被其他程序建立对象。为了使程序更加严谨,强制让该类不能建立对象,可通过将构造函数私有化实现。
设计模式
设计模式:解决某一类问题最行之有效的方法。共有23种。
单例设计模式:解决一个类在内存只存在一个对象。
饿汉式:
/*
单例设计模式之————饿汉式
Single类一进内存,就已经创建好了对象。
*/
class Single{
private int num;
private Single(){} //将构造函数私有化,防止创建对象
private static Single s = new Single();
//设置一个方法,返回创建的对象。
public static Single getInstance(){
return s;
}
//设置一个方法,改变变量num的值。
public void setNum(int num) {
this.num = num;
}
//设置一个方法,返回改变后的num值。
public int getNum() {
return num;
}
}
class SingleDemo {
public static void main(String[] args) {
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
s1.setNum(23);
System.out.println(s2.getNum());
}
}
懒汉式:
//对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。
//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(s==null){
synchronized(Single.class){
if(s==null)
s = new Single();
}
}
return s;
}
}