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行的代码,所以就会报错了

  • 相关阅读:
    【Uvalive4960】 Sensor network (苗条树,进化版)
    【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
    【UVA 1395】 Slim Span (苗条树)
    【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
    【UVA 10369】 Arctic Network (最小生成树)
    【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
    【UVA 11183】 Teen Girl Squad (定根MDST)
    【UVA 11865】 Stream My Contest (二分+MDST最小树形图)
    【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
    【LA 5713 】 Qin Shi Huang's National Road System (MST)
  • 原文地址:https://www.cnblogs.com/aziji/p/10115009.html
Copyright © 2011-2022 走看看