Static关键字
作用域:可以修饰成员变量和成员方法
特点:
。随着类的加载而加载
。优先于对象存在
。被类的所有对象共享(这是判断是否使用静态关键字的条件)
。可以通过类名调用
public class myDemo {
static String name;
public static void main(String[] args) {
System.out.println(myDemo.name);//null成员变量默认初始化为null }
}
Static关键字注意事项
。在静态方法中是没有this关键字的
。静态方法只能访问静态的成员变量和静态的成员方法
静态的内存图:
静态的内容存在于方法区的静态区,是共享的,每一个访问该变量的对象,都可以修改该静态变量,其值会被覆盖。
实例:
创建一个Person类
public class Person {
String name;
static String text;
public void show(){
System.out.println(name+"喜欢"+text);
}
}
创建一个Test类
public class Test {
public static void main(String[] args) {
Person p1=new Person();//创建一个peson对象为p1
p1.name ="胡歌";//为成员变量赋值,在堆内存
p1.text="看书";//为静态变量赋值,在方法区中
p1.show();//胡歌喜欢看书
Person p2=new Person();
p2.name="薛之谦";
p2.text="唱歌";
p2.show();//薛之谦喜欢唱歌
p1.show();//胡歌喜欢唱歌
}
}
我们可以看到peson类中有一个成员变量name,其存在堆内存;不被共享。
及一个静态变量text,存在于方法区,该类所创建的对象所共享。
所以 p2的text改变会影响p1的值,而name则不会,它们在堆中有各自的内存空间。看下图可以清晰的看出static修饰的成员变量和其他成员变量的区别。
图解:
代码块
在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块
局部代码块
在方法中出现;限定变量生命周期,及早释放,提高内存利用率
构造代码块
在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
静态代码块 在类中方法外出现,加了static修饰
在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且值执行一次。