有几次面试问道了static关键字的用法,由于当时没有回答上来,现在整理一下。
一、static的用法
static,顾名思义,是“静态的”意思,静态的就是不动的,不动并不是说static修饰的变量、方法不能改变,而是被static修饰的变量、方法不会因为对象(实例)的改变二改变。《Java编程思想》上这样说:static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。被static修饰的变量、方法不需要依赖于对象来进行访问,只要类被加载,就可以通过类名.变量(方法)来进行访问。
static可以用来修饰变量、方法和代码块这三种内容。
1、static修饰变量。
定义方式:static int a;则这个被static修饰的变量称为静态变量。那么不被static修饰的变量自然就被称为非静态变量。静态变量与非静态变量的区别在于:静态变量在内存中只保存一次,每个对象(实例)在初始化时,所用的静态变量都指向同一位置。非静态变量在内存中有多个,有一个对象(实例)就有一个非静态变量。静态变量只在类被初次加载时初始化,只初始化一次。如果没有对静态变量显示初始化,则构造器会将静态变量初始化为0。静态变量可以通过类名.变量名进行赋值。
static不能用来修饰类的方法中的局部变量。
2、static修饰方法
定义方式为:public static void fun()。其中,public和void可换成其他修饰符。
被static修饰的方法称为静态方法。静态方法不依赖于任何对象,可以通过类名.方法名访问。静态方法内部不能使用this关键字。因为不依赖于对象,所以不需要关键字this。在静态方法内部可以调用类的非静态变量和非静态方法。但是非静态方法总可以调用静态变量和静态方法。如果想在不创建对象的情况下调用某个方法,则把那个方法设为静态方法。常见的静态方法是main方法。因为那时候还没有对象,只能通过类名访问main方法。其他,Math类中的所有方法都是静态的。
注意:即使没有显示的声明为static,类的构造方法都是static的。
3、static修饰代码块
定义:
static
{
//代码块
}
使用静态代码块主要是用来优化程序性能。因为这部分代码只在类被加载时执行一次。可以创建多个静态代码块。