zoukankan      html  css  js  c++  java
  • final 关键字的作用及应用案例

    final关键字的作用如下:

    1、可以修饰成员变量,但不能对该成员变量进行修改;

    2、可以修饰局部变量,但不能地该局部变量进行修改;

    3、可以修饰成员方法(继承),但不能对父类成员方法进行重写;

    4、可以修饰引用类型,不能对该引用类型进行修改,但可以对该引用类型下的值进行修改

    下面对上面4个作用一一举例进行演示:

    第一个作用的代码案例如下: 可以修饰成员变量,但不能对该成员变量进行修改

     1 package cn.finall.com;
     2 
     3 class Fu{
     4     final int x = 10;
     5     
     6     public void show() {
     7         System.out.println("这是父类");
     8     }
     9 }
    10 
    11 class Zi extends Fu{
    12 
    13 
    14 }
    15 
    16 public class DemoTest {
    17     public static void main(String[] args) {
    18         
    19         Zi z = new Zi();
    20         z.x = 100;
    21         System.out.println(z.x);
    22         
    23     }
    24 
    25 }
    26 
    27 报错如下:
    28 Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    29     The final field Fu.x cannot be assigned
    30 
    31     at cn.finall.com.DemoTest.main(DemoTest.java:20)

    简单说明:在Fu类中的成员变量 x 定义为 final 类型,但在第20行时,通过对象访问成员 x 并试图进行修改,所以就报错了。

    第二个作用的代码案例如下:可以修饰局部变量,但不能地该局部变量进行修改

     1 package cn.finall.com;
     2 
     3 class Fu{
     4     final int x = 10;
     5     
     6     public void show() {
     7         System.out.println("这是父类");
     8     }
     9 }
    10 
    11 class Zi extends Fu{
    12 
    13 
    14 }
    15 
    16 public class DemoTest {
    17     public static void main(String[] args) {
    18         final int y=100;
    19         System.out.println(y);
    20         y = 1000;
    21         System.out.println(y);
    22         
    23         
    24     }
    25 
    26 }
    27 
    28 运行错误如下:
    29 Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    30     The final local variable y cannot be assigned. It must be blank and not using a compound assignment
    31 
    32     at cn.finall.com.DemoTest.main(DemoTest.java:20)

    简单说明:在 main 方法中,定义了一个局部变量 y 为 final 类型,但在第20行时又对该局部变量进行修改,所以就报错了。

    第三个作用的代码案例如下:可以修饰成员方法(继承),但不能对父类成员方法进行重写

     1 package cn.finall.com;
     2 
     3 class Fu{
     4     final int x = 10;
     5     
     6     final public void show() {
     7         System.out.println("这是父类");
     8     }
     9 }
    10 
    11 class Zi extends Fu{
    12     public void show() {
    13         System.out.println("这是子类");
    14     }
    15 
    16 }
    17 
    18 public class DemoTest {
    19     public static void main(String[] args) {    
    20         Zi z = new Zi();
    21         z.show();
    22         
    23     }
    24 
    25 }
    26 
    27 报错如下:
    28 Exception in thread "main" java.lang.VerifyError: class cn.finall.com.Zi overrides final method show.()V
    29     at java.lang.ClassLoader.defineClass1(Native Method)
    30     at java.lang.ClassLoader.defineClass(Unknown Source)
    31     at java.security.SecureClassLoader.defineClass(Unknown Source)
    32     at java.net.URLClassLoader.defineClass(Unknown Source)
    33     at java.net.URLClassLoader.access$100(Unknown Source)
    34     at java.net.URLClassLoader$1.run(Unknown Source)
    35     at java.net.URLClassLoader$1.run(Unknown Source)
    36     at java.security.AccessController.doPrivileged(Native Method)
    37     at java.net.URLClassLoader.findClass(Unknown Source)
    38     at java.lang.ClassLoader.loadClass(Unknown Source)
    39     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    40     at java.lang.ClassLoader.loadClass(Unknown Source)
    41     at cn.finall.com.DemoTest.main(DemoTest.java:20)

    简单说明:在 Fu 类中有 show()成员方法,但该方法的类型为 final 类型,在 Zi 类中也有 show() 方法,这样就涉及到对父类方法进行重写,但父类中为 final 类型,所以子类进行重写时就会报错了

    第四个作用的代码案例如下:可以修饰引用类型,不能对该引用类型进行修改,但可以对该引用类型下的值进行修改

     1 package cn.finall.com;
     2 
     3 class Fu{
     4     int x = 10;
     5     
     6     public void show() {
     7         System.out.println("这是父类");
     8     }
     9 }
    10 
    11 class Zi extends Fu{
    12     public void show() {
    13         System.out.println("这是子类");
    14     }
    15 
    16 }
    17 
    18 public class DemoTest {
    19     public static void main(String[] args) {
    20         // 定义引用类型为 final
    21         final Fu f= new Fu();
    22         System.out.println(f.x); //输出10
    23         
    24         //可以为 final的引用类型的值进行改变,实际上只是该对象所对应的地址值不能被改变
    25         f.x = 100;
    26         System.out.println(f.x); //输出100
    27         
    28         //但不能对该 final 类型的引用对象的地址值进行改变,下面的就会报错
    29         f = new Fu();
    30         
    31         
    32     }
    33 
    34 }
    35 
    36 报错如下:
    37 Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    38     The final local variable f cannot be assigned. It must be blank and not using a compound assignment
    39 
    40     at cn.finall.com.DemoTest.main(DemoTest.java:29)

     简单说明:由于第20行中定义的引用类型为 final类型,说明该引用类型的地址值不能改变,那什么情况下该地址值为改变呢,就是对该引用变量重新创建一次对象,那么这时地址值就会发生变化,就是第29行的代码,所以就会报错了

  • 相关阅读:
    centos安装rvm报错@curl -L get.rvm.io | bash -s stable fails on cent OS
    linux命令 环境设置 顺序
    mysql-5.7.20基本用法
    gitlab&Jenkins 详细介绍及其应用
    git 详细部署及其应用
    zabbix详细介绍及其自动动态发现
    redis 缓存应用
    Linux下rpm、yum和源码三种安装方式详细介绍
    js中获取时间new date()的用法
    Apache Tomcat/8.5.56 启动命令行中文乱码
  • 原文地址:https://www.cnblogs.com/aziji/p/10115009.html
Copyright © 2011-2022 走看看