JavaTutorial

类的静态成员

现在我们就来学习static关键字

静态变量

Java语言中,静态指的是不需要创建对象,就可以通过类名来索引的东西;而动态则是创建对象后,通过对象引用才能访问的东西。

static修饰的变量,称为静态变量,同样是来自于C语言

代码9
#include <stdio.h>

void f() {
    int j = 0;
    static int i = 1;
    i++;
    j++;
    printf("i=%d, j=%d\n", i, j);
}

int main() {
    f();
    f();
    return 0;
}

从执行结果来看,两次调用f()函数,j的值相同,而i的值不同。

这是因为静态变量在程序编译就被创建,且只被创建一次

而动态变量j在调用f()时被创建,调用结束就被销毁

Java中的static具有相似的作用,不过它只能修饰类的成员,不能修饰局部对象

且看一个Java程序如下:

代码10

class Person {
    private String name;
    private int age;
    public static int num = 0;     //记录创建了多少个Person对象
    public Person(String name, int age) {
       this.name = name;
       this.age = age;
       this.num = this.num + 1;
   }
}

public class FirstSample {

    public static void main(String[] args) {
        Person stu = new Person("Mary", 20);
        Person tea = new Person("Mike", 80);
        System.out.println(stu.num);
        System.out.println(tea.num);
    }
}

静态方法

Java程序的主函数定义如下:public static void main(...){...},main函数被static修饰。被static修饰的函数就是静态方法。

通过引用类名来调用静态方法。

导入静态成员

在Java5.0时期,引入了静态导入的新特性,静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出它们的类名:

代码11
import static java.lang.Math.*;

public class FirstSample {

    public static void main(String[] args) {
        //Math.random()默认产生大于等于0.0且小于1.0之间的随机double型随机数
        System.out.println(random()*10);
        System.out.println(PI);
    }
}

编写静态类

如果某个属性(变量、常量、方法)不需要创建对象就可以引用,那么把这个属性作为静态属性

代码12

//不需要访问类的属性,可以定义为静态变量
class MathLJL {
    public static double PI = 3.14159;
    public static double E = 2.718;
    public static double max(double num1, double num2) {
        return num1 > num2 ? num1 : num2;
    }
}

public class FirstSample {
    public static void main(String[] args) {
        System.out.println(MathLJL.PI);
        System.out.println(MathLJL.E);
        System.out.println(MathLJL.max(12.3, 15.8));
    }
}

静态代码块

类的成员除了属性和方法之外,还可以有代码块,Java中使用{}括起来的代码称之为代码块

staticD/FirstSample

staticD/FirstSample

public class FirstSample {

    {
        System.out.println("构造代码块");
    }
    static {
        System.out.println("静态代码块");
    }
    public FirstSample() {
        System.out.println("构造器");
    }
    public static void main(String[] args) {
        System.out.println("主方法");
        new FirstSample();
        new FirstSample();
    }
}

输出结果应该如下:

静态代码块
主方法
构造代码块
构造器
构造代码块
构造器

可以看出执行顺序为:

graph TB; 静态代码块 --> 主方法 --> 构造代码块 --> 构造器;

且静态代码块只执行一次。至于静态代码块有什么用处,我们以后会说到。

构造函数相当于静态方法

构造函数上不能应用static关键字