1.final的概念
继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?
要解决上述的这些问题,需要使用到一个关键字 final,final 的意思为最终,不可变。final 是个修饰符,它可以用来修饰类、类中的属性和方法和局部变量,但是不能修饰构造方法。
2.final的特点
- final 修饰类不可以被继承,但是可以继承其它类。
class AA {}
final class BB extends AA {} // final修饰类可以继承其他类
class CC extends BB {} // 编译错误,final修饰类不可以被继承
- final 修饰的方法不可以被覆盖,但子类的方法可以用final修饰。
class AA {
final public void show1() {}
void public show2() {}
}
class BB extends AA {
final public void show1() {} // 编译错误,final修饰的方法不可以被覆盖
final public void show2() {} // 父类中没有被final修饰方法,子类覆盖后可以加final
}
-
final 修饰的变量称为常量,这些变量只能赋值一次。
final修饰成员变量和静态变量,必须显示的设置初始值,JVM不会设置默认值
常量命名规则:多个有意义的单词连接,所有字符大写,单词之间用下划线分割。
public class FinalDemo {
// 成员变量必须显示的设置初始值,JVM不会不会设置默认值。
final String USER_NAME = "xiaoming";
public static void main(String[] args) {
// 多个有意义的单词连接,所有字符大写,单词之间用下划线分割.
final int MAX_VALUE = Integer.MAX_VALUE;
// 编译错误,final 修饰的变量称为常量,这些变量只能赋值一次。
MAX_VALUE = 120;
}
}
- final修饰的引用数据类型变量,变量中的地址不能改变,但是指向堆中对象的属性可以修改。
class Person {
String name = "小明";
}
public class FinalDemo {
public static void main(String[] args) {
final Person p = new Person();
p = new FinalDemo(); // 编译错误,地址值不能更改
p.name = "小花"; // 地址内的对象属性值可以修改
}
}
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。