一、final关键字的几点注意点(9/17)

1、final修饰数据。

(1)final修饰基本类型变量,代表该变量是常量不能被再次初始化。(final修饰成员变量一定要进行初始化,否则编译报错,修饰一般变量时,在使用之前需要进行初始化。)

【final修饰的变量-常量,在类加载的准备阶段,进行赋初始值,而且是赋常量的值。】
Static修饰变量表示该变量属于类变量,可以修改内容。类加载准备阶段,赋的是零值。

https://blog.csdn.net/zxd8080666/article/details/78087646

(2)final修饰引用类型变量,代表该引用不能指向其他引用变量。

final变量有点类似C中的宏替换,但是这种替换只有在编译期能够确定final修饰的变量的值,编译器才能对变量直接进行替换。

例1:

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));}

结果: true,false
因为第一个b是final修饰的,编译期可以确定的值。

例2:

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";}

结果: false,false
因为b在编译期无法确定值。

2、final修饰方法。

final修饰的方法,代表该方法在子类中不可以被重写。子类中有相同的函数签名也不是对父类方法的重写。(同函数名的方法重载不受影响。)

3、final修饰类。

final修饰的类,不可以被继承。final不可以修饰abstract类,匿名内部类中所有变量必须是final变量。

ps:
(1)final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
(2)接口中声明的所有变量本身是final的。
(3)final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
(4)final方法在编译阶段绑定,称为静态绑定(static binding)。

参考:https://www.jb51.net/article/157603.htm

二、finally的注意点(9/17)

首先,不管有没有异常抛出或者try-catch中有无return。finally中语句都会执行!
这是为了使得finally中的一些对资源的释放、关闭不受影响。

(1)finally中有return,编译器会有警告(finally block does not complete normally,finally语句块没有正常完成)那么try-catch中无论return还是抛异常,finally中的return都会覆盖返回值。只返回finally中的return的值。
(2)finally中没有return,try-catch中有return,那么return和抛异常是正常输出的。如果finally中对return的变量进行修改,那么不会影响到返回值的大小。

try-catch-finally的执行顺序:
(1)try中执行到return(如果有return)之前所有语句,包括return中的运算语句。(相当于返回值已经确定了)。
(2)catch捕获try中运行语句的异常。程序执行catch块中return之前(包括return语句中的表达式运算)代码。
(3)执行finally中语句(没有return不能改变1、2的返回结果),如果有return覆盖1、2返回结果。

例1:

// finally修改变量值public static int fun() {int a = 2;try {return a + 1;} catch (Exception e) {} finally {a = -1;
//          return -1;}return 0;}public static void main(String[] args) {System.out.println(fun());}

程序运行结果:返回值为3.

例2:

// finally中return变量值public static int fun() {int a = 2;try {return a + 1;} catch (Exception e) {} finally {return -1;}}public static void main(String[] args) {System.out.println(fun());}

程序运行结果:-1.

参考:https://blog.csdn.net/u011277123/article/details/59074492

三、static关键字的初始化顺序(9/17)

静态变量和静态代码块初始化,先于实例变量和普通语句块。静态变量、静态代码块之间初始化顺序取决于自身的代码顺序。

最后才是构造函数的初始化。

重点:存在继承的初始化顺序。
(1)父类的静态变量、静态代码块。
(2)父类的实例变量、普通语句块初始化。
(3)父类的构造函数初始化。
####################################
(4)子类的静态变量、静态代码块执行。
(5)子类的实例变量、普通语句块初始化。
(6)子类的构造函数初始化。

final、static、finally总结相关推荐

  1. java中abstract,interface,final,static的区别

    2019独角兽企业重金招聘Python工程师标准>>> 关键字: abstract, interface, final, static 一,抽象类:abstract 1,只要有一个或 ...

  2. 数组声明为public final static缺陷

    本期主题为数组声明为public final static缺陷漏洞的相关介绍. 一.什么是数组声明为public final static缺陷? 程序声明一个public final static的数 ...

  3. 【Java4】实例初始化,类初始化,/接口,多态,final/static,权限修饰符/native

    文章目录 1.实例初始化过程:有几个构造器,就会有几个实例初始化方法 2.实例初始化和类初始化结合:先类(静态)后实 3.接口:只有abstract可省 3.1 鸟类案例:Flyable相当于父类的一 ...

  4. JVM—堆栈 堆 方法区 静态区 final static 内存分配

    原文作者:一夜丶鱼龙舞 原文地址:JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解(转) 一.栈(stack)和堆(heap) (1)内存分配的策略 按照编译原理的观点,程 ...

  5. java final内存机制_Java中的内存处理机制和final、static、final static总结

    装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JV ...

  6. static java 内存_final, static,final static 分别放在jvm内存的什么地方?

    比如我写一个类:public class JvmTest { public static String st_static = "hello static"; public fin ...

  7. java 关键字final static

    final的概念 继承的出现提高了代码的复用性, final的特点 l  final修饰类不可以被继承,但是可以继承其他类. class Yy {} finalclass Fu extends Yy{ ...

  8. 抽象类实例化 使用原功能 c++_java 学习笔记 day08 final/static关键字、抽象类和接口...

    1.final关键字 final修饰类:此类不能被继承 final修饰变量:则变量不能被修改,是常量 final修饰方法:父类的方法被final修饰时,不能被重写 2.static关键字 2.1被st ...

  9. 关键字—final static const的区别

    关键字 解释 修饰类 修饰方法 修饰变量 final:终态 这个关键字的含义是"这是无法改变的"或者"终态的": 这个类不能被继承,这个类的所有方法都是fina ...

  10. final+static

    final final关键字顾名思义代表"最后的",意味着不能被更改.它的定义,可以概括地分为以下三点: 被final修饰的类不能被继承: 被final修饰的方法不能被重写: 被f ...

最新文章

  1. 如何在 Centos8 中安装 Lynis审计工具
  2. java如何实现乌龟爬行_乌龟是怎样爬行的
  3. springboot start
  4. 第六次课作业(质量管理、项目人力资源管理)
  5. QuickWAP V1.5利用ASP读取Access记录集一例
  6. tair client java_TFS(Taobao File System)Java Client 使用经验
  7. c++ h cpp文件如何关联_C++核心准则SF.5: .cpp文件必须包含定义它接口的.h文件
  8. day-01(html)
  9. Jenkins持续集成环境, 如何自定义 maven repositories
  10. CentOS 7安装megacli
  11. java 接口传数组_Restful接口传递数组参数
  12. linux版百度导航软件,百度导航2019新版
  13. 用matlab实现“太阳-地球-月亮运行示意图”动画
  14. html中bottom的属性,css中bottom是什么意思?
  15. 在苹果Mac上怎样更改AirDrop名称?
  16. 有些人的微信字体可以变成蓝色,点进去就可以知道答案,这是为什么呢?
  17. 计算机网络(3)——三种常见的数据交换技术
  18. 光猫超级管理员账号密码和Telnet登陆
  19. 申请实用新型专利的流程
  20. TIA WinCC Unified入门经典

热门文章

  1. android 图片拍照,Android获取图片拍照时间
  2. 华中科技大学计算机系统基础实验3报告,华中科技大学计算机系统基础实验报告.doc...
  3. 彻底解决 Jenkins Slaver 节点无法执行 Git-LFS 命令
  4. springboot错误: 找不到或无法加载主类
  5. mysql基础,DISTINCT关键字
  6. Centos 安装 Chrome
  7. Jboss启动报错——DailyRollingFileAppender无法转换异常
  8. VXLAN 概念(Part II)- 每天5分钟玩转 OpenStack(109)
  9. 谷歌,火狐浏览器不能禁用自动补齐的bug缺陷
  10. 旧文重发:程序员的七种武器