Java核心技术36讲----------谈谈final、finally、finalize有什么不同

一、final

1.final修饰方法时,需要注意的点:

  #final修饰方法时,之前的第二个原因是效率。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“

  #因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。即父类的final方法是不能被子类所覆盖的,也就是说子类是不能够存在和父类一模一样的方法的

  #要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。(注:类的private方法会隐式地被指定为final方法。),参考如下代码:

public class B extends A {

    public static void main(String[] args) {

    }

    public void getName() {

    }
}

class A {

    /**
     * 因为private修饰,子类中不能继承到此方法,因此,子类中的getName方法是重新定义的、
     * 属于子类本身的方法,编译正常
     */
    private final void getName() {

    }

    /* 因为pblic修饰,子类可以继承到此方法,导致重写了父类的final方法,编译出错
    public final void getName() {

    }
    */
}

2.修饰变量时需要注意点

  #  final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

  # 如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

  # final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式

  # 当函数的参数类型声明为final时,说明该参数是只读型的。即你可以读取使用该参数,但是无法改变该参数的值。

  # 掌握点:类的final变量和普通变量有什么区别?见参考链接

    * 优化问题:编译时和运行时获取final的修饰的值

  # 掌握点:被final修饰的引用变量指向的对象内容可变吗?

    *changeValue方法中的参数i用final修饰之后,就不能在方法中更改变量i的值了。

    *值传递问题

参考:https://www.cnblogs.com/xiaoxi/p/6392154.html    http://tryenough.com/javabase#

二、finally

  

  # 需要关闭的连接等资源,更推荐使用Java7中添加的try-with-resources语句,因为通常Java平台能够更好地处理异常情况,编码也要少很少

  # 当一个外部资源的句柄对象实现了AutoCloseable接口,JDK7中便可以利用try-with-resource语法更优雅的关闭资源,消除板式代码。

  # try-with-resource时,如果对外部资源的处理和对外部资源的关闭均遭遇了异常,“关闭异常”将被抑制,“处理异常”将被抛出,但“关闭异常”并没有丢失,而是存放在“处理异常”的被抑制的异常列表中。

参考连接:https://www.cnblogs.com/itZhy/p/7636615.html     https://www.cnblogs.com/hihtml5/p/6505317.html

三、finalize

  # finilize被设计成在对象被垃圾收集前调用,这意味着实现了finalize方法的对象是个“特殊公民”,finlize的执行是和垃圾收集关联在一起的,一旦实现了非空的finalize方法,就会导致相应对象回收呈现数量级上的变慢。finalize本质上成为了快速回收的阻碍者

  # 不要让finalize去承担资源释放的主要职责,最多让finalize作为最后的“守门员”。所以,推荐资源用完即显式释放,或者利用资源池来尽量重用

  # java平台目前在逐步使用java.lang.ref.Cleaner来替换掉原来的finalize实现,Cleaner的实现利用了幻象引用。但同样不能完全依赖Cleaner进行资源回收,防止幻象引用堆积

原文地址:https://www.cnblogs.com/developmental-t-xxg/p/10333940.html

时间: 2024-11-10 14:56:09

Java核心技术36讲----------谈谈final、finally、finalize有什么不同的相关文章

java核心技术-(总结自杨晓峰-java核心技术36讲)

1. 谈谈你对java平台的理解 首先是java最显著的两个特性,一次写入处处运行:还有垃圾收集器gc,gc能够对java内存进行管理回收,程序员不需要关心内存的分配和回收问题 然后谈谈jre和jdk的区别,jre包含了jvm和java类库:jdk除了jvm和java类库,还包含了一些java工具集 常见的垃圾收集器有: Serial GC:串行收集,垃圾回收时会阻塞工作线程 Parallel GC:并行收集,多线程收集,停顿时间短,吞吐量高 CMS:使用标记清除算法,多线程进行垃圾收集 G1:

