Java基础 -- 关键字Static和Final
1. Static
- java static关键字可以用在变量、方法、代码块和嵌套类上
1.静态变量
2.静态方法
3.静态代码块
4.静态内部类
1.1 修饰成员变量
- 被static 修饰的成员变量叫静态变量
1.运行时,Java 虚拟机只为静态变量分配一次内存,加载类过程中完成静态变量的内存分配。
2.在类的内部,可以在任何方法内直接访问静态变量。
3.在其他类中,可以通过类名访问该类中的静态变量。
- 没有被 static 修饰的成员变量叫实例变量
1.每创建一个实例,Java 虚拟机分配一次内存
2.在类的内部,可以在非静态方法中直接访问实例变量。
3.在其他类中,通过实例对象调用。
- 提高代码的可读性
1.2 修饰方法
- 被static 修饰的方法叫静态方法
1.静态方法,属于类,而不属于类的对象。
2.静态方法中无法使用this,super。
- 没有被static 修饰的方法叫成员方法
1.可直接访问所属类的静态变量、静态方法、实例变量和实例方法。
1.3 代码块
静态代码块在类加载的时候执行一次,是最早被执行的
构造代码块在每一次创建对象时执行,始终在构造方法前执行。
构造方法在新建对象时调用( 就是new的时候 )。
1.3.1 代码块01
- 执行顺序:静态代码块 → main → 构造代码块 → 构造方法
public class Demo01 {
static{
System.out.println("父类静态代码块开始执行!");
}
{
System.out.println("父类构造代码块开始执行!");
}
public Demo01(){
System.out.println("父类构造方法开始执行!");
}
public static void main(String[] args) {
System.out.println("父类开始运行main");
new Demo01();
}
}
1.3.2 代码块02
- 执行顺序:父类静态代码块 → 子类静态代码块 → main → 父类构造代码块 → 父类构造方法 → 子类构造代码块 → 子类构造方法
public class Demo02 extends Demo01{
static{
System.out.println("子类静态代码块开始执行!");
}
{
System.out.println("子类构造代码块开始执行!");
}
public Demo02(){
System.out.println("子类构造方法开始执行!");
}
public static void main(String[] args) {
System.out.println("子类开始运行main");
new Demo02();
}
}
2. Final
- final关键字可用于修饰类,方法,变量(成员变量,局部变量,静态变量)
1.被final修饰的类是一个最终类,不可以被继承。
2.被final修饰的方法是一个最终方法,不可以被覆盖,但是可以被继承。
3.被final修饰的变量只能是一个常量,只能赋值一次。
2.1 初始化
final修饰的属性又叫常量一般用 XX_XX_XX来命名
class A{
//一、在定义时
public final double TAX_RATE1 = 0.08;
public final double TAX_RATE2;
public final double TAX_RATE3;
//二、在构造器中
public A(){
TAX_RATE2=1.1;
}
//三、在代码块
{
TAX_RATE3 = 1.8;
}
}
//若final修饰的属性是静态的,则初始化
class B{
//一、在定义时
public static final double TAX_RATE1=99.9;
public static final double TAX_RATE2;
//二、在静态代码块
static{
TAX_RATE2=3.3;
}
}
2.2 思考
- 为什么当final修饰的属性为静态时,不可在构造器中初始化?
构造器在创建对象的时候才会被调用,而静态变量的初始化在类加载时就要给值。
- 为什么在静态方法里不能操作类成员变量?
因为静态方法先加载,还没有实例化对象,哪来的这个属性。调用成员方法时,成员变量和方法已经是一个对象的了。
3. 类属性值的Null和非空判断
Utils Code
import java.util.Collection;
public class AttributeValidate {
private static final String NOT_NULL_FAILURE_MESSAGE = "does not accept null args";
private static final String NOT_EMPTY_FAILURE_MESSAGE = "does not accept empty args";
public static void notNull(Object... args_) {
if (args_ == null)
throw new IllegalArgumentException(NOT_NULL_FAILURE_MESSAGE);
for (Object arg : args_) {
if (arg == null)
throw new IllegalArgumentException(NOT_NULL_FAILURE_MESSAGE);
}
}
public static void notEmpty(Object... args_) {
if (args_ == null)
throw new IllegalArgumentException(NOT_EMPTY_FAILURE_MESSAGE);
for (Object arg : args_) {
if (arg == null)
throw new IllegalArgumentException(NOT_EMPTY_FAILURE_MESSAGE);
if (arg instanceof Collection<?>) {
if (((Collection<?>) arg).size() == 0)
throw new IllegalArgumentException(NOT_EMPTY_FAILURE_MESSAGE);
}
}
}
}
Test Code
AttributeValidate.notNull(。。。。。。);
4. Awakening
在一秒钟内看到本质的人和花半辈子也看不清一件事本质的人,自然是不一样的命运。