static 变量
static
变量是使用 static
关键字定义的变量,又被称为静态变量
静态变量是属于类的,也叫类变量;实例变量(非static变量)属于某个具体的对象
静态变量和非静态变量的区别:
- 静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化
- 非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
静态变量可以通过类名直接引用。
class Dome {
public static int staticVariable = 10;
}
public class Test {
public static void main(String[] args) {
System.out.println(Dome.staticVariable);
}
}
static 方法
static
方法是使用 static
关键字定义的方法,和静态变量类似,同时它也不属于任何一个实例对象,即无需对象访问
class Dome {
public static String staticMethod() {
return "静态方法";
}
}
public class Test {
public static void main(String[] args) {
System.out.println(Dome.staticMethod());
}
}
static 代码块
静态代码块加载类时候加载,可以使用静态代码块初始化类,静态代码块可以出现在类的任意部分,当类被加载时按照静态代码块的顺序来执行每个代码块
class Dome {
static {
System.out.println("静态代码块");
}
}
public class Test {
public static void main(String[] args) {
Dome dome = new Dome();
Dome dome1 = new Dome();
}
}
输出:
静态代码块
static 类(内部类)
内部类就是在一个类内部定义其他类结构的嵌套操作。
class Dome { // 外部类
class InterClass { // 内部类
}
}
使用static
定义的内部类称为静态内部类
非静态内部类在编译完成之后会隐含的保存着一个引用,该引用是指向创建它的外部类,但是静态类没有。没有这个引用就意味着静态内部类不会持有外部类当前对象的引用,所以在静态内部类中无法访问外部类的非static
定义的类、属性和方法,同时静态内部类也不依赖于外部类。
class Dome {
public String str = "内部类";
class InterClass {
InterClass() {
System.out.println("内部类");
System.out.println(str);
}
}
static class InterClassStatic {
InterClassStatic() {
System.out.println("静态内部类");
System.out.println(str); // Error: 无法从静态上下文中引用非静态 变量 str
}
}
}
public class Test {
public static void main(String[] args) {
Dome dome = new Dome();
new Dome.InterClassStatic();
new Dome.InterClass(); // Error: 需要包含Dome.InterClass的封闭实例
dome.new InterClassStatic(); // Error: 限定的新静态类
dome.new InterClass();
}
}
static 包
import
后使用 static
导入包称为静态导包,使用import static
可以导入类里的静态方法,如直接导入Math
类中的PI
而无需引用Math
类来使用PI
import static java.lang.Math.PI;
import static java.lang.System.out;
public class Test {
public static void main(String[] args) {
System.out.println(Math.PI);
System.out.println(PI);
out.println(PI);
}
}