书接上回,上篇Static说明了:Static可以修饰变量,以及修饰变量的两个使用场景。

其实Static不止可以修饰变量,还可以修饰方法,修饰代码块

修饰方法的时候:Static修饰的方法可以被类名.方法名的方式直接调用,可以避免造对象,好处是

  • 避免了new 对象,避免了在中开辟内存,直接加载类的时候将静态方法加载进方法区。
  • 设计工具类的时候多半考虑用Static关键字。

使用类方法,实例方法的注意事项

Static修饰方法及代码块

Static修饰方法应用场景-设计工具类

设计一个验证码工具类,给出一个验证码的长度,帮你自动生成一串随机的验证码,这个工具类是不需要你创造对象就可以使用的,所以可以使用Static修饰成员方法,通过类名.方法名直接调用。(避免了new对象可以节省时间资源和内存资源)。

Notice: 这个验证码方法过于简单,可以看之前的string

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
package com.xlkh.dmeo03;

import java.util.Random;

public class MyRandomCodeUtils {
private MyRandomCodeUtils(){}; // 空参构造方法

public static String getRandomCode(int length){
if (length <= 0){
return null;
}
Random r = new Random();
String data = "ABCDEFGHIJKLMNPQRSTUVWXZabcdefghijklmnopqrstuvwxyz23456789";
String res = "";
for (int i = 0; i < length; i++) {
// 1,生成一个随机数(比如length=10 则会在1-9产生一个随机数
int index = r.nextInt(data.length());
// 2, 根据index 从data中获取一个字符,并拼接到res中
res += data.charAt(index);

}
return res;
}
}


// MyRandomCodeUtils的测试类
package com.xlkh.dmeo03;

public class TestMyRandomCodeUtils {
public static void main(String[] args) {
String code = MyRandomCodeUtils.getRandomCode(5);
System.out.println(code);
}
}

Static修饰代码块

首先,代码块是什么东西:

  • 代码块是类的五大成分之一(成员变量,成员方法,构造器,代码块,匿名内部类)

静态代码块

实例代码块

实例代码块的作用和构造器的作用是一样的,用来给对象初始化值;而且每次创建对象之前都会先执行实例代码块。

Summary

  • 静态代码块,随着类的加载而执行,而且只执行一次。
  • 实例代码块每次创建对象之前都会执行一次。
  • 实例代码块的执行时机是构造器的第一句之后,第二句之前。(可以看如下的代码调试演示)

CodeDemo

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 com.xlkh.dmeo03;

public class A {
public A(){
super();
System.out.println("构造方法执行了....");
}
// 实例代码块
{
System.out.println("实例代码块执行了....");
}
static {
num = 123;
System.out.println("静态代码块执行了....");
}
static int num;

}

// A 的测试类
package com.xlkh.dmeo03;

public class TestA {
public static void main(String[] args) {
// 实例化两个对象,观察静态代码块和实例代码块各自被执行了多少次,以及num有没有值
A a1 = new A();
A a2 = new A();

// 最终得出的结论是:实例代码块的执行时机是在构造方法第一句之后(往往是super();继承自父类),第二句之前
System.out.println(A.num);
}
}