static关键字
static关键字是什么
在《Java编程思想》说: “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”。
static关键字的特殊性
- static修饰的成员方法和成员变量会在类被加载的时候就被初始化,而且只加载一次,从属于类。而普通的方法和成员变量从属于对象
- static修饰的静态元素可以通过直接 类名.静态元素 来使用
- static修饰的静态元素不可以使用this,super关键字
static关键字的用途
static可以用来修饰类的成员方法、类的成员变量,还可以编写static代码块来优化程序性能 。
static静态方法和static静态成员变量
static方法一般称作静态方法
代码案例:
public class TestStatic {
//静态成员变量
private static String nameStatic = "静态成员变量";
//非静态成员变量
private String name = "非静态成员变量";
public void test1(){
test2();//可以正常调用,非静态方法可以调用静态方法
System.out.println(nameStatic);//正常访问,在非静态方法中可以访问静态成员变量
System.out.println(name); //正常访问
System.out.println("非静态方法");
}
public static void test2(){
//test1(); //调用test1报错,静态方法中不能调用非静态方法
//System.out.println(name);//访问name会报错,在静态方法中不能使用非静态成员变量
System.out.println(nameStatic);
System.out.println("静态方法");
}
public static void main(String[] args) {
TestStatic.test2();//可以通过类名直接访问静态方法
//TestStatic.test1();//报错,不可以直接访问非静态方法。非静态方法需要new对象访问,非静态成员变量也是同理。
new TestStatic().test1();
}
}
由上面的代码可以看出,如果想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。最常见的静态方法就是main方法。
static代码块
- static代码块可以置于类的任何地方,类可以有多个static代码块
- 在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次
- 静态代码块执行优先级高于非静态的初始化块
static代码块的作用是可以优化程序性能,因为static代码块只会在类加载的时候执行一次,看以下代码:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
//自我介绍
public void introduce(){
String start = "hello,我是";//介绍的开头语
System.out.println(start + this.name);
}
}
introduce是用来自我介绍当前人的,但是每次调用都会定义一个start,分配一个内存空间给start,这样就造成了空间浪费。那我们可不可以只初始化一次start了,这个时候我们就可以用到static代码块来优化性能了:
public class Person {
private String name;
private static String start;
//static静态代码块在类初次被加载的时候调用,并且只初始化一次
static {
start = "hello,我是";//介绍的开头语
}
public Person(String name) {
this.name = name;
}
//自我介绍
public void introduce(){
System.out.println(start + this.name);
}
}
因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行