有些时候,我们不想让子类覆盖重写父类中的方法或者共嗯,只能让子类去使用
那怎么办呢?
针对这个情况,java提供了一个关键字——final关键字
final关键字是最终的意思,可以修饰类,成员变量,成员方法,不能修饰构造方法
class Fu{
public final void show(){
System.out.println("这是父类中的show方法");
}
}
class Zi extends Fu{
// @Override
// public void show() {
// System.out.println("这是子类中的show方法");
// }
}
public class ZiDemo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
final关键字的特点
1.修饰类,类不能被继承
/无法从最终com.tutu.wjq.day11.Fu2进行继承
//final class Fu2{
//
//}
class Zi2 extends Fu2 {
}
2.修饰成员变量,变量就变成了常量,并且只能被赋值一次,
注:自定义常量:被final修饰变量变成自定义常量
class Fu2 {
int num = 10;
final int num2 = 200;
}
class Zi2 extends Fu2 {
public void show() {
num = 100;
System.out.println(num);
// num2 = 200; //无法为最终变量num2分配值
System.out.println(num2);
}
在构造方法完毕之前赋值即可
class Fu2 {
int num = 10;
final int num2;
{
num2 = 400;
}
Fu2() {
}
}
class Zi2 extends Fu2 {
public void show() {
num = 100;
System.out.println(num);
System.out.println(num2);
}
}
public class FinalDemo {
public static void main(String[] args) {
Zi2 zi2 = new Zi2();
zi2.show();
}
}
class Fu2 {
int num = 10;
final int num2;
Fu2() {
num2 = 400;
}
}
class Zi2 extends Fu2 {
public void show() {
num = 100;
System.out.println(num);
System.out.println(num2);
}
}
public class FinalDemo {
public static void main(String[] args) {
Zi2 zi2 = new Zi2();
zi2.show();
}
}
3.修饰成员方法,方法不能被重写
final关键字面试题
1.在方法内部,修饰基本数据类型的变量,变量值只能赋值一次,不能发生改变
public class FinalDemo2 {
public static void main(String[] args) {
int x = 100;
x=300;
System.out.println(x); //300
final int y = 200;
// y = 400; 报错,无法为最终变量y分配值
System.out.println(y); //200
}
}
2.修饰引用数据类型的变量,引用的地址值不可以发生改变,但是该对象的堆内存中的值是可以发生改变的
class Student{
int age = 10;
}
public class FinalDemo2 {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.age); //10
final Student s2 = new Student();
System.out.println(s2.age); //10
s2.age = 1000;
System.out.println(s2.age); //1000
System.out.println("=================================");
// s2 = new Student(); 报错,无法为最终变量s2分配值
}
}