final, finally, finalize

首先,这三个关键字没什么关联,只是放在一起比较像,用法用处完全不同。

final:

  final关键字可以用来修饰类、方法、变量(成员变量和局部变量),final用的多,下面详细介绍下

  1.1 final 修饰类

    final修饰类,表明这个类不能被继承,同时该类内的所有方法都被隐式定义为final。

  1.2 final 修饰方法

    final 修饰方法,该方法不可以被继承,不可以被重写。因此要注意,如果子类定义相同方法名和参数的函数,不是重写父类方法,是重新定义了一个新方法。

  1.3 final 修饰变量

    final修饰变量,表示只能被赋值一次,赋值后其值不再改变。

    当修饰基本数据类型时,基本数据类型的值初始化后就不会再发生变化。

    当修饰引用类型时,初始化后就不能再指向其他对象了,但是对象的值是可以变化的。引用的值本质是一个地址,因此只要地址不变,就不冲突。

    final修饰一个成员变量,必须要显式初始化。一种是声明变量时候初始化,一种是声明变量时不初始化,构造函数中对变量初始化。

finally :

  finally用于异常处理,只能用在try/catch语句中。

  关于finally要注意两点:

    1、finally不一定会执行

      有两种不会执行:a、在执行try/catch之前异常跳出。b、系统强制退出,例如:System.exit(0);

    2、finally中包含return的易错点!!在Java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。

    由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return前执行(除非碰到exit函数),因此finally块里的代码也是在return之前执行的。

    例如:    

    public static void main(String[] args) {
int result = test();
System.out.println(result);
}
public static int test(){
try {
return 1;
} catch (Exception e) {
return 0;
}finally{
System.out.println("finally");
return 2;
}
}

      运行结果:

    

    可以知道,finally块中有return语句时,会覆盖函数中的return。

    由于java中值传递和引用传递的不同,因此,对基本类型的数据,在finally块中改变return的值对返回值没有任何影响,而对引用类型的数据会有影响

    例子:   

public static void main(String[] args) {
System.out.println(test());
System.out.println( testStr());
}
private static int test(){
int i = -1;
try {
i= 1;
return i;
} catch (Exception e) {
return i;
}finally{
i=2;
System.out.println("finally");
}
}
private static StringBuilder testStr(){
StringBuilder str = new StringBuilder("hello");
try {
return str;
} catch (Exception e) {
return null;
}finally{
str.append("world");
System.out.println("finally");
}
}

    运行结果:

    

finalize:

  finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。不需要程序员自己手动调用的。只了解,不推荐使用。

 

      

一、基础篇--1.1Java基础-final, finally, finalize 的区别的更多相关文章

  1. 一、基础篇--1.1Java基础-面向对象的特征

    面向对象的特征 封装.继承和多态 https://blog.csdn.net/jianyuerensheng/article/details/51602015 封装: 定义:封装就是将数据或函数等集合 ...

  2. 一、基础篇--1.1Java基础-什么是java的序列化和反序列化

     什么是序列化和反序列化 序列化:把堆内存中的java对象数据,通过某种方式把对象存储到磁盘文件或者传递给其他网络节点.这个过程称为序列化.简单来说呢,就是将对象转换成二进流的过程. 反序列化:把磁盘 ...

  3. 一、基础篇--1.1Java基础-HTTP请求的GET与POST方式的区别【转】

    http://www.cnblogs.com/logsharing/p/8448446.html 转载的这篇文章,很有意思,说的也很全面,学习下,防丢失,备份记录下 GET和POST是HTTP请求的两 ...

  4. 一、基础篇--1.1Java基础-抽象类和接口的区别

    抽象类和接口的区别 抽象类和接口在设计层面的区别主要体现在:接口是对动作的抽象,抽象类是对根源.类的抽象.抽象类表示的是,这个对象是什么,接口表示的是,这个对象可以做什么. 比如,男人.女人是人,人是 ...

  5. 一、基础篇--1.1Java基础-重载和重写的区别

    重载和重写的区别 重写: 1.也叫子类的方法覆盖父类的方法,要求返回值.方法名和参数都相同: 2.子类抛出的异常不能超过父类相应方法抛出的异常.(子类异常不能超出父类异常): 3.子类方法的的访问级别 ...

  6. 一、基础篇--1.1Java基础-Java运算符优先级

    在一个表达式中可能包含多个有不同运算符连接起来的.具有不同数据类型的数据对象:由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结 ...

  7. 一、基础篇--1.1Java基础-Object类中常见的方法,为什么wait notify会放在Object里边

    这是个设计相关的问题,它考察的是面试者对现有系统和一些普遍存在但看起来不合理的事物的看法.回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原 ...

  8. 一、基础篇--1.1Java基础-hashCode和equals方法的区别和联系

     hashCode和equals方法的区别和联系  两个方法的定义 equals(Object obj)方法用来判断两个对象是否"相同",如果"相同"则返回tr ...

  9. 一、基础篇--1.1Java基础-equals与==的区别

    ==: ==比较的是变量内存中存放的对象的内存地址,用来判断两个对象地址是否相同,比较的是否是同一个对象. 1.两边的操作数必须是同一类型,不然编译不通过. 2.如果是基本数据类型比较,值相等则为tr ...

随机推荐

  1. vue项目报错1 Vue is a constructor and should be called with the `new` keyword && jquery.js?eedf:3850 Uncaught TypeError: this._init is not a function...

    Vue is a constructor and should be called with the `new` keyword Uncaught TypeError: this._init is n ...

  2. js 学习三 Array

    1.数组的长度 var sequence = [1, 1, 2, 3, 5, 8, 13]; sequence .length //7 2.字符串转换成数组 string.split() var my ...

  3. Win7安装Visual Studio 2019闪退问题

    最近在Win7 系统上安装最新版的VS2019发现 每次在这个画面之后就闪退了,即便换了台电脑也是一样的情况,于是我意识到,这应该是系统本身的问题 经过调查发现是只需要安装两个更新就可以了 这两个更新 ...

  4. ip - Linux IPv4 协议实现

    SYNOPSIS(总览) #include <sys/socket.h> #include <net/netinet.h> tcp_socket = socket(PF_INE ...

  5. SQL语句 运算符

    6.2 运算符   6.2.1 算术运算符 加 / 减 / 乘 / 除 6.2.2 连接运算符 是用来连接字符串的.跟java中的 + 是一致的. select 'abc' || ' bcd ' as ...

  6. stdarg的使用

    // 可变参头文件 <stdarg.h> // 主要依赖五个宏: va_list,va_start, va_arg, va_end, va_copy // 其中 va_copy 是 c99 ...

  7. 初识Python,利用turtle画图

    目录 我的第三篇博客 一.初识Python 1.变量 2.注释 3.turtle库 我的第三篇博客 一.初识Python 1.变量 变量就是可变的的量,用来描述某个事物的属性.本质作用就是描述和接收变 ...

  8. javaIO--数据流之IO流与字节流

    0.IO流 0.1.IO(Input Output)流的概念 Java中将不同设备之间的数据传输抽象为“流”:Stream设备指的是:磁盘上的文件,网络连接,另一个主机等等 按流向分:输入流,输出流: ...

  9. Git远程新建分支之后,本地看不到最新分支

    git remote update origin –prune 注意 双- csdn 对于 两个 - 看起来像一个

  10. 通过页面名字调用页面并添加到tab控件中

    /// <summary> /// 动态 显示 tab /// </summary> /// <param name="sFromName">类 ...