java核心技术36讲

https://time.geekbang.org/column/intro/82?utm_source=website&utm_medium=infoq&utm_campaign=82-presell&utm_content=article-banner 原文地址:https://www.cnblogs.com/ceshi2016/p/9009717.html

谈谈 final finally finalize 区别

声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点,是我从课程中将知识点消耗后,用个人的理解.观念所表达出来的文字,参考了原文,但由于是个人理解,因此不保证观点完全正确,也不代表错误的观点是课程所表达的.如果这样仍旧还是侵权了,请告知,会将发表的文章删掉. 当然,如果你对此课程有兴趣,建议你自己也购买一下,新用户立减 30,微信扫码订阅时还可以返现 6 元,相

第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种数据库自身体系结构的理解.今天这一讲,作为补充 Java 面试考察知识点的完整性,关于数据库的应用和细节还需要在实践中深入学习.今天我要问你的问题是,谈谈 MySQL 支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?典型回答所谓隔离级别(Isolation Level),就是在数据库事务中,

第37讲 谈谈Spring Bean的生命周期和作用域

在企业应用软件开发中,Java 是毫无争议的主流语言,开放的 Java EE 规范和强大的开源框架功不可没,其中 Spring 毫无疑问已经成为企业软件开发的事实标准之一.今天这一讲,我将补充 Spring 相关的典型面试问题,并谈谈其部分设计细节.今天我要问你的问题是,谈谈 Spring Bean 的生命周期和作用域?典型回答Spring Bean 生命周期比较复杂,可以分为创建和销毁两个过程.首先,创建 Bean 会经过一系列的步骤,主要包括:实例化 Bean 对象.设置 Bean 属性.如

【动力节点java培训】final, finally, finalize的区别

[动力节点java培训]final, finally, finalize的区别 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.finally是异常处理语句结构的一部分,表示总是执行.finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. 如果您对动力节点有兴趣,可以登录官网看看免费教学视频:http://dwz.cn/29yALNN java学习交流QQ群:425

Java核心技术-4-对象与类

4 对象与类 4.1 面向对象程序设计概述 1 类 封装(数据隐藏):将数据和行为组合在一个包中,并对对象使用者隐藏数据的实现方式. 对象中的数据成为实例域,操纵数据的过程称为方法. 2 对象 对象的三个主要特性:对象的行为behavior,对象的状态state,对象标识identity.3 识别类 4 类之间的关系 依赖uses-a,一个类的方法操纵另一个类的对象 聚合has-a,一个类的对象(其数据域)包含另一个类的对象 继承is-a,类A扩展类B. 4.2 使用预定义类 1 对象与对象变量

[基础] Java目录(摘自Java核心技术·卷1 基础知识)

Java核心技术·卷1 基础知识(原书第9版) 第1章 Java程序设计概述 1.1 Java程序设计平台 1.2 Java"白皮书"的关键术语 1.2.1 简单性 1.2.2 面向对象 1.2.3 网络技能 1.2.4 健壮性 1.2.5 安全性 1.2.6 体系结构中立 1.2.7 可移植性 1.2.8 解释型 1.2.9 高性能 1.2.10 多线程 1.2.11 动态性 1.3 Java applet与Internet 1.4 Java发展简史 1.5 关于Java的常见误解

《java核心技术 卷1 基础知识》二

<Java核心技术 卷1 基础知识>第4-5章 在Java中没有类就无法做任何事情 new操作符的返回值是一个引用 在Java中,如果使用一个未初始化的指针,运行系统会产生一个运行时错误. Date 用来表示时间点 LocalDate 日历表示法 同时不推荐使用Date类来处理日历 推荐使用LocalDate来处理日历 每一个拥有名字的类都会被编译生成对应的class文件 所有的Java对象都是在堆中构造的,构造器总是随着new操作符一起使用 在Java中,所有的方法都必须在类的内部定义,但并