您的位置:首页 > 编程语言 > Java开发

java基础知识—java中static修饰符

2015-07-19 15:09 316 查看
static:表示“全局”或者“静态”的意思,开用来修饰变量、方法、代码块。

1.静态变量

按照是否静态对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。

两者的区别是:

(1).对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,它当且仅当在类初次加载时会被初始化,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。static成员变量的初始化顺序按照定义的顺序进行初始化。

(2).对于实例变量,每创建一个实例,就会为实例变量分配一次内存,在创建对象的时候被初始化,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

public class Test{
public static final int age=10;
public static void main(String[] args){
System.out.println(Test.age);//类名.变量
Test test=new Test();
System.out.println(test.age);//类的实例.变量
}
}


类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过I/O流把类的文件(字节码文件)读入JVM(java虚拟机),这个过程成为类的加载。JVM(java虚拟机)会通过类路径(CLASSPATH)来找字节码文件。

类变量,会在加载时自动初始化,初始化规则和实例变量相同。

2.static修饰方法
当static修饰方法时,我们称它为静态方法,此时这个方法成为整个类所公有的方法,可以用类名.方法名访问,也可以通过实例调用。

在使用静态方法时,需要注意以下几点:

(1)static修饰的方法,不直接能访问本类中的非静态(static)成员(包括方法和属性),本类的非静态(static)方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法(下图)。静态方法要慎重使用。在静态方法中不能出现this和super关键字。它不依附于任何对象,既然都没有对象,就谈不上this了。

(2)父类中是静态方法,子类中不能覆盖为非静态方法,在符合覆盖规则的前提下,在父子类中,父类中的静态方法可以被子类中的静态方法覆盖,但是没有多态。

(3)父子类中,静态方法只能被静态方法覆盖,父子类中,非静态方法只能被非静态方法覆盖。

(4)因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

3.static代码块

static关键字还有一个比较关键的作用就是
用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

class Person{
private Date birthDate;

public Person(Date birthDate) {
this.birthDate = birthDate;
}

boolean isBornBoomer() {
Date startDate = Date.valueOf("1990");
Date endDate = Date.valueOf("2000");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
分析发现,该程序的功能是判断一个人是不是1990-2000年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成这样效率会更好:

class Person{
private Date birthDate;
private static Date startDate,endDate;
static{
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
}

public Person(Date birthDate) {
this.birthDate = birthDate;
}

boolean isBornBoomer() {
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。而不需要没判断一个类的对象,都要生成生成startDate和birthDate两个对象,大大节省了空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: