今晚看单例模式的时候其中用到了static进行修饰,总感觉思维有点模糊,然后上网查询资料,终于有所了解,今天把她给记录下来,免得以后想要看的时候又找不到文章看。
如果一个类成员被声明为static,它就能够在类的任何对象创建之前被访问,而不必引用任何对象的实例,static 最常用的是main(), 单例中同样使用static,直接调用 类名.方法名直接调用静态块。Singleton.singlrton;
public class Singleton {
private Singleton(){
System.out.println("singlton is create");
}
private static Singleton singlrton = new Singleton();
public static Singleton getSinglrton(){
return singlrton;
}
public static void creating(){
System.out.println("Creating is SingleTon");
}
public static void main(String[] args) {
Singleton.creating();
//Singleton.getSinglrton();
}
}
singlton is create
Creating is SingleTon
执行的结果是:在Singleton类加载的时候,static 静态变量会被加载,并且new 实例化对象,private 构造方法被调用,打印出 SingleTon is create;
声明static变量实质上就是全局变量,当声明一个对象时,并不产生static变量的拷贝,而是所有的实例变量使用的是同一个static变量;静态成员们不必和对象绑定在一起。static方法在类加载时就已经存在了,但是对象是在创建时才在生成。而this指代的是当前对象。
一 . static方法的几个限制:
1,仅能调用其它static方法(非static方法实在对象实例化之后才能访问,而static的加载与类同级)
2,仅能访问static数据
3,他们不能以任何方式引用this,super(因为this 和 super 是对象中的叫法)
二 . static 静态块:
可以用来初始化static 变量,他仅在该类被加载时候执行一次,
public class UserStatic {
static int a =3;
static int b;
static void out(int c){
System.out.println("c = " + c);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static{
System.out.println("static 静态块开始执行");
b = a * 2;
}
public static void main(String[] args) {
System.out.println("main 开始执行");
out(100);
}
}
下面是執行的結果:
static 静态块开始执行
main 开始执行
c = 100
a = 3
b = 6
static 静态块在类加载时候执行一次。
java static: 作为修饰符,可以用来修饰变量,方法,代码块,但是不能修饰类;
(1) 修饰变量: 类的所有对象共同拥有的一个熟悉,也称为类变量,类变量是在类加载时候初始化,而且只会被初始化一次。一个地方修改它的值,其他对象都能看见变量的改变,Java变量可以用类名直接访问,而不必需要对象。
(2)修饰方法:类的所有对象共同拥有一个功能,称为静态方法,可以通过类名直接访问。
(3)修饰代码块:static 修饰的独立的代码块,在类的第一次加载的时候执行,而且只能执行一次。
类的加载:
当一个类需要被使用的时候,jvm会 通过classpath 指定的路劲+ classname 加载出类所对应的字节码文件,并且读进jvm保存起来,下次需要使用直接从jvm中拿出来。