摘要

有关static的一系列注意点

正文

浅谈static关键字

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

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

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

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

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

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

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

text
 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 {

​ // 静态代码块的内容

​ }

}

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

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

静态代码块的典型用途:

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

text
 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();
		
		//经过上述测试,静态代码块,只执行一次
	}
	
}