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也不背这个锅,干脆直接报错,让你程序员自己赋值自己想要的!!!
所以就有了赋值操作,可以在你建立一个对象的时候进行赋值,也可以直接赋值!!!!
普通(局部)变量
这个就比较简单,就是不能再被赋值