"final"
目录
2.为什么在构造器内我们无法使用”static"修饰词且无法为静态属性赋值?
3.为什么构造器不能被"final"或"static"修饰?
4.为什么我们通常将"static final"共同使用而不是单独使用"static"?
5.为什么抽象方法不能被"final"或"static"或"private"修饰
1."final"修饰词的作用是什么?
- 修饰类属性或局部变量,使类属性或局部变量无法被修改;
- 修饰方法,使方法无法被重写;
- 修饰类,使类无法被继承;
- 修饰引用数据类型变量,final 保证这个引用类型变量所引用的地址不会发生改变,但该对象的值是可以改变的。
2.为什么在构造器内我们无法使用”static"修饰词且无法为静态属性赋值?
-
因为在类的创建过程中,静态属性的初始化优先于构造的调用,即按时间顺序来的话,当该类静态属性加载完毕时,该类的构造器一定还没有被调用,此时在构造器对静态属性进行的操作会被跳过,有点亡羊补牢的意思,所以编译器会直接报错。
3.为什么构造器不能被"final"或"static"修饰?
- 构造器不时通过继承得到的,所以没有必要把它声明为final的。(没必要让构造器无法被继承)
- 构造器总是关联一个对象而被调用,所以把它声明为static是没有意义的。(构造器的调用往往会产生一个新的对象,而我们用"static"修饰一个方法的原因是想跳过对象的建立而调用对象的方法,把构造器看作方法的话,"static"没有意义。)
关于构造器的修饰词问题可参考以下链接
https://www.cnblogs.com/hdu-2010/p/4110106.html
https://www.cnblogs.com/hdu-2010/p/4110106.html
4.为什么我们通常将"static final"共同使用而不是单独使用"static"?
- 调用被"static final"共同修饰的类属性时(类方法不适用),不会导致类的加载!(底层编译器做了优化处理)
-
public class Main { public static void main(String[] args) { System.out.println(test.i); } } class test{ static final int i=666; static { System.out.println("糟糕静态代码块被调用啦"); } }
输出结果为 666
5.为什么抽象方法不能被"final"或"static"或"private"修饰
- 抽象方法需要子类继承实现所以不能修饰为"final"或"private";
- 抽象方法未被实现,定义为"static"毫无意义;