Java面试题04-final关键字详解

  本篇博客将会讨论java中final关键字的含义,以及final用在什么地方,感觉看书总会有一些模糊,而且解释的不是很清楚,在此做个总结,以备准备面试的时候查看。针对每个解释,会在需要的地方给出代码说明,有兴趣的读者可自行实现。

  转载说明----------原文链接:随风浪子90:http://www.cnblogs.com/liun1994/p/6691094.html

1. final关键字的含义

  final表面意思就是不可更改的,恒量的意思;类似于C语言中的const关键字,指的是无法改变的量,这与静态标量static是有区别的,静态变量指的是只有一份存储空间,值是可以改变的。使用final一定原因是出于软件设计的角度,因为别人看到final这个关键字就知道是什么意思,达到心领神会的效果,但也正是由于这种"语义"的存在,在程序设计中要谨慎使用,以免误用。

  在Java中final修饰的就是常量,而且变量名要大写;

Math类:
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
......java源码中好多变量都用final修饰

2. final的作用

  final根据修饰位置的不同作用也不相同,针对三种情况:

  1)修饰变量,被final修饰的变量必须要初始化,赋初值后不能再重新赋值。

      注意:局部变量不在我们讨论的范畴,因为局部变量本身就有作用范围,不使用private、public等词修饰。

  2)修饰方法,被final修饰的方法代表不能重写。

  3)修饰类,被final修饰的类,不能够被继承。

      注意:final修饰的类,类中的所有成员方法都被隐式地指定为final方法。

  2.1 final修饰变量

    被final修饰的变量必须显示的初始化,初始化可以以三种方式:1)定义时初始化,2)在构造器中设置值,3)在非静态块中为final实例变量设置值。

    final修饰变量指的是:这个变量被初始化后便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可变,即不能再指向其他的对象

public class Test01{
final int x1= 10000;
final int x2;
final int x3;
{
x2 = 20000;
}
Public exe3(){
this.x3 = 3000;
}
}

  如果final修饰的变量是对象类型,那么不可更改指的是该变量不可以再指向别的对象,但是对象的值时可以更改的,比如:

final Operate operate = new Operate() ;// operate有一个普通变量i初始化为10
operate.i = 11;
operate.i = 12;
System.out.println(operate.i); //输出12
上述是自定义类,即便是数组,List等集合类型,所保存的值也是可以更改的。

3. final和static的区别

  static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变,看一下网上的一个例子:

public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j); }
}
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
//运行结果,两次打印,j的值都是一样的,j是static类型的属于类,因此两次值相同。i不是static的因此属于对象,但是i的值是不可变的。

4. 其他final相关的知识

  1)使用final关键字,如果编译器能够在编译阶段确定某变量的值,那么编译器就会把该变量当做编译期常量来使用。如果需要在运行时确定,那么编译器就不会优化相关代码。

public class Test {
public static void main(String[] args) {
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
}
//final类型,在编译阶段能够确定值。
//非final类型在编译阶段确定不了
输出:
true
false
public class Test {
public static void main(String[] args) {
String a = "hello2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c)); } public static String getHello() {
return "hello";
}
}
//即便是final类型,编译阶段也确定不了值。
输出
false

  2)注意不要将final与finally、finalize()等搞混。

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

  4)接口中的变量都是public static final 的。

Java面试题04-final关键字详解的更多相关文章

  1. “全栈2019”Java第五十一章:继承与final关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. Java之static静态关键字详解|final关键字详解

    前言 在Java语言中,static表示"静态"的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块.static的主要作用在于创建独立于具体对象的域变量或者方法 ...

  3. Java的final关键字详解

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  4. Java内部类与final关键字详解

    一.内部类的几种创建方法: 1.成员内部类 class Outer{ private int i = 1; class Inner{ public void fun() {System.out.pri ...

  5. java final关键字详解

    final是java中保留关键字,可以声明成员变量.类.方法与本地变量,一旦引用final关键字,将不能再改变这个引用,编译器会检查代码,要是想改变该引用,会报错. final变量? 凡是对成员变量或 ...

  6. final关键字详解

    java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能被继承 ...

  7. Java之final关键字详解

    1. 修饰类 当用final去修饰一个类的时候,表示这个类不能被继承. 注意: a. 被final修饰的类,final类中的成员变量可以根据自己的实际需要设计为fianl. b. final类中的成员 ...

  8. Static、Final关键字详解

    1.Static 详情见下面代码讲解 点击查看代码 package com.Tang.oop.demo07; public class Student { private static int age ...

  9. Java:final、static关键字 详解+两者结合使用

    一  final关键字 1) 关于final的重要知识点 final关键字可以用于成员变量.本地变量.方法以及类. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. ...

随机推荐

  1. 【java基础之jdk源码】集合类

    最近在整理JAVA 基础知识,从jdk源码入手,今天就jdk中 java.util包下集合类进行理解 先看图 从类图结构可以了解 java.util包下的2个大类: 1.Collecton:可以理解为 ...

  2. JMessage是让App 同时集成 Push 功能与 IM 功能最完美的方案

    历经几个月的沉寂,以及兄弟们的奋战,极光推送的兄弟产品诞生了:极光IM,英文名 JMessage. 极光IM 是我们团队基于大量客户的需求反馈,在很多客户的殷切期盼下所开发的.团队成员一方面要支撑极光 ...

  3. 《深入理解Java虚拟机》学习笔记之类加载

    之前在学习ASM时做了一篇笔记<Java字节码操纵框架ASM小试>,笔记里对类文件结构做了简介,这里我们来回顾一下. Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把 ...

  4. Android中使用findViewByMe提升组件查找效率

    1.引出 安卓初学者一般在写android Activity的时候总是会在onCreate方法中加上setContentView方法来加载layout,通过findViewById来实现控件的绑定,刚 ...

  5. BOM基础(四)

    最近写的文章感觉内容不像之前那么充实,内容可能也有点杂.对于DOM,和BOM来说,要理解是不难的,难的是做的时候.要自己想的到,而且,对于目前阶段来说,BOM还存在着很大的兼容性问题,最主要就是要兼容 ...

  6. [HDU]1016 DFS入门题

    题目的意思就是在1到n的所有序列之间,找出所有相邻的数相加是素数的序列.Ps:题目是环,所以头和尾也要算哦~ 典型的dfs,然后剪枝. 这题目有意思的就是用java跑回在tle的边缘,第一次提交就tl ...

  7. java properties 对list的支持

    经测试,原生的properties 对 list 不支持. 参考样例如下: id=1 id=2 具体代码如下: java.util.Properties prop = new Properties() ...

  8. Mutillidae在kali linux上的安装

    XAMPP:下载地址(https://www.apachefriends.org/download.html) Mutillidae:下载地址(http://sourceforge.net/proje ...

  9. web第十天总结

    今天进入web学习第十天,学习了xml序列化,servlet,其他的想不起来了,回顾以前的java基础面向对象,多态,继承.封装,但是还不是很理解.对于map,list,set更是理解不透,2011年 ...

  10. 使用Git将本地仓库与GitHub远程仓库相关联

    这篇文章详细讲解了如何生成SSH,并链接到GitHub,123..... 1.如果你的GitHub里面没有仓库,就自己生成一个,如图所示 2.如果你有自己仓库,想在电脑本地新建一个,你需要将GitHu ...