final关键字修饰
final
- final是java语言中的一个关键字
- fianl表示最终的,不可变的。
- final可以修饰变量以及方法,还有类等。
- final修饰的类无法继承。
- final修饰的方法无法被覆盖,被重写。
- final修饰的局部变量只能被赋值一次。
- final控制不了调用问题,final修饰的表示最后的,不能改变的。
final修饰的类
final class A{
//final修饰的A类没有子孙
}
/*
class B extends A{ //编译报错
B类继承A类,相当于对于A类的功能进行扩展。如果你不希望别人对A类进行扩展,
可以给A类加final关键字,这样的话A类就无法被继承了。
}
*/
final修饰的方法
class C{
public final void doSome(){
System.out.println("C");
}
}
class D extends C{
/*
覆盖父类C中的doSome方法
public void doSome(){
System.out.println("D");
}
编译报错,覆盖的方法为final
*/
}
final修饰的变量
注意:final修饰的变量只能赋一次值
final修饰的局部变量
public static void main(String[] args) {
//fianl修饰的局部变量
final int k=100;
/*
k=200;重新赋值
错误
*/
final int m;
m=200;
//m=300;第二次赋值失败,编译报错
}
final修饰的引用
public class Test {
/*
final修饰的变量只能赋一次值,“引用”也一样是变量
final修饰的引用:该引用只能指向一个对象,并且它只能永远指向该对象,无法再指向其他对象。
并且在该方法执行过程中,该引用指向该对象之后,该对象不会被垃圾回收器回收,直到当前方法结束,才会释放空间。
虽然final的引用指向对象A后,不能再重新指向对象B,但是对象A内部的数据可以被修改。
*/
public static void main(String[] args) {
//A a始终是一个变量,不过这里他有一个特殊的名字:引用
final A a=new A(20);
System.out.println(a.i);
//a=new A(30); 编译报错
//如果给a一个null:a=null; 不行,依然编译报错
/*
就如同final修饰的局部变量一般,只不过基本数据类型变成了引用数据类型
final int i=20;
i=30; 编译报错
*/
}
}
class A2{
int i;
public A2(){
}
public A2(int i){
this.i=i;
}
}
final修饰的实例变量
public class Test {
/*
final修饰的变量只能赋值一次。
注:实例变量如果没有手动赋值系统会默认赋值。
final修饰的实例变量,要求必须手动赋值,系统不负责赋默认值。
手动赋值可以在变量后面赋值,也可以在构造方法中赋值。
*/
public static void main(String[] args) {
}
}
class A {
//final int a; 编译错误,final修饰的实例变量,系统不会赋默认值
final int a = 0;
//以下代码全部联合起来,b变量也只赋值了一次
final int b;
/*
手动写出构造方法。如果不手动提供无参构造方法,系统将默认提供,且给b初始化,
但是b是final修饰的实例变量,系统不赋默认值,所以编译错误。
*/
public A() {
//实例变量是在构造方法执行的时候赋默认值
this.b = 80;//在系统赋默认值之前给b赋默认值
}
}
final修饰的实例变量一般添加static修饰
public class Test {
public static void main(String[] args) {
System.out.println(Chinese.COUNTRY);
}
}
class Chinese{
/*
final修饰的实例变量一般添加static修饰。
static final联合修饰的变量称之为“常量”。
常量名建议全部大写,每个单词之间采用下划线衔接。
常量:实际上常量和静态变量一样区别在于常量的值不能变。
常量和静态变量,都是存储于方法区,并且都是在类加载时初始化。
常量一般都是公共的,public修饰的。
*/
String idCard;//身份证号码,每个人都不一样,对象级别的
String name;//姓名,不同对象姓名不同。
/*
国家的值是一个固定值:“中国”
实例变量在堆中,一个对象一份,一百个对象一百份
实例变量既然使用final修饰了,说明该实例变量值不会随着对象的编号而变化。
该实例变量面前应该添加:static关键字,变为静态的,存储在方法区。
*/
static final String COUNTRY="中国";
}