1. 类的静态变量
由static关键字修饰的变量、常量和方法被称为静态变量、常量和方法。
声明为static静态变量和方法时,其他类无需实例化就可以调用本类的静态变量和静态方法,直接使用类名.静态成员的形式进行调用,定义静态变量或静态方法的作用通常是为了在内存中提供共享数据或方法。
public class Book { static int bookCount; //类中定义静态变量 final static double PI = 3.14159; //类中定义静态常量 public static void method1 (){ //类中定义静态方法 //do something } public static void method2 (){ System.out.println(Book.PI); //调用静态常量 System.out.println(Book.bookCount); //调用静态变量 Book.method1(); //调用静态方法 } }
注意:同一个类的不同实例对象,共用一个静态变量时,如果一个对象将其更改,另一个对象的静态变量也会更改(静态变量在内存中共享)。
来看代码例子:
public class Book {
static int x; //类中定义静态变量
int y;
public Book (int x, int y){
this.x = x;
this.y = y;
}
public static void main(String[] args){
Book a = new Book(1, 2);
System.out.println("a1.x的值:" +a.x);
System.out.println("a1.y的值:" +a.y);
Book b = new Book(13, 17);
System.out.println("a2.x的值:" +a.x); //因为静态变量是共享的,所以在实例化对象b时会将对象a中的静态变量x值一起更改
System.out.println("a2.y的值:" +a.y); //不会改变对象a中的普通变量y的值
System.out.println("b.x的值:" +b.x);
System.out.println("b.y的值:" +b.y);
}
}
结果:
a1.x的值:1
a1.y的值:2
a2.x的值:13
a2.y的值:2
b.x的值:13
b.y的值:17
在内存中结构如下:静态变量x指向静态内存区的同一位置
2. 类的静态方法
通常情况下如果想要使用类中的成员方法,需要先将这个类实例化,有些时候我们不想或者无法创建类的对象时,还要调用类中的方法才能够完成业务逻辑,此时我们就可以使用静态方法。调用类的静态方法无需创建类的对象。
public class StaticMethod {
static public void show() {
System.out.println("This is a static method.");
}
public static void main(String[] args) {
StaticMethod.show(); //直接调用静态方法,不需要创建类的对象
}
}
结果:
This is a static method.
常用的Main方法以及System.out.println()方法就是一个典型的静态方法,不需要创建System对象就实现了输出功能。
3. 类的静态代码块
用static修饰的代码区域称为静态代码块,
public class StaticTest {
static {
System.out.println("静态代码块.");
}
{
System.out.println("非静态代码块.");
}
public StaticTest(){
System.out.println("构造方法.");
}
public void method(){
System.out.println("成员方法.");
}
public static void main(String[] args) {
StaticTest test = new StaticTest(); //构造方法在new时运行
test.method(); //成员方法在调用时运行
}
}
结果:
静态代码块.
非静态代码块.
构造方法.
成员方法.
在Java代码中,静态代码块总是会在非静态代码块之前运行,先运行静态代码块,然后再运行非静态代码块,然后再运行构造方法和成员方法,这个顺序也是Java代码区域运行的顺序。