文章目录
一、static关键字的基本用法
关于static关键字的使用,最常见的使用是修饰成员变量和成员方法,使用时不需要创建对象再去调用变量和方法,直接类名.变量或方法就可以使用。
1.1、static修饰变量和方法
什么是静态变量(类变量)、静态方法(类方法)?
1、static关键字在修饰静态变量和静态方法时也被称为类变量和类方法,之所以被称为类变量和类方法,是因为静态变量和静态方法完全独立于该类的对象,静态变量和静态方法的加载早于该类的对象,也就是说在该类的对象创建之前,static修饰的类变量和类方法就已经出生存在了。
2、在使用静态变量和静态方法时,直接类名.静态变量或静态方法就可以使用,也可以创建对象,通过对象调用,非常不推荐第二种方法,容易混淆静态和非静态。这种写法也会在javac编译成类名.的调用方式。
什么时候用静态变量和静态方法?
1、静态变量
当你希望该类创建的对象中的成员变量的值都是相同的,该类的所有对象共同拥有同一个变量,这时就可以把这个成员变量定义为静态变量。
这句话看起来有点绕,举个例子就一目了然了。
例如我希望Person类创建的实例中的国家字段的默认值是中国,所以我把country 定义为静态变量
package Test;
public class Person {
private String name;
private int age;
private static String country = "中国";
//生成有参构造器
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//生成toString方法
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age +",country="+ country + "]";
}
//测试main方法
public static void main(String[] args) {
Person p1 = new Person("张三", 20);
Person p2 = new Person("李四", 18);
System.out.println(p1);
System.out.println(p2);
}
}
输出结果:
Person [name=张三, age=20,country=中国]
Person [name=李四, age=18,country=中国]
2、静态方法
静态方法多用于工具类中,静态方法只能访问静态变量,不能访问非静态变量和方法,因为在静态方法加载时非静态变量和方法还没有初始化,同样静态方法不属于任何一个实例,所以不能使用this来调用静态方法。
1.2、静态代码块
1.静态代码块随着类的加载而执行,只会执行一次 ,多用于给静态成员变量赋值。
2.一个类中的可以有多个静态代码块,位置随便,多个静态代码块会按照静态代码块的位置依次执行。
package Test;
public class Person {
private String name;
private int age;
static String country;
//生成无参构造器
public Person() {
System.out.println("我是无参构造器");
}
//给静态变量赋值
static{
country = "未知";
System.out.println("我是静态代码块,我只执行一次");
}
//测试main方法
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
System.out.println("输出赋值后的静态变量:"+Person.country);
}
}
输出结果
我是静态代码块,我只执行一次
我是无参构造器
我是无参构造器
输出赋值后的静态变量:未知
从上面的例子可以看出,main方法中创建了两次Person对象,构造方法执行了两次,静态代码块在给静态变量赋值时只执行了一次,且执行顺序优先于构造方法。
1.3、静态内部类
static关键字在修饰类时只能修饰内部类,在创建静态内部类对象时,不需要创建一个外部类对象再创建一个静态内部类对象,直接用以下语法调用。
格式: 外部类.静态内部类 对象名 = new 外部类.静态内部类();
1.4、静态导包
静态导包 JDK1.5以后新特性, 这种方法的好处就是可以简化一些操作,但是降低了代码的可读性。
//静态导包
import static java.lang.System.out;
public class Test {
public static void main(String[] args) {
//静态导包前
System.out.println();
//静态导包后
out.println();
}
}