final关键字
我们如果说父类的东西不想让子类去继承:
可以使用private修饰或者static
由于继承方法中有一个现象:方法重写
所以,当方法可以被重写的时候,父类原本的方法还在,但是调用是子类重写后的
方法,如果我依旧想保留父类原本的方法,不想让子类重写,但是呢,我想让子类去用
针对于这样的情况,java提供了一个关键字:final
定义
final: 最终的意思,不可以改变的意思。
使用格式
一般情况下,把final放在访问权限修饰与返回值之间
常见的情况下,final不仅可以修饰成员方法,也可以修饰类,变量
class Father4{
//被final修饰的成员方法,不能被子类重写。
public final void fun(){
System.out.println("这是父类的fun方法");
}
}
class Son4 extends Father4{
// public void fun(){
// System.out.println("这是父类的fun方法");
// }
}
public class ExtendsDemo6 {
public static void main(String[] args) {
}
}
final:最终的意思,它可以修饰变量,类,方法
特点:
1、被final所修饰的类无法被其他类所继承
//被final修饰的类不能被继承
final class Fu1{
}
class Zi1 extends Fu1{
}
public class FinalDemo1 {
public static void main(String[] args) {
}
}
2、被final修饰的方法,子类无法重写,但是在同一个类中可以出现同名不同参数列表的被final修饰的方法,这是重载
class Fu1{
public final void fun1(){
System.out.println("这是父类中的fun1方法");
}
public final void fun1(String s){
System.out.println("这是父类中的fun1方法");
}
}
总结一句话:被final修饰的方法不能被重写,但是可以被重载
3、被final修饰的变量变成了常量,无法再重新分配值。
class Fu1{
public final void fun1(){
System.out.println("这是父类中的fun1方法");
}
public final void fun1(String s){
System.out.println("这是父类中的fun1方法");
}
}
class Zi1 extends Fu1{
final int a=10; //被final修饰的变量变成了常量,无法再重新分配值。
public void fun2(){
System.out.println("a:"+a);
}
}
public class FinalDemo1 {
public static void main(String[] args) {
Zi1 zi1 = new Zi1();
zi1.fun2();
zi1.a=200;
zi1.fun2();//报错
}
}
常量:
A: 字面值常量:
10,12.34,"hello",'a',true
B: 自定义常量
其实就是被final修饰的变量。
final int a = 10;
注意:被final修饰变量,只要在构造方法完毕之前赋值就可以了。下面是两种赋值途径
class Fu2{
final int b;
Fu2(){
b = 30;//构造方法完毕前赋值
System.out.println(b);
}
}
public class FinalDemo3 {
public static void main(String[] args) {
}
}
class Fu2{
final int b;
{
b = 100;//构造代码块赋值
}
Fu2(){
System.out.println(b);
}
}
public class FinalDemo3 {
public static void main(String[] args) {
}
}
4、被final修饰的局部变量是基本数据类型的时候,不可以修改值
public class FinalDemo2 {
public static void main(String[] args) {
int a=10;
System.out.println(a);
a=100;
System.out.println(a);
final int b=20;
System.out.println(b);
b=200;//b被final修饰,所以不可以重新赋值
System.out.println(b);//报错
}
}
5、被final修饰的局部变量是引用数据类型的时候,该对象的地址值是无法改变的, 但是引用堆内存中的变量是可以发生改变。
class Student {
int age = 18;
}
public class FinalDemo2 {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(s1.age);
final Student s2 = new Student();
System.out.println(s2.age);
//s2 = s1;报错。被final修饰的局部变量s2是引用数据类型,地址值无法改变
s2.age = 20;//age并没有被final修饰,所以可以改变
System.out.println(s2.age);
}
}