final、static、finally总结
一、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总结相关推荐
- java中abstract,interface,final,static的区别
2019独角兽企业重金招聘Python工程师标准>>> 关键字: abstract, interface, final, static 一,抽象类:abstract 1,只要有一个或 ...
- 数组声明为public final static缺陷
本期主题为数组声明为public final static缺陷漏洞的相关介绍. 一.什么是数组声明为public final static缺陷? 程序声明一个public final static的数 ...
- 【Java4】实例初始化,类初始化,/接口,多态,final/static,权限修饰符/native
文章目录 1.实例初始化过程:有几个构造器,就会有几个实例初始化方法 2.实例初始化和类初始化结合:先类(静态)后实 3.接口:只有abstract可省 3.1 鸟类案例:Flyable相当于父类的一 ...
- JVM—堆栈 堆 方法区 静态区 final static 内存分配
原文作者:一夜丶鱼龙舞 原文地址:JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解(转) 一.栈(stack)和堆(heap) (1)内存分配的策略 按照编译原理的观点,程 ...
- java final内存机制_Java中的内存处理机制和final、static、final static总结
装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JV ...
- static java 内存_final, static,final static 分别放在jvm内存的什么地方?
比如我写一个类:public class JvmTest { public static String st_static = "hello static"; public fin ...
- java 关键字final static
final的概念 继承的出现提高了代码的复用性, final的特点 l final修饰类不可以被继承,但是可以继承其他类. class Yy {} finalclass Fu extends Yy{ ...
- 抽象类实例化 使用原功能 c++_java 学习笔记 day08 final/static关键字、抽象类和接口...
1.final关键字 final修饰类:此类不能被继承 final修饰变量:则变量不能被修改,是常量 final修饰方法:父类的方法被final修饰时,不能被重写 2.static关键字 2.1被st ...
- 关键字—final static const的区别
关键字 解释 修饰类 修饰方法 修饰变量 final:终态 这个关键字的含义是"这是无法改变的"或者"终态的": 这个类不能被继承,这个类的所有方法都是fina ...
- final+static
final final关键字顾名思义代表"最后的",意味着不能被更改.它的定义,可以概括地分为以下三点: 被final修饰的类不能被继承: 被final修饰的方法不能被重写: 被f ...
最新文章
- 如何在 Centos8 中安装 Lynis审计工具
- java如何实现乌龟爬行_乌龟是怎样爬行的
- springboot start
- 第六次课作业(质量管理、项目人力资源管理)
- QuickWAP V1.5利用ASP读取Access记录集一例
- tair client java_TFS(Taobao File System)Java Client 使用经验
- c++ h cpp文件如何关联_C++核心准则SF.5: .cpp文件必须包含定义它接口的.h文件
- day-01(html)
- Jenkins持续集成环境, 如何自定义 maven repositories
- CentOS 7安装megacli
- java 接口传数组_Restful接口传递数组参数
- linux版百度导航软件,百度导航2019新版
- 用matlab实现“太阳-地球-月亮运行示意图”动画
- html中bottom的属性,css中bottom是什么意思?
- 在苹果Mac上怎样更改AirDrop名称?
- 有些人的微信字体可以变成蓝色,点进去就可以知道答案,这是为什么呢?
- 计算机网络(3)——三种常见的数据交换技术
- 光猫超级管理员账号密码和Telnet登陆
- 申请实用新型专利的流程
- TIA WinCC Unified入门经典
热门文章
- android 图片拍照,Android获取图片拍照时间
- 华中科技大学计算机系统基础实验3报告,华中科技大学计算机系统基础实验报告.doc...
- 彻底解决 Jenkins Slaver 节点无法执行 Git-LFS 命令
- springboot错误: 找不到或无法加载主类
- mysql基础,DISTINCT关键字
- Centos 安装 Chrome
- Jboss启动报错——DailyRollingFileAppender无法转换异常
- VXLAN 概念(Part II)- 每天5分钟玩转 OpenStack(109)
- 谷歌,火狐浏览器不能禁用自动补齐的bug缺陷
- 旧文重发:程序员的七种武器