Java关键字之static

Posted by Chenyawei on 2019-11-22
Words 1.2k and Reading Time 4 Minutes
Viewed Times

一. 什么是static关键字

  • 我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!!
  • Java 中被 static修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被==类的所有对象==所共享。
  • 方便在没有创建对象的情况下进行调用(变量或方法)。
  • 静态成员可以使用类名直接访问,也可以使用对象名进行访问。

二. 静态变量

使用 static 可以修饰变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test1 {
// static修饰的变量为静态变量,所有类的对象共享hobby
static String hobby = "Tedu";

public static void main(String[] args) {
// 静态变量可以直接使用类名来访问,无需创建对象
System.out.println("通过类名访问hobby:" + Test1.hobby);
// 创建类的对象
Test1 t1 = new Test1();
// 使用对象名访问静态变量
System.out.println("使用对象名访hobby:" + t1.hobby);
// 使用对象名的形式修改静态变量的值
t1.hobby = "cjj";
// 再次使用类名访问静态白变量,值已经被修改
System.out.println("通过类名访问hobby:" + Test1.hobby);
}
}

运行结果:

1
2
3
通过类名访问hobby:Tedu
使用对象名访hobby:Tedu
通过类名访问hobby:cjj

三. static 使用之静态方法

使用 static 修饰方法,称为静态方法或类方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test01 {
//使用static关键字声明静态方法
public static void print() {
System.out.println("欢迎你:Cjj!");
}

public static void main(String[] args) {
//直接使用类名调用静态方法
Test01.print();
//也可以通过对象名调用,当然更推荐使用类名调用
Test01 t1 = new Test01();
t1.print();
}
}

运行结果:
1
2
欢迎你:Cjj!
欢迎你:Cjj!

3.static 使用之静态初始化块
Java 中可以通过初始化块进行数据赋值。如:
1
2


注意:

  1. 静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!~~
  2. 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如:

    如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。如:
  3. 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量,如:
  4. 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class Test01 {
    String name = "Cjj"; //非静态成员变量
    static String hobby = "study"; //静态成员变量

    //普通成员方法
    public void print1() {
    System.out.println("普通成员方法~~~");
    }

    //静态成员方法
    public static void print2() {
    System.out.println("静态成员方法~~~");
    }

    public static void main(String[] args) {
    //普通成员方法必须通过对象来调用
    Test01 t1 = new Test01();
    t1.print1();
    //可以直接调用静态方法
    print2();
    }
    }

    四.static 使用之静态初始化块

    Java 中可以通过初始化块进行数据赋值。如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Test01 {
    String name = "chenyw";

    //通过初始化块为成员变量赋值
    {
    name = "cjj";
    }

    public static void main(String[] args) {
    Test01 test01 = new Test01();
    System.out.println("name="+test01.name);
    }

    }
    运行结果:
    1
    name=cjj

注意:

静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。

我们来看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Test02 {
int num1;
int num2;
static int num3;

public Test02() {// 构造方法
num1 = 11;
System.out.println("通过构造方法为变量num1赋值");
}

{ // 初始化块
num2 = 22;
System.out.println("通过初始化块为变量num2赋值");
}

static {// 静态初始化块
num3 = 33;
System.out.println("通过静态初始化块为静态变量num3赋值");
}

public static void main(String[] args) {
Test02 t1 = new Test02(); //创建对象
System.out.println("num1:" + t1.num1);
System.out.println("num2:" + t1.num2);
System.out.println("num3:" + num3);

}
}

运行结果:
1
2
3
4
5
6
通过静态初始化块为静态变量num3赋值
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
num1:11
num2:22
num3:33

通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。类是在第一次使用的时候才加载,加载之后就不会移除

内容来源:https://www.cnblogs.com/chuijingjing/p/9452893.html


notice

欢迎访问 chenyawei 的博客, 若有问题或者有好的建议欢迎留言,笔者看到之后会及时回复。 评论点赞需要github账号登录,如果没有账号的话请点击 github 注册, 谢谢 !

If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !