首页 > 编程语言 >《Java编程思想第四版》学习笔记14

《Java编程思想第四版》学习笔记14

时间:2023-08-17 18:04:31浏览次数:32  
标签:Java 14 finalize Characteristic Frog finalizing 第四版 println out

//: Frog.java
// Testing finalize with inheritance
class DoBaseFinalization {
    public static boolean flag = false;
}
class Characteristic {
    String s;
    Characteristic(String c) {
        s = c;
        out.println(
                "Creating Characteristic " + s);
    }
    protected void finalize() {
        out.println(
                "finalizing Characteristic " + s);
    }
}
class LivingCreature {
    Characteristic p =
            new Characteristic("is alive");
    LivingCreature() {
        out.println("LivingCreature()");
    }
    protected void finalize() {
        out.println(
                "LivingCreature finalize");
// Call base-class version LAST!
        if(DoBaseFinalization.flag)
            try {
                super.finalize();
            } catch(Throwable t) {}
    }
}
class Animal extends LivingCreature {
    Characteristic p =
            new Characteristic("has heart");
    Animal() {
        out.println("Animal()");
    }
    protected void finalize() {
        out.println("Animal finalize");
        if(DoBaseFinalization.flag)
            try {
                super.finalize();
            } catch(Throwable t) {}
    }
}
class Amphibian extends Animal {
    Characteristic p =
            new Characteristic("can live in water");
    Amphibian() {
        out.println("Amphibian()");
    }
    protected void finalize() {
        out.println("Amphibian finalize");
        if(DoBaseFinalization.flag)
            try {
                super.finalize();
            } catch(Throwable t) {}
    }
}
public class Frog extends Amphibian {
    Frog() {
        out.println("Frog()");
    }
    protected void finalize() {
        out.println("Frog finalize");
        if(DoBaseFinalization.flag)
            try {
                super.finalize();
            } catch(Throwable t) {}
    }
    public static void main(String[] args) {
        if(args.length != 0 &&
                args[0].equals("finalize"))
            DoBaseFinalization.flag = true;
        else
            out.println("not finalizing bases");
        new Frog(); // Instantly becomes garbage
        out.println("bye!");
// Must do this to guarantee that all
// finalizers will be called:
        System.runFinalizersOnExit(true);
    }
} ///:~

                                                                                                                                                       P.201-202

将该例程的最后一句System.runFinalizersOnExit(true)改为System.gc()。在IntelliJ IDEA 2023.1.4 (Ultimate Edition),Java版本 "18.0.2" 2022-07-19环境下运行结果分别为:

not finalizing bases

Creating Characteristic is alive

LivingCreature()

Creating Characteristic has heart

Animal()

Creating Characteristic can live in water

Amphibian()

Frog()

bye!

Frog finalize

finalizing Characteristic can live in water

finalizing Characteristic has heart

finalizing Characteristic is alive

Creating Characteristic is alive

LivingCreature()

Creating Characteristic has heart

Animal()

Creating Characteristic can live in water

Amphibian()

Frog()

bye!

Frog finalize

Amphibian finalize

Animal finalize

LivingCreature finalize

finalizing Characteristic can live in water

finalizing Characteristic has heart

finalizing Characteristic is alive

注意看Characteristic类的析构顺序和书上给出的输出结果相反,更具合理性,可能跟Java版本高了后技术改进有关。

标签:Java,14,finalize,Characteristic,Frog,finalizing,第四版,println,out
From: https://blog.51cto.com/u_16183536/7125995

相关文章

  • 《Java编程思想第四版》学习笔记15
    初始化的实际过程是这样的:(1)在采取其他任何操作之前,为对象分配的存储空间初始化成二进制零。(2)就象前面叙述的那样,调用基础类构建器。此时,被覆盖的draw()方法会得到调用(的确是在RoundGlyph构建器调用之前),此时会发现radius的值为0,这是由于步骤(1)造成的。(3)按照原先声明的......
  • 2023年 Java 面试八股文(20w字)
    第一章-Java基础篇1、你是怎样理解OOP面向对象难度系数:⭐面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:继承:继承是从已有类得到继承信息创建新类的过程封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口多态性:多态性是指允许不同......
  • java stream分组之后求和
    javastream分组之后求和癞蛤蟆吃了小天鹅于2022-08-2609:37:42发布6023收藏4文章标签:java版权注:elementComponentDtos.stream().mapToDouble(ElementComponentDto::getAmount).sum();为求和可以根据返回类型的不同去改变相对应的求和函数(mapToDouble)注BigDecimal为了保......
  • 【狂神说Java】Java零基础学习笔记-JavaSE总结
    【狂神说Java】Java零基础学习笔记-JavaSE总结JavaSE总结:......
  • [JOISC 2014 Day3] 电压 题解
    题面给定\(n\)个点\(m\)条边的无向图。现在要对每个点黑白染色。若能够使一条边连接的两点颜色相同,其他边连接的两点颜色不同,则这条边合法。求合法的边数。$2\leqn\leq10^5,1\leqm\leq2\times10^5$。图可能不连通,不保证没有重边。题解首先考虑转化一下题目......
  • java:使用flexmark-java 实现 CommonMark(规范 0.28)解析
    文档https://github.com/vsch/flexmark-java依赖Java8<dependency><groupId>com.vladsch.flexmark</groupId><artifactId>flexmark-all</artifactId><version>0.62.2</version></dependency>Java9+&l......
  • Java踩坑1.Plugin org.apache.maven.plugins:maven-install-plugin:2.5 could not
    首次运行maveninstall或任何一个插件时,报错:Downloadingfromhuaweicloud:https://repo.huaweicloud.com/repository/maven/org/apache/maven/plugins/maven-install-plugin/2.5/maven-clean-plugin-2.5.pom[INFO]---------------------------------------------------------......
  • 【狂神说Java】Java零基础学习笔记-异常
    【狂神说Java】Java零基础学习笔记-异常异常01:Error和Exception什么是异常实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们......
  • javascript学习笔记day3
    今天没做啥笔记都是些学了的基础知识,学的都是像while,switch这些基础的语法,下面带是笔记++i前置运算和i++后置运算的区别:前置运行先相加再计算,后端运算先计算完再++。比较符也有隐式转换brank退出循环continue退出本次循环继续下次循环 顺便把while的循环作业一起放上来了,这个......
  • JAVA权限管理 助力企业精细化运营
    在企业的日常经营中,企业人数达到一定数量之后,就需要对企业的层级和部门进行细分,建立企业的树形组织架构。围绕着树形组织架构,企业能够将权限落实到个人,避免企业内部出现管理混乱等情况。权限管理是每个企业管理中的重要内容,但在实操中,权限管理面临着诸多考验。因为,权限管理本身不......