0%

Java(9)static关键字

static 关键字

如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象共享同一份数据。

image-20211210155937671

static修饰成员变量

image-20211210160029797

Student类

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.tipdm.demo05;

public class Student {
private String name; // 姓名
private int age; // 年龄
private int id; // 学号
static String room; // 所在教室
private static int idCounter = 0; // 计数器

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Student(String name, int age) {
this.name = name;
this.age = age;
this.id = ++idCounter;
}

public Student() {
this.id = ++idCounter;
}
}

调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.tipdm.demo05;

/**
* 如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象共享同一份数据。
*/
public class demo1 {
public static void main(String[] args) {
Student one = new Student("郭靖", 19);
one.room = "101";
System.out.println("姓名:" + one.getName() + ",年龄:" + one.getAge() + ",学号:" + one.getId() + ",教室:" + one.room);
Student two = new Student("黄蓉", 16);
System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge() + ",学号:" + two.getId() + ",教室:" + one.room);
// 只设置了one的教室,two同样生效
}
}
1
2
3
4
姓名:郭靖,年龄:19,学号:1,教室:101
姓名:黄蓉,年龄:16,学号:2,教室:101

进程已结束,退出代码0

static修饰成员方法

MyClass类

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
package com.tipdm.demo05;

public class MyClass {
int num; // 成员变量
static int numStatic; // 静态变量

// 成员方法
public void method(){
System.out.println("这是一个普通的成员方法。");
// 成员方法可以访问成员变量
System.out.println(num);
// 成员方法可以访问静态变量
System.out.println(numStatic);
}

public static void methodStatic(){
System.out.println("这是一个普通的静态成员方法");
// 静态方法不可以直接访问非静态变量
// System.out.println(num); // 错误写法
// 静态成员方法可以访问静态变量
System.out.println(numStatic);
// 静态方法中不能使用this关键字
// System.out.println(this); // 错误写法
}
}

调用:

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
29
30
31
32
33
34
35
36
37
38
39
40
package com.tipdm.demo05;

/**
* 一旦使用static修饰成员方法,那么这就成为了静态方法
* 静态方法不属于对象,而是属于类的。
*
* 如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。
* 如果有了static关键字,那么不需要创建对象,直接就能通过类名称来使用它。
*
* 无论是成员变量,还是成员方法。如果有了static,都推荐使用类名称进行调用。
* 静态变量:类名称.静态变量
* 静态方法:类名称.静态方法()
*
* 注意事项:
* 1. 静态只能直接访问静态,不能直接访问非静态
* 原因:因为在内存当中是【先】有的静态内容,【后】有的非静态内容,
* ”先人不知道后人,但是后人知道先人。“
* 2. 静态方法当中不能用this。
* 原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。
*/
public class demo2 {

public static void main(String[] args) {
MyClass obj = new MyClass(); // 首先创建对象
// 然后才能使用没有static关键字的内容
obj.method();
// MyClass.method(); // 错误调用方式
// 对于静态方法来说,可以通过对象名进行调用,也可以直接通过类名称来调用。
obj.methodStatic(); // 正确,不推荐,这种写法在编译后也会被javac翻译称为”类名称.静态方法名“
MyClass.methodStatic(); // 正确,推荐

// 对于本来当中的静态方法,可以省略类名称
myMethod();
}

public static void myMethod(){
System.out.println("自己的方法!");
}

}
1
2
3
4
5
6
7
8
9
10
这是一个普通的成员方法。
0
0
这是一个普通的静态成员方法
0
这是一个普通的静态成员方法
0
自己的方法!

进程已结束,退出代码0

静态代码块

静态代码块的格式:

1
2
3
4
5
public class 类名称{
static {
// 静态代码块的内容
}
}

特点:

  • 当【第一次】用到本类时,【静态代码】块执行唯一的一次。
  • 静态内容总是优先于非静态。所以静态代码块比构造方法先执行。

静态代码块的典型用途:

  • 用来一次性地对静态成员变量进行赋值

Person类:

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.tipdm.demo05;

public class Person {

public Person(){
System.out.println("构造方法执行");
}

static{
System.out.println("静态代码块执行!");
}

}

调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.tipdm.demo05;

/**
* 静态代码块的格式:
* public class 类名称{
* static {
* // 静态代码块的内容
* }
* }
* 特点:当【第一次】用到本类时,【静态代码】块执行唯一的一次。
* 静态内容总是优先于非静态。所以静态代码块比构造方法先执行。
*
* 静态代码块的典型用途:
* 用来一次性地对静态成员变量进行赋值
*/
public class demo4 {
public static void main(String[] args) {
Person one = new Person(); // 静态代码块先执行
Person two = new Person(); // 第二次执行构造方法
}
}
1
2
3
4
5
静态代码块执行!
构造方法执行
构造方法执行

进程已结束,退出代码0
-------------本文结束感谢您的阅读-------------