言成言成啊 | Kit Chen's Blog

浅谈static关键字

2019-09-16

浅谈static关键字

如果一个成员变量使用了static关键字,则该成员变量不再属于对象自己,而是属于类

如果一个成员方法使用了static关键字,则该成员方法不再属于对象自己,而是属于类

如果没有static关键字,则必须创建对象,然后才能通过对象使用它。

如果有了static关键字,则不需要创建对象,直接就能通过类名称来访问

无论是成员变量,还是成员方法,如果有了static,都推荐使用类名称来调用

静态变量:类名称.静态变量

静态方法:类名称.静态方法()

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package demo03;

class MyClass {
String name;
static int age;
public void method() {
System.out.println("这是一个成员方法");
}
public static void methodStatic() {
System.out.println("这是一个静态方法");
//System.out.println(name);//报错,静态方法中不能访问非静态变量
System.out.println(age);//静态方法中可以访问静态变量
}
}
public class Demo03StaticMethod {

/*
* 一旦使用了static修饰成员方法,那么这就成为了静态方法。静态方法不属于对象,而是属于类
* 如果没有static关键字,那么必须创建对象,然后才能通过对象使用他
* 如果有了static关键字,那么不需要创建对象,直接就能通过类名称来访问他
*
* 无论是成员变量,还是成员方法,如果有了static,都推荐使用类名称进行调用
* 静态变量:类名称.静态变量
* 静态方法:类名称.静态方法()
*
*
*注意事项:
*1.静态不能直接访问非静态
*原因:因为在内存当中是`先`有静态的内容,`后`有非静态的内容
*"先人不知道后人,但是后人知道先人"
*2.静态方法中不能使用this
*原因:this代表当前对象,通过谁调用的方法,谁就是当前的对象
*
*
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyClass obj=new MyClass();
obj.method();

//对于本类当中的静态方法,前面的类名称可以省略
//test.haha();//如果没有使用static关键字,则会报错
haha1();
Demo03StaticMethod.haha1();//这两个是完全等效

//对于静态方法来书,可以通过对象名进行调用,也可以直接通过类名进行调用
obj.methodStatic();//正确,不推荐。这种方法在编译之后也会被javac翻译成"类名称.静态方法名"
MyClass.methodStatic();//正确,推荐
}
public void haha() {
System.out.println("haha");
}
public static void haha1() {
System.out.println("haha1");
}

}

注意事项:

  • 静态不能直接访问非静态。
    • 原因:因为在内存当中是有静态的内容,有非静态的内容
    • 先人不知道后人,但是后人知道先人
  • 静态方法中不能使用this
    • 原因:this 代表当前对象,通过谁调用的方法,谁就是当前的对象

浅谈静态代码块

静态代码块:

public class 类名称 {

​ static {

​ // 静态代码块的内容

​ }

}

特点:当第一次用到本类时,静态代码执行唯一的一次

静态内容总是优先于非静态,所以静态代码块比构造方法先执行

静态代码块的典型用途:

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

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
package demo03;

/*
静态代码块:
public class 类名称 {
static {
// 静态代码块的内容
}
}
特点:当第一次用到本类时,静态代码执行唯一的一次
静态内容总是优先于非静态,所以静态代码块比构造方法先执行

静态代码块的典型用途:
用来一次性地对静态成员变量进行赋值
*/
class Student {

public Student() {
System.out.println("构造函数执行");
}
static {
System.out.println("静态代码执行唯一一次");
}
}
public class Demo03Static {
public static void main(String[] args) {
Student s=new Student();
Student s1=new Student();

//经过上述测试,静态代码块,只执行一次
}

}
阅读量