深入理解final关键字和static关键字以及初始化顺序
final关键字(基础1中提到)
final关键字可以修饰类、方法和引用。
修饰类,该类不能被继承。并且这个类的对象在堆中分配内存后地址不可变。
修饰方法,方法不能被子类重写。
修饰引用,引用无法改变,对于基本类型,无法修改值,对于引用,虽然不能修改地址值,但是可以对指向对象的内部进行修改。
final class Fi {
int a;
final int b = 0;
Integer s;
}
class Si{
//空白final
//一般情况下final修饰的变量一定要被初始化。
//只有下面这种情况例外,要求该变量必须在构造方法中被初始化。
//并且不能有空参数的构造方法。
//这样就可以让每个实例都有一个不同的变量,并且这个变量在每个实例中只会被初始化一次
//于是这个变量在单个实例里就是常量了。
final int s ;
Si(int s) {
this.s = s;
}
}
class Bi {
final int a = 1;
final void go() {
//final修饰方法无法被继承
}
}
class Ci extends Bi {
final int a = 1;
// void go() {
// //final修饰方法无法被继承
// }
}
final char[]a = {
'a'};
final int[]b = {
1};
---------------------
作者:How 2 Play Life
来源:CSDN
原文:https://blog.csdn.net/a724888/article/details/80048792
版权声明:本文为博主原创文章,转载请附上博文链接!
final修饰方法时,此方法不能被重写,但是注意:因为重写前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同样访问控制权限是private,将会导致子类中不能直接继承此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而在子类中重新定义了新的方法。
public class B extends A {
public static void main(String[] args) {
}
public void getName() {
}
}
class A {
/**
* 因为private修饰,子类中不能继承到此方法,因此,子类中的getName方法是重新定义的、
* 属于子类本身的方法,编译正常
*/
private final