Java中的final如何理解——详解

目录

引言

final修饰类

final修饰方法 

final修饰变量 

final修饰局部变量 

final修饰成员变量 

final修饰变量注意点 


 

引言

        今天我们重点来讲解一下Java中的final关键字,首先我们可以通过字面意思理解final关键字——“最终,最后”,因此被final关键字修饰的类、方法、变量将被赋予最终的含义::修饰过后的类不能被子类继承;方法:修饰过后的方法不能被重写;变量:修饰过后的变量不能被二次修改。接下来对其详细地讲解:

Java中的final如何理解——详解_第1张图片

 

final修饰类

❤️❤️❤️ final修饰的类,类不能被继承❤️❤️❤️

//未被final修饰的father类
public class son extends father{

}

public class father{

}

//被final修饰的father类
public class son extends father{
//son无法继承father类,会出现报错!
}
public final class father{
}

final修饰方法 

final修饰的方法,方法不能被重写

//未被final修饰的方法
public class son extends father{
//可以正常重写say()方法
    @Override
    public void say(){
        System.out.println("可以给零花钱吗?");    
    }
}
public class father{
    public void say(){
        System.out.println("Hello!");
    }
}
//被final修饰的方法
public class son extends father{
//由于say()被final修饰,所以无法重写,会报错!
    @Override
    public void say(){
        System.out.println("可以给零花钱吗?");    
    }
}
public class father{
    public final void say(){
        System.out.println("Hello!");
    }
}

final修饰变量 

 ​final修饰的变量,有且仅有一次机会赋值

首先应该明确,在Java中有以下两种变量

1、局部变量

2、成员变量                       

                     i>实例成员变量

                     ii>静态成员变量

因此变量类型不同,final所造成的影响也会不同

final修饰局部变量 

第一种情况是在main函数中使用final对任意变量进行修饰:

//final未修饰变量
double Pi = 3.1415;
pi = 3.14;
//final修饰变量
final double Pi = 3.1415;
//Pi二次赋值,会报错!
pi = 3.14;

第二种情况是在定义的函数中将final修饰的变量作为参数进行传递:

//未使用final对变量修饰
test(3);
public satic void test(int a){
    a = 1;
}
//使用final对变量修饰
test(3);
public satic void test(final int a){
//由于在传值的时候已经赋过值了,所以不能二次赋值
    a = 1;
}

final修饰成员变量 

第一种情况是修饰静态成员变量(public satic final 修饰的也称为常量) 

public satic final String name = "石原里美";
//由于final修饰name,所以不能对name二次赋值
name = "工藤静香";

第二种情况是修饰实例成员变量(由于实例对象属于每个对象,若值无法改变则毫无意义,基本不用)

public final String name = "石原里美";
//由于final修饰,所以不能改变其值
name = "工藤静香";

final修饰变量注意点 

  •  final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。
  • final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的。
    class actress{
        private String name;
        public actress(String name){
            this.name = name;
        }
        public getName(){
            return name;
        }
        public setName(String name){
            this.name = name;
        }
    }
    
    actress a = new actress("石原里美");
    a = null;//第二次赋值所以报错
    System.out.prinyln("a.getName()");
    a.setName("工藤静香");//改变的是指针所指向的数据
    System.out.prinyln("a.getName()");
    //输出结果:
    //石原里美
    //工藤静香

创作不易,给个三连吧! 

Java中的final如何理解——详解_第2张图片

 

你可能感兴趣的