Java SE笔记: static关键字(静态和成员)

  • 成员是对象级别的,访问成员必须用“引用.”,如果用“类名.”访问会报错!
  • 静态是类级别的,访问静态必须用类“类名.”,如果用“引用.”也能访问,但是底层仍使用“类名.”,并不会用到对象,如果用空引用访问静态,也不会报错,因为静态访问与对象无关!
  • 何时使用静态:一般情况下工具类中的方法大部分都是静态方法!
  • 静态方法中无法访问非静态变量。

    如果用空引用访问成员则会发生空指针异常!

静态变量和成员变量

解释静态变量诞生的:
如下程序在堆栈中的结构如图,那么每个animal对象中都有一个属性“陆生”,那么将会造成内存空间的浪费,所以可以定义静态变量!

如下图,已定义static变量,该变量存放在方法区,属于类级别,所以用类名点访问!

什么时候变量声明成静态变量?
如果这个属性所有的对象都有,并且这个属性的值是相同的,则该属性声明成静态的属性。

成员变量:创建java对象的时候初始化。一般用getter和setter方法访问和修改!
静态变量:在类加载阶段赋值,并且只赋值一次。一般用类名点访问。

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
public class StaticTest04{
public static void main(String[] args){
Animal a1 = new Animal("AAA",10);
Animal a2 = new Animal("BBB",11);

//如何访问(类名.)
System.out.println(Animal.type);

//也可以使用 引用. 此时实质上并没有用到该引用
System.out.println(a1.type);

Animal a3 = null;
System.out.println(a3.type); //静态变量底层访问的时候一定使用的 类名. 和对象无关,不会出现空指针异常。
}
}

//抽象现实世界中的“陆生”动物
class Animal{ //Field
//成员变量(一个对象一份.)
//成员变量在创建对象的时候初始化,并且存储在堆中的每一个对象中。
String name;
int age;

//静态变量,被存储在方法区.
//所有的java对象共享这一份。
//所以静态变量是类级别的,使用“类名.”的方式访问.
static String type = "陆生";

//Constructor
Animal(String name,int age){
this.name = name;
this.age = age;
}
}

静态方法和成员方法

  • 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
public class StaticTest03{
//成员方法
//成员方法必须使用“引用.”调用
public void m1(){

}

//静态方法
//可以使用“类名.”方式调用.也可以用“引用.”,即使用的是“引用.”,底层还是用的“类名.”
//静态方法中不能直接访问非静态数据.
//静态方法中不能使用this
public static void m2(){
System.out.println("m2....");
}

//入口
public static void main(String[] args){
StaticTest03 st = new StaticTest03();
st.m1();
m2();

//静态的方法按照正规的方式访问:“类名.”
//静态的方法也能用“引用.”访问
st.m2(); //编译阶段检查出st是StaticTest03类型,编译通过,运行的时候,仍然使用 "StaticTest03."的方式访问。
//该方法执行不需要对象。

//空的引用去访问成员的时候会出现空指针异常。
//m2方法不是“成员”而是静态的。
//所以即使引用是空的,也不会报空指针异常。
StaticTest03 s = null;
s.m2();
}
}

静态语句块和实例语句块

  • 静态语句块:
    • 在类加载阶段执行,并且只执行一次,并且是自上而下的顺序执行。
  • 实例语句块:
    • 每一次调用构造方法之前会执行一次。
    • 实例语句块执行顺序也是自上而下。
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
public class StaticTest02{
//静态语句块
static{
System.out.println("A");
}

//实例语句块
{
System.out.println("1");
}

{
System.out.println("2");
}

{
System.out.println("3");
}

//构造方法
StaticTest02(){
System.out.println("StaticTest02无参数的构造执行!");
}

//入口
public static void main(String[] args){
//调用构造方法
new StaticTest02();
new StaticTest02();
new StaticTest02();
}
}
文章目录
  1. 1. 静态变量和成员变量
  2. 2. 静态方法和成员方法
  3. 3. 静态语句块和实例语句块