java读书笔记----关于java中的static
静态成员是一组比较特殊的成员,它不属于某个特定的类实例。它独立于该类。也就是说它不依赖类特定的实例,而被类的所有实例共享。
类的静态成员一般可以分为3种:静态成员变量,静态方法,静态代码块。它们都具有以下几个特点:
1、在类加载的时候,就进行创建和初始化或执行代码;
2、它们对于一个类来说,都只有一份;
3、类的所有实例都可以访问到它们;
1)、静态成员变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫做静态变量;另一种是没有被static修饰的变量,叫做实例变量。两者的区别在于:
静态变量在内存中只有一个拷贝,JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配。在访问中一般都是直接通过类名来访问,不建议通过对象来访问。因为静态成员是属于类所有。静态成员变量会在类加载以后进行创建和初始化操作。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2)、静态方法
静态方法指的是用static关键字修饰的方法,他可以被对象访问,也可以直接由类名来访问。对于静态方法,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法,只能访问所属类的静态成员变量和静态方法。因为static方法独立于任何实例,因此static方法必须要被实现,而不能是抽象的abstract。
3)、静态代码块
静态代码块,是采用static修饰,用大括号“{......}”围起来的代码,这些代码可以使用静态成员变量和静态方法,它们也是在类加载的时候被调用。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
public class StaticTest { static int a ; //静态成员变量 static void testMethod(){ //静态方法 System.out.println("static method....."); } static{ //静态代码段 System.out.println("static code"); } public static void main(String[] args) { System.out.println(a); StaticTest sTest = new StaticTest(); sTest.testMethod(); //通过对象来访问静态方法 } }
执行得结果如下:
static code
0
static method.....
分析:
在StaticTest类中,包含一个静态成员变量a,一个testMethod()静态方法以及一段静态代码块。当执行以上代码的时候,JVM会加载StaticTest类到内存中,然后创建a变量并进行初始化,再执行static代码块。在main()方法中,创建一个staticTest类的实例对象。通过该实例对象来访问静态方法testMethod()。
对于static和final一块用表示什么
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。