这里写目录标题
final修饰符
final修饰类
表示”最终的类“
当用final修饰一个类时,表明这个类不能被继承
- 除了这一点外,这个类照常使用,比如创建对象,比如访问方法,比如继承别的类
- 从设计角度来讲,一个final修饰的类应该是
- 不需要复用成员
- 功能已经特别强大,足够满足需求
- 需要绝对的保证安全,以致于不让它被继承
- 常见的final类
- String
- System
- Math
- 所有基本数据类型的包装类和一个Void
- Boolean,Character,Short,Integer,Long,Float,Double,Byte,Void
- 除非你十分确定这个类以后不会被用来继承 ,为了保证安全,可以设置一个类为final类
- 不然一般情况下,尽量不要把一个类设置成final
final修饰方法
表示”最终的方法“
当一个方法被final修饰后,可以被继承,但是无法被重写
- final修饰方法,就把方法锁住了,任何继承这个方法的类都无法覆盖该方法
- 如果一个方法已经能够满足需求,并且明确知道它不应该被修改,修改会产生问题
- 可以将方法设置成final方法
- 否则,正常情况下,不要随便使用final修饰方法
final修饰变量
表示”最终的变量“,是一种自定义常量,普遍来说,命名应该采用全大写,下划线连接的方式
修饰变量是final用得最多的地方,也是可能混淆的地方
总体来说,final修饰变量后
- 如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改
- 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象
- 但是其引用的对象的状态是可以改变的
final修饰普通成员变量
- final修饰普通成员变量,表示常量,创建对象以后,它们的值就不可改变了
- 总结给普通成员变量赋值的方式
- 显式初始化语句
- 构造代码块
- 构造器
- 创建对象后,调set方法,或者直接赋值
- 对于final修饰的普通成员变量,前三种必然要有一种
- 对于同一个类的同一个final修饰的变量,不同对象可能会有不同的值
final修饰静态成员变量(常用)
- final修饰静态成员变量,表示全局常量,一个类类加载完毕后,它们的值就不可改变了
- 被所有对象共享,每个对象都必须有同一个值,且不可改变
- 给final静态成员变量赋值
- 显式赋值语句
- 静态代码块
- final static 还是static final?
- 建议用static final
final修饰局部变量
- 在方法体中定义final常量,表示该常量不可更改
- 必须显式的赋值初始化,不然也没别的方式初始化了
- 在形参列表中声明final常量,表示该参数是一个常量,在接收后无法修改
特别的final修饰引用数据类型
- 表示引用指向的对象不可变,但对象的状态可变
- 例如final修饰Student类型的变量s,则s的地址值不能改变,
- 也就是说s要始终指向同一个对象。 但是所指对象的属性值可以改变,只要对象的地址不变即可
final修饰普通成员变量,表示常量,创建对象的时候,也只能初始化它的值一次,这个过程中也不能改了。创建对象以后,它们的值就不可改变了
- 对于一个final变量
- 构建对象之后,它们的值就不可以被修改了
- 如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改
- 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象
- 使用final修饰一个基本数据类型变量,该变量就变成了常量,只能被赋值初始的一次
- 自定义常量,无法在程序执行时改变
- 对于常量,我们最好static final一起使用
- 对于基本数据类型而言,final修饰后,值就不可变了
- 对于引用数据类型而言,final修饰后,引用的地址就不可变了,但引用对象的状态可以改变
注意:
-
常量必须显示初始化,即必须赋值一次,不用能默认值。
-
只能赋值一次,即使之后的赋值和原来的值一样也不行
杀牛用鸡刀
读下列代码,分析执行结果
public int test(final int a){
//return a++;
return a+1;
}
public class Test{
public static void main(String[] args){
Student s = new Student();
new Test().test(s);
}
public void test(final Student s){
s = new Student();
//s.age++;
}
}
class Student{
public int age;
}
static修饰符
static概念及特点
static访问特定