final关键字
- final基础
- final修饰的类
- final修饰的方法
- final修饰的变量
- final修饰的引用
- final修饰的实例变量
final基础
1、final是java语言中的一个关键字。
2、final表示最终的,不可变的。
3、final可以修饰变量、方法和类等
final修饰的类
final修饰的类不能被继承。
final class A{
}
class B extends A{
//编译报错
//被final修饰的类不准被继承
}
final修饰的方法
final修饰的方法不能被重写。
class A{
public final void doSome(){
System.out.println("A doSome..");
}
}
class B extends A{
public void doSome(){
System.out.println("B doSome..");
}
//编译报错
//被final修饰的方法不能被重写
}
final修饰的变量
final修饰的变量只能赋一次值。
public class Test{
public static void main(String[] args)
{
//局部变量
int i =100;
//重新赋值
i==200;
//局部变量
final int k =100;
//重复赋值
k = 200;
//错误:无法为最终变量赋值
}
}
public class Test{
public static void main(String[] args)
{
final int m;
m = 100;//第一次赋值可以
m = 300;//第二次赋值不可以编译报错
}
}
final修饰的引用
final修饰的引用:
该引用只能指向一个对象,并且它只能永远指向该对象,无法再指向其他对象。
class Person{
int age;
public Person(){
}
public Person(int age){
this.age = age;
}
}
public class Test{
public static void main(String[] args)
{
Person p1 = new Person(20);
System.out.println(p1.age);
final Person p = new Person(30);
p = new Person(30);
//其实如上final修饰一样
//被final修饰的变量只能赋值一次
//p也是一个变量
//只不过它也是一个引用
//并且在该方法执行过程中
//该引用指向对象之后
//该对象不会被立即回收器回收
//直到当前方法结束,才会释放
}
}
final修饰的实例变量
局部对象是没有初始值,成员变量有初始值。
实例变量如果没有手动赋值的话,系统会赋默认值。
class User{
//实例变量
final int age;
//实例变量如果有final关键字
//要求程序员手动赋值
//不然报错
}
结论:final修饰的实例变量,系统不管赋默认值,要求程序员必须手动赋值。
实例变量什么时候赋值(初始化)
构造方法执行的过程中赋值(new的时候赋值)
class User{
//实例变量
final int age;
public User(){
this.age = 10;
//构造方法中赋值
//这样是允许的
//只要赶在系统赋默认值之前赋值就行
}
}
final修饰的实例变量一般添加static修饰
class Chinese{
Strting idCard;
String name;
stataic final String COUNTRY = "中国";
//既然country永远都是固定值
//说明实例变量值不会随着对象的改变而改变
//该实例变量前应该添加:static关键字,变为静态的存储在方法区
//country不会随着对象的值而改变
//最好是静态的,介绍内存
}
结论:
static final 联合修饰的变量称为“常量”
常量名建议全部大写,每个单词之间采用下划线衔接。
常量:实际上常量和静态变量一样,区别在于:常量的值不变。
常量和静态变量都存储在方法区,并且都是在类加载时初始化。