Java final介绍
来源:互联网 发布:照片分析软件 编辑:程序博客网 时间:2024/06/05 18:01
一、final变量
final关键字可用于变量声明,被final修饰的变量就不能更改值的大小,例如:
final double PI = 3.14;
如果再次对final的常量赋值则编译器就不会接受。
final定义的变量必须在声明时对其进行进行赋值操作,final除了能修饰基本数据类型的常量,还可以修饰对象引用,所以final可以修饰数组,一个对象引用被修饰为final之后是无法将其改变指向另一个对象的(一个既是static又是final的字段只占据一段不能改变的存储空间)。
例子:
import java.util.Random;import static java.lang.System.out;class Test1 { int i = 0;}public class FinalData { static Random rand = new Random(); private final int VALUE_1 = 1;//声明一个final常量 private static final int VALUE_2 = 2;//声明一个final,static常量 private final Test1 test1 = new Test1();//声明一个final引用 private Test1 test2 = new Test1();//声明一个不是final的引用 private final int[] a = { 1, 2, 3, 4, 5 };//声明一个final修饰的数组 private final int i4 = rand.nextInt(20); private static final int i5 = rand.nextInt(20); public String toString() { return i4 + " " + i5 + " "; } public static void main(String[] args) { FinalData data = new FinalData(); //可以对指定为final的引用中的成员变量进行赋值,但不能讲定义为final的引用指向其他引用 // data.test1 = new Test1(); // data.VALUE_2++; data.test2 = new Test1(); for(int i = 0; i < data.a.length;i++){ //a[i] = 9; } System.out.println(data); System.out.println("--------"); System.out.println(new FinalData()); }}
运行结果是:
由结果可以看出i5被static final修饰,所以i5是固定不会变的。而i4是只能赋值一次之后,不能再对其赋值。
再看下面一个例子:
import java.util.Random;import java.lang.*;public class FinalStaticData { private static Random rand = new Random();// 实例化一个random类对象 // 随机产生一个0-15之间的数赋予定义为final的a1 private final int a1 = rand.nextInt(15); private static final int a2 = rand.nextInt(15); public static void main(String[] args) { FinalStaticData fdata = new FinalStaticData();// 实例化对象 // 调用定义为final对象的a1 System.out.println("a1 " + fdata.a1);// a1的值 // 调用定义为final,static对象a2 System.out.println("a2 " + fdata.a2);// a2的值 // 实例化另一个对象 FinalStaticData fdata1 = new FinalStaticData(); System.out.println("第二个a1 " + fdata1.a1); System.out.println("第二个a2 " + fdata1.a2); }}
结果是:
上面的代码验证了定义为static,final的值是不变的。
二、final方法
final定义的方法是可以防止子类覆盖父类的方法,执行效率也要远高于非final方法,定义为private的方法隐式的就是final型 ,所以定义为private方法是不愿要再定义为final型的
package com.example.finalmethod;class Parents { private final void doit() { System.out.println("父类的第一个方法"); } final void doit1() { System.out.println("父类的第二个方法"); } public void doit2() { System.out.println("父类的第三个方法"); }}class Sub extends Parents { public final void doit() { System.out.println("子类的第一个方法"); } // final void doit1(){ // System.out.println("子类的第二个方法"); // } public void doit2() { System.out.println("子类的第三个方法"); }}public class FinalMethod { public static void main(String[] args) { Sub s = new Sub(); s.doit(); Parents p = s; // p.doit();//private修饰的是无法覆盖的 p.doit1(); p.doit2(); }}
运行结果
结果证明父类中的定义的final方法是不能覆盖重写的,但是貌似定义为final和static是可以覆盖的,但是在main方法中,我们不难发现p是不能调用doit方法的,所以说在子类的方法中只是新的方法,并不是覆盖了父类的方法。
三、final类
定义为final类不能被继承,而且其他类是不能对其修改的
package com.example.finalmethod;public class FinalClass { int a = 2; void doit() { } public static void main(String[] args) { FinalClass fclass = new FinalClass(); int b = (fclass.a) + 1; System.out.println(b); }}
结果如下
0 0
- Java final介绍
- Java关键字介绍之final
- java中final关键字介绍
- Java关键字介绍之final
- Java关键字介绍之final
- JAVA final 的相关介绍
- JAVA中final的一些作用介绍
- java中final的介绍详解
- java中final的介绍详解
- Java中final传值的介绍
- Java final static abstract关键字介绍
- Java final static abstract interface关键字介绍
- 黑马程序员-Java中static、this、super、final用法介绍
- 介绍一下static、final、abstract 在JAVA语言中的区别
- java中final,finally,finalize的用法介绍
- java中final的作用及简单介绍
- 《Thing in Java》对final关键字的介绍之数据
- java final
- 知识点点:判断int变量是否赋值 (C#)
- 程序员修炼内功心法
- WebService注解汇总
- 解决:OSX 10.7.5的Git的问题Illegal instruction: 4
- Mysql优化配置
- Java final介绍
- 移动开发过程概览
- DBMS_SCHEDULER执行PERL脚本加载数据
- InnoDB与Myisam的六大区别
- PostgreSQL PITR示例 (物理备份+WAL日志)
- [LeetCode] Reverse Nodes in k-Group
- create table like 和create table select 比较
- CF 题目小记sel
- 学习Python大数据处理模块Pandas