final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的。

final关键字的含义?

final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。

什么是final变量?

凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。下面是final变量的例子:

复制代码 代码如下:

public static final String LOAN = "loan" ;

LOAN = new String( "loan" ) //invalid compilation error

final变量是只读的。

什么是final方法?

final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。下面是final方法的例子:

复制代码 代码如下:

class PersonalLoan{

public final String getName(){

return "personal loan" ;

}

}

class CheapPersonalLoan extends PersonalLoan{

@Override

public final String getName(){

return "cheap personal loan" ; //compilation error: overridden method is final

}

}

什么是final类?

使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。下面是final类的实例:

复制代码 代码如下:

final class PersonalLoan{

}

class CheapPersonalLoan extends PersonalLoan{ //compilation error: cannot inherit from final class

}

下面总结了一些使用final关键字的好处

final关键字提高了性能。JVM和Java应用都会缓存final变量。

final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

使用final关键字,JVM会对方法、变量及类进行优化。

不可变类

创建不可变类要使用final关键字。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

相关阅读:为什么String是不可变的以及如何写一个不可变类。

关于final的重要知识点

final关键字可以用于成员变量、本地变量、方法以及类。

final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。

你不能够对final变量再次赋值。

本地变量必须在声明时赋值。

在匿名类中所有变量都必须是final变量。

final方法不能被重写。

final类不能被继承。

final关键字不同于finally关键字,后者用于异常处理。

final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。

接口中声明的所有变量本身是final的。

final和abstract这两个关键字是反相关的,final类就不可能是abstract的。

final方法在编译阶段绑定,称为静态绑定(static binding)。

没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。

将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。

按照Java代码惯例,final变量就是常量,而且通常常量名要大写:

private final int COUNT = 10 ;

对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。譬如:

private final List Loans = new ArrayList();

list.add(“home loan”); //valid

list.add( "personal loan" ); //valid

loans = new Vector(); //not valid

我们已经知道final变量、final方法以及final类是什么了。必要的时候使用final,能写出更快、更好的代码的。

当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,

但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。

举个例子:

class Person

{

private int age;

public Person(){}

//有参数构造器

public Person(int age)

{

this.age = age;

}

//省略age Field的setter和getter方法

//age Field的setter和getter方法

public void setAge(int age)

{

this.age = age;

}

public int getAge()

{

return this.age;

}

}

public class FinalReferenceTest

{

public static void main(String[] args)

{

//final修饰数组变量,iArr是一个引用变量

final int[] iArr = {5, 6, 12, 9};

System.out.println(Arrays.toString(iArr));

//对数组元素进行排序,合法

Arrays.sort(iArr);

System.out.println(Arrays.toString(iArr));

//对数组元素赋值,合法

iArr[2] = -8;

System.out.println(Arrays.toString(iArr));

//下面语句对iArr重新赋值,非法

//iArr = null;

//final修饰Person变量,p是一个引用变量

final Person p = new Person(45);

//改变Person对象的age Field,合法

p.setAge(23);

System.out.println(p.getAge());

//下面语句对p重新赋值,非法

//p = null;

}

}

复制代码

当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,

但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。

举个例子:

class Person

{

private int age;

public Person(){}

//有参数构造器

public Person(int age)

{

this.age = age;

}

//省略age Field的setter和getter方法

//age Field的setter和getter方法

public void setAge(int age)

{

this.age = age;

}

public int getAge()

{

return this.age;

}

}

public class FinalReferenceTest

{

public static void main(String[] args)

{

//final修饰数组变量,iArr是一个引用变量

final int[] iArr = {5, 6, 12, 9};

System.out.println(Arrays.toString(iArr));

//对数组元素进行排序,合法

Arrays.sort(iArr);

System.out.println(Arrays.toString(iArr));

//对数组元素赋值,合法

iArr[2] = -8;

System.out.println(Arrays.toString(iArr));

//下面语句对iArr重新赋值,非法

//iArr = null;

//final修饰Person变量,p是一个引用变量

final Person p = new Person(45);

//改变Person对象的age Field,合法

p.setAge(23);

System.out.println(p.getAge());

//下面语句对p重新赋值,非法

//p = null;

}

}

复制代码

当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,

但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。

举个例子:

class Person

{

private int age;

public Person(){}

//有参数构造器

public Person(int age)

{

this.age = age;

}

//省略age Field的setter和getter方法

//age Field的setter和getter方法

public void setAge(int age)

{

this.age = age;

}

public int getAge()

{

return this.age;

}

}

public class FinalReferenceTest

{

public static void main(String[] args)

{

//final修饰数组变量,iArr是一个引用变量

final int[] iArr = {5, 6, 12, 9};

System.out.println(Arrays.toString(iArr));

//对数组元素进行排序,合法

Arrays.sort(iArr);

System.out.println(Arrays.toString(iArr));

//对数组元素赋值,合法

iArr[2] = -8;

System.out.println(Arrays.toString(iArr));

//下面语句对iArr重新赋值,非法

//iArr = null;

//final修饰Person变量,p是一个引用变量

final Person p = new Person(45);

//改变Person对象的age Field,合法

p.setAge(23);

System.out.println(p.getAge());

//下面语句对p重新赋值,非法

//p = null;

}

}

复制代码

当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,

但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。

举个例子:

class Person

{

private int age;

public Person(){}

//有参数构造器

public Person(int age)

{

this.age = age;

}

//省略age Field的setter和getter方法

//age Field的setter和getter方法

public void setAge(int age)

{

this.age = age;

}

public int getAge()

{

return this.age;

}

}

