java关键字之static

static

我们知道在java中并没有全局变量这个概念,但是如果想要使用类似于全局变量时,我们可以使用static来实现一个模拟的全局变量的效果。static表示“全局”或者“静态”的意思,可以用来修饰成员变量和成员方法。

首先来了解一下java的内存分布:
java的内存分为堆内存和栈内存,栈内存主要用来存放一些基本数据类型的变量、数组和对象引用;堆内存主要用于存放一些对象。在JVM加载一个类时,如果这个类存在static修饰的变量和成员方法,那么会为这些成员变量和方法在固定的位置开辟一个固定大小的内存区域,由于位置固定,这样JVM便能够方便快捷地访问。

静态变量与实例变量

static修饰的变量称为静态变量,没有static修饰的称为实例变量。静态变量随着类的加载而完成初始化,在内存中只有一个且只会分配一次内存,静态变量独立于该类,不会依赖于哪一个实例,类的所有实例都能共享静态变量,并且可以直接通过类名来访问静态变量。所有的实例对于该变量的引用都指向同一个地方,任何一个实例对其的修改都会导致其他实例中的变化。
而实例变量是随着实例而产生的,每创建一个实例都会生成一个实例变量,并且将一直跟着着这个实例。举例如下:

public class Test {

	public  static int number=0;
	public Test()
	{
		number++;
	}
	public static void main(String[] args) {
     Test t1=new Test();  
     Test t2=new Test();
     System.out.println("t1's number is "+t1.number);
     System.out.println("t2's number is "+t2.number);
     System.out.println("number is "+Test.number);
	}

}

输出结果为:

如果删除static关键字,最后一个输出行将报错。删除最后的输出,前两个输出将是两个1。
因此,静态变量通常使用于多个对象之间共享数据时,这样访问将更加方便。

静态方法

static修饰的方法称为静态方法。与静态变量相同,静态方法也可以直接通过类名来调用。但是需要注意的是,由于静态方法在类加载的时候就存在了,因此静态方法不能是抽象的,是需要具体实现的。

举例如下:

public class Test {

	public  static int number=0;
	public Test()
	{
		number++;
	}
	public static void show()
	{
		System.out.println("this is static!");
	}
	public static void main(String[] args) {
     Test t1=new Test();  
     Test t2=new Test();
     System.out.println("t1's number is"+t1.number);
     System.out.println("t2's number is"+t2.number);
     System.out.println("number is "+Test.number);
     Test.show();
	}

}

如果删除static关键字,程序将报错。

静态代码块

static修饰的代码块称为静态代码块,静态代码块随着类的加载一块执行,而且他可以随意放,可以存在于该类的任何地方。

总结:

1)static可以修饰属性、方法、代码块,静态变量在内存中有且只有一个。

2)static修饰的属性在类加载初始化且初始化时间在于非静态变量,可修改,为所有实例共享,可通过类名访问;

3)static修饰的方法在类加载时存在,需具体实现,可直接通过类名访问。

4)static修饰的量与具体实例无关,而“this”,“super”与具体实例有关,因此static不可引用this、super。

5)静态方法内只能调用静态变量和静态方法。

final关键字下篇再说啦~


 

猜你喜欢

转载自blog.csdn.net/hnu_zhangzhijian/article/details/88848073