final关键字
final可以修饰类、成员变量和成员方法
1.用final修饰符定义最终类
通过extends关键字可以实现类的继承。但在实际应用中,出于某种考虑或者因素,再创建一个类时,希望该类不需要做出任何变动,或者不希望有任何子类,就可以使用final关键字。在定义类时使用final修饰符,意味着这个类不能再作为父类派生出其他子类,这样的类就被成为最终类
例如Java提供的String类,它对于编译器和解释器的正常运行有很重要的作用,不能轻易改变它,因此被定义为final类
2.用final修饰变量
可以修饰变量:(只要是变量)它被final修饰以后,值不能被改变。也就是说,只能给final修饰的变量赋一次值,不能二次赋值。
·final修饰的局部变量,生命周期结束在方法结束时,也就是说被final修饰的局部变量,仍然是一个局部变量。
·final 修饰的成员变量,一定要赋初值。且只能赋一次值。(重要)
·final修饰的引用类型的成员变量,也要赋初始值,且只能赋值一次。
·final修饰的局部变量(方法中定义的),可以先声明,再赋值,但是只能赋一次值。
成员变量被final修饰为什么一定要初始化?成员变量是成员的,是实例对象的,如果被final修饰以后,意为该成员变量是最终的,也就是说任何一个对象看到的都是一样的东西,不能跟随对象的改变而改变了,因为它是最终的。
对象的成员属性,是对象所有的,对象不同,变量值也不一样。如果被final修饰以后,不赋初始值,那么其他的对象都有能力将该值修改一下。那么这就不是最终的了。
3.用final修饰符定义最终方法
用final修饰符修饰的方法是不能被覆盖的,也称为最终方法,即子类可以继承但不允许重写的方法
常量
常量:常量,是一个常数,比如圆周率π,它不随任何东西的改变而改变,是客观存在的。因为常数,不是变量,所以不会被改变。这种不会被改变的量,我们在定义的时候要不要每个对象都给一份?我们希望全局只有一份,而且这一份不能被改变。常量在java中应该是这个样子,只分配一次内存,且只能赋值一次。
全局只有一份,在java中怎么做?static关键字修饰。因为static关键字修饰的变量在方法区内存中存在,在类加载的时候执行(分配空间),且只执行(分配空间)一次。但是被static修饰的变量,值是可以变得,内存地址只能被分配一次。我们发现final只能赋值一次,不能二次赋值。
所以,java中的常量是:final + static修饰的。
final static double PI = 3.1415;
PI在方法区内存中存在,因为static修饰的在类加载的时候执行,方法区的变量生命周期是整个程序结束。
PI只能被赋值一次,因为被final修饰,不可能再进行二次赋值,即不能被更改
常量书写的规则:单词字母全部大写,如果两个以上的单词连写,用”_”隔开
常量可以被定义为private的吗?语法上是过得去的,但是情理上是过不去的,因为常量就是要被其他类访问的,因此我们不建议定义为私有的,一般情况下都定义为public的。常量是很安全的,是不可能被改变的。
被final修饰的成员变量什么时候被赋值?
定义的时候赋值
也可以在构造方法中赋值
它到底是怎样被赋值的呢?它其实是在构造方法中被赋值。如果定义的时候给了一个初始值(不是默认值),