final关键字解读

1.final修饰的类无法继承
2.final修饰的方法无法覆盖
3.final修饰的变量只能赋一次值
4.final修饰的引用一旦指向某个对象,则不能再重新指向别的对象,但该引用指向的对象内部的数据是可以修改的
5.final修饰的实例变量(成员变量)必须手动初始化,不能采用默认值
6.final修饰的实例变量一般和static联合使用,称为常量

一.修饰的类

public final class Parent{
		private String name;
		public void life(String name){
		System.out.println("111");
		}
}
class Child extends Parent{
		public void life(){
		}
}
//

输出结果:
在这里插入图片描述
这就是final修饰的类不可以被继承的意思

二.修饰的方法

public  class Parent {
    private String name;
    public final void d1(){
        System.out.println("父类d1");
    }
}
class Child extends Parent{
    public void d1(){
        System.out.println("子类d1");
    }
    public void d2(){
        System.out.println("d2");
    }
}
class Main{
    public static void main(String[] args) {
        Child p = new Child();
        p.d1();
    }
}

在这里插入图片描述
这是因为final修饰的方法不可以被覆盖(也就是重写)。
注意!!!!

public  class Parent {
    private String name;
    private final void d1(){
        System.out.println("父类d1");
    }
   
}
class Child extends Parent{
    public void d1(){
        System.out.println("子类d1");
    }
    public void d2(String name){
        System.out.println("d2");
    }
}

在这里插入图片描述
这时,你会发现不报错,这是为什么呢,明明方法名和方法参数都一样,为什么就可以进行重写,原因就是:这不叫重写,父类private就是说明这个方法是父类独有的,子类看不到,再在下面子类中定义方法时,就是属于子类自己的方法,而不是重写

public  class Parent {
    private String name;
    public  final void d1(){
        System.out.println("父类d1");
    }

}
class Child extends Parent{
    public void d1(String name){
        System.out.println("子类d1");
    }
    public void d2(String name){
        System.out.println("d2");
    }
}

细心地看会发现就是这里仅仅与第一种情况相比就参数不一样,可以编译通过。这是因为这不叫重写,而是重载,记得呦!
补充:
阅读下面代码:

public  class Parent {
    private String name;
    public  final void d1(){
        System.out.println("父类d1");
    }

}
class Child extends Parent{
    public void d1(String name){
        System.out.println("子类d1");
    }
    public void d2(String name){
        System.out.println("d2");
    }
}
class Main{
    public static void main(String[] args) {
        Parent p = new Child();
        p.d2("nihao");
    }
}

在这里插入图片描述
这里就补充一个小知识:就是多态中父类引用指向子类对象,父类引用调用子类方法必须进行向下转型,解决方法如下:
在这里插入图片描述

三.修饰的变量

final修饰的变量只能赋一次值,所以来谈谈哪些变量,又有哪些情况

引用变量

final修饰的引用,引用是什么,是变量啊,所以也遵循只能赋值一次这个规则,于是看例子:
在这里插入图片描述
这就是final修饰的引用不可以被再次指向别的对象

实例变量

实例变量也是变量,也遵循着只可以被赋值一次
看例子:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
好好看,又什么不同!按照我们以往的经验,成员变量也就是实例变量可以不用手动赋值,系统会给默认赋值为对应的值,比如Int类型就是0,但是你会发现第二张图里面不能编译通过,解释这个你要首先明白一旦final修饰过后其变量效果就是不能再改值,也就相当于是属于类变量,但与类变量不一样的就是类变量还可以变,这个却不可以,也就是相当于static final,类变量什么时候初始化?是在类加载中第二步里面的准备阶段,而在后面初始化阶段进行赋值,但是这个就是在准备阶段根据ConstantValue属性直接赋值。而这个值是什么,不知道!jdk也不背这个锅,干脆直接报错,让你程序员自己赋值自己想要的!!!
所以就有了赋值操作,可以在你建立一个对象的时候进行赋值,也可以直接赋值!!!!

普通(局部)变量

这个就比较简单,就是不能再被赋值
在这里插入图片描述

总结:以上就是所说的final,只要时刻记住final修饰的变量,不管是什么变量,是允许赋值一次的原则可以解决问题!欢迎大家批评指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值