这篇文章我们学习一下Java中final和static关键字的作用!
「修饰引用」:
final关键字可以用来修饰引用、方法和类。
「修饰方法」:
当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。
「修饰类」:
当用final修改类时,该类成为最终类,无法被继承。简称为“断子绝孙类”。比如常用的String类就是最终类。
被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的,换言之,一处变、处处变。JDK把不同的静态资源放在了不同的类中而不把所有静态资源放在一个类里面,很多人可能想当然认为当然要这么做,但是是否想过为什么要这么做呢?个人认为主要有三个好处:
静态资源属于类,但是是独立于类存在的。从JVM的类加载机制的角度讲,静态资源是类初始化的时候加载的,而非静态资源是类new的时候加载的。类的初始化早于类的new,比如Class.forName(“xxx”)方法,就是初始化了一个类,但是并没有new它,只是加载这个类的静态资源罢了。所以对于静态资源来说,它是不可能知道一个类中有哪些非静态资源的;但是对于非静态资源来说就不一样了,由于它是new出来之后产生的,因此属于类的这些东西它都能认识。可知:
与非static的区别:
注意:
「父子类中静态和非静态的关系:」
对于非静态属性,子类可以继承父类非静态属性;但是当父子类出现相同的非静态属性时,不会发生子类的重写并覆盖父类的非静态属性,而是隐藏父类的非静态属性。对于非静态方法,子类可以继承并重写父类的非静态方法。对于静态属性,子类可以继承父类的静态属性,但是如何和非静态属性一样时,会被隐藏。对于静态方法,子类可以继承父类的静态方法,但是不能重写静态方法,同名时会隐藏父类的。
注:静态属性、静态方法、非静态属性都可以被继承和隐藏,但是不可以被重写,非静态方法可以被重写和继承
静态代码块只能写在类中方法外,不能写在方法中,它会随着类的加载而优先于各种代码块和构造方法的加载,并且只会加载一次,如果出现多个静态代码块,会按照书写顺序加载。
静态块也是static的重要应用之一。也是用于初始化一个类的时候做操作用的,和静态变量、静态方法一样,静态块里面的代码只执行一次,且只在初始化类的时候执行。
静态代码块是严格按照父类静态代码块->子类静态代码块的顺序加载的,且只加载一次。
「静态代码块的作用」:
对于普通方法:普通方法是需要加载类new出一个实例化对象,通过运行这个对象才能运行代码块,而静态方法随着类加载就运行了。对于静态方法:在类加载时静态方法也加载了,但是必须需要类名或者对象名才可以访问,相比于静态代码块,静态方法是被动运行,而静态代码块是主动运行
注意:静态代码块不能出现在任何方法体内。静态代码块不能访问普通变量,普通变量只能通过对象调用的,所以普通变量不能放在静态代码块中
执行顺序:「静态代码块>构造代码块>构造函数>普通代码块」