public class FinalReferenceTest

{

public static void main(String[] args)

{

//final修饰数组变量,iArr是一个引用变量

final int[] iArr = {5, 6, 12, 9};

System.out.println(Arrays.toString(iArr));

//对数组元素进行排序,合法

Arrays.sort(iArr);

System.out.println(Arrays.toString(iArr));

//对数组元素赋值,合法

iArr[2] = -8;

System.out.println(Arrays.toString(iArr));

//下面语句对iArr重新赋值,非法

//iArr = null;

//final修饰Person变量,p是一个引用变量

final Person p = new Person(45);

//改变Person对象的age Field,合法

p.setAge(23);

System.out.println(p.getAge());

//下面语句对p重新赋值,非法

//p = null;

}

}

复制代码

java fina_[转]Java中fina以及static的意义相关推荐

  1. Java 主函数 main 中的关键字 static

    相信很多人在运行第一个可以运行的 Java 程序的时候都会要求写一个主函数. 然后很多人都会照葫芦画瓢的写一个下面的函数: public static void main(String[] args) ...

  2. java中的关键字static

    原文链接: https://zhuanlan.zhihu.com/p/70110497 昨晚面试中被问到,没能回答出来.这篇答疑文章写得非常好,无一字可增删,遂直接复制. 在平时开发当中,我们经常会遇 ...

  3. 深入分析Java中的关键字static

    深入分析Java中的关键字static 一.static关键字的基本用法 1.static关键字基本概念 方便在没有创建对象的情况下来进行调用.也就是说:被static关键字修饰的不需要创建对象去调用 ...

  4. c++ main函数调用 类中的枚举_为什么 Java 的 main 方法必须是 public static void?

    点击上方 Java进阶之道,选择 设为星标 优质文章,及时送达 为什么 main 方法是静态的(static)? 为什么main方法是公有的(public) ? 为什么 main 方法没有返回值(Vo ...

  5. java中的静态块static{}及this,super,final的用法总结

    Code public class TestSquence { public static void main(String[] args) {   /*    * 给初学者的问题:把下面两行中的一行 ...

  6. java中final,static,this,supper关键字的异同

    final可以修饰变量.方法及类: 1.当定义一个final变量时,jvm会将其分配到常量池中,其所修饰的对象只能赋值一次,对基本类型来说是其值不可变,引用类型(包括作为函数形参或类变量):引用不可以 ...

  7. 【Java】:类变量、类方法(static在类中的用法)及main函数细节

    前言 经过一个多月的学习,终于进入了学习Java的第二阶段,本篇博客主要介绍Java面向对象高级部分中 类变量.类方法 的使用,以及 main函数语法 剖析,主要设计 static关键字 在类中的使 ...

  8. Java中的public static final来修饰数组与接口变量

    Java中的public static final来修饰数组与接口变量 public static final来修饰数组 final对数组的作用 怎样实现对数组的public static final ...

  9. java 外部类似_[求指点] 如何用java 实现类似linux中管道调用外部程序的功能

    想写个小程序实现类似linux中管道的功能,创建一个外部子进程,然后主进程不断地写输入给子进程,而后把子进程的返回值取出. 如下的小代码就是从stdin读入一个字符串,调用子进程(cat)返回这个串, ...

最新文章

  1. git粘贴命令行_git进阶,ssh和命令行
  2. vue element-ui Notification 挤在一起,重叠问题 解决办法
  3. 分布式缓存使用介绍MemCache
  4. iperf3与netperf使用
  5. Springboot端口设置
  6. 苹果cms10自适应模板_哪里有苹果cms10自适应模板?
  7. html编辑器查找与替换,织梦kindeditor文本编辑器增加“查找替换”功能
  8. css索引_CSS中的Z索引:它是什么以及它做什么
  9. java replace stringbuilder_JAVA 中Stringbuilder类的方法
  10. orcadcapture安装_OrCAD Capture CIS初学者快速上手指导教程
  11. 【电商】电商后台设计—订单中心
  12. MES系统供应商评估报告-- Gartner出品
  13. 华盛顿大学计算机专业咋样,华盛顿大学计算机专业详解
  14. 【落谷1957】口算练习题题解
  15. 一些实用网址 ubuntu截图+屏蔽一些网址+windows7+ubuntu双系统+泰语打字练习
  16. 古风系统仙侠文推荐_5本古典仙侠全本精品小说,文笔精湛,仙味十足,值得细品一二...
  17. 从BPMN到XPDL--Visual Paradigm for UML 的流程转换
  18. 运行时错误91问题汇总
  19. 干货来了,JAVA代码实现图片分割、合并工具类
  20. canvas实现图像裁剪

热门文章

  1. 万剑归宗,到底什么是Java的基本数据类型啊?
  2. v-for的键值key
  3. SOLD格雷母线的简介和运用
  4. 三菱FX5U、Q系列、L系列PLC对接MES数据库,实现双向通讯
  5. 从零开始学DSP的一些感受
  6. vSphere、vSAN与高速网
  7. 全球与中国半导体用前驱体市场行业投资分析及前景趋势预测报告2022-2028年
  8. [微信小程序] 动态设置页面标题、导航条 navigationBarTitleText
  9. LiveNVR视频流媒体平台支持接收rtsp推流并转换成GB28181输出级联到第三方国标平台服务
  10. 如何从硬盘来下载有声读物到您的iPod