第五章 初始化与清理(下)

基于DPLL算法解决3-SAT问题(C++实现) 近日看到一个3-SAT问题(Boolean SATisfiability Problem, 布尔逻辑可满足性问题),试着写了个算法求解。 阅读详情
                              第五章 初始化与清理
         现在总结的东西很多都需要用代码来帮助理解了,所以会有大量的测试代码,不过这中方式非常有用,如果认真敲过一遍之后,并且将这些代码弄清楚了,我相信你一定会对书中描述的内容有一个更清楚的认识。我是在eclipse工具上进行测试的,这里边的代码可以之间粘贴运行,不过对于程序员来说还是自己敲一遍吧,效果会更好。

5.5  清理 : 终结处理和垃圾回收
      程序员都了解初始化的重要性,但常常会忘记同样也重要的清理工作。Java有垃圾回收器负责回收无用对象占据的内存资源。但是,垃圾回收器只知道释放那些经过new分配的内存,如果你的对象(并非使用new)获得了一块“特殊”的内存区域,则垃圾回收器就不知道该如何释放这块“特殊”内存。为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。这个方法的工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
      注意:在Java中   
               1、对象可能不被垃圾回收。
               2、垃圾回收并不等于“析构”。(析构是在c++里出现的一个概念,就是在c++中要销毁对象必须使用析构函数)
5.5.1 finalize()的用途何在
        这里需要记住第三点:
        3、垃圾回收只与内存有关
          也就是说,使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收相关的任何行为来说(尤其是finalize()方法),它们也必须同内存及其回收有关。
5.5.2  你必须实施清理
        要清理一个对象,用户必须在需要清理的时刻调用执行清理动作的方法。无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果Java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。
5.5.3  终结条件
        通常,不能指望finalize(),必须创建其他的“清理”方法,并且明确地调用他们。
     class Book{
     boolean checkedOut = false;
     Book(boolean checkOut){
          checkedOut=checkOut;
     }
     void checkIn(){
          checkedOut=false;
     }
     protected void finalize(){
          if(checkedOut){
               System.out.println("error : checked out");
               try {
                    super.finalize();
               } catch (Throwable e) {
                    System.out.println("Throwable");
                    e.printStackTrace();
               }
          }
     }
}
public class TerminationCondition {
     public static void main(String[] args) {

          Book novel = new Book(true);
          novel.checkIn();
          new Book(true);
          System.gc();
     }

}
运行结果:error : checked out
因为在main()方法中,由于程序员错误,有一本书未被签入。要是没有finalize()来验证终结条件,将很难发现这种缺陷。
5.5.4  垃圾回收器如何工作

5.6  成员初始化
     Java尽力保证:所有变量在使用前都能得到恰当的初始化。对于方法的局部变量,Java以编译时错误的形式来贯彻这种保证。
     例如:我们定义成员变量的时候并没有给它们赋值,但是编译器会给它们初始化默认值,比如 int i;在编译的时候初始值就是0。但是在方法中就不行了:  void f(){
             int i;
             i++;     //错误,i没有被初始化
}
5.6.1  指定初始化
       如果想为某个变量赋初值,在基本数据类型中可以直接赋值。例如:int i=1;  char ch='x' ; boolean bool=true; 
       如果是其他类型的对象则可以创建一个对象来初始化:Depth d=new Depth();
       当然也可以通过调用方法来初始化:int i=f();

5.7  构造器初始化
      public class Counter {
     int i;
     public Counter() {
          i=7;
     }
}
该程序中i首先会被置零,然后变成7。
5.7.1  初始化顺序
      在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散步与方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
5.7.2  静态数据的初始化
       无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值;如果它是一个对象的引用,那么它的默认初始化值就是null。
class Bowl{
     Bowl(int marker){
          System.out.println("Bow1("+marker+")");
     }
     void f1(int marker){
          System.out.println("f1("+marker+")");
     }
}
class Table{
     static Bowl bowl1= new Bowl(1);
     Table(){
          System.out.println("Table()");
          bowl2.f1(1);
     }
     void f2(int marker){
          System.out.println("f2("+marker+")");
     }
     static Bowl bowl2=new Bowl(2);
}
class Cupboard{
     Bowl bowl3=new Bowl(3);
     static Bowl bowl4=new Bowl(4);
     Cupboard(){
          System.out.println("Cupboard");
          bowl4.f1(2);
     }
     void f3(int marker){
          System.out.println("f3("+marker+")");
     }
     static Bowl bowl5=new Bowl(5);
}
public class StaticInitialization {

     public static void main(String[] args) {
          System.out.println("createing new cupboard in main");
          new Cupboard();
          System.out.println("createing new cupboard in main");
          new Cupboard();
          table.f2(1);
          cupboard.f3(1);
     }
     static Table table=new Table();
     static Cupboard cupboard=new Cupboard();

}
运行结果:
Bow1(1)
Bow1(2)
Table()
f1(1)
Bow1(4)
Bow1(5)
Bow1(3)
Cupboard
f1(2)
createing new cupboard in main
Bow1(3)
Cupboard
f1(2)
createing new cupboard in main
Bow1(3)
Cupboard
f1(2)
f2(1)
f3(1)

由运行结果可以发现:初始化的顺序是先对静态对象(前提是得有对象被初始化时才会进行,就是说静态初始化只有在必要时刻才会进行),而后是“非静态”对象,然后才是构造器。
5.7.3  显式的静态初始化
       Java允许将多个静态初始化动作组织成一个特殊的“静态子句”(有时也叫做“静态块”)。
     class Cup{
     Cup(int marker){
          System.out.println("cup("+marker+")");
     }
     void f(int marker){
          System.out.println("f("+marker+")");
     }
}
class Cups{
     static Cup cup1;
     static Cup cup2;
     static{
          cup1=new Cup(1);
          cup2=new Cup(2);
     }
     Cups(){
          System.out.println("cups ()");
     }
}
public class Explicitstatic {

     public static void main(String[] args) {
          System.out.println("inside main");
          Cups.cup1.f(99);
     }
//     static Cups cups1=new Cups();
}
运行结果:
inside main
cup(1)
cup(2)
f(99)

      静态块跟静态初始化一样也只执行一次,当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员(即便从未生成过那个类的对象)。就会被执行。
5.7.4  非静态实例初始化
      Java中也有被称为实例初始化的类似语法,用来初始化每一个对象的非静态变量。例如:
      class Mug{
     Mug(int marker){
          System.out.println("Mug("+marker+")");
     }
     void f(int marker){
          System.out.println("f("+marker+")");
     }
}
public class Mugs {
     Mug mug1;
     Mug mug2;
     {
          mug1=new Mug(1);
          mug2=new Mug(2);
          System.out.println("mug1 & mug2 initialized");
     }
     Mugs(){
          System.out.println("Mugs()");
     }
     Mugs(int i){
          System.out.println("Mugs(int)");
     }

     public static void main(String[] args) {
          System.out.println("inside main()");
          new Mugs();
          System.out.println("new Mugs() completed");
          new Mugs(1);
          System.out.println("new Mugs(1) completed");

     }

}
运行结果:
inside main()
Mug(1)
Mug(2)
mug1 & mug2 initialized
Mugs()
new Mugs() completed
Mug(1)
Mug(2)
mug1 & mug2 initialized
Mugs(int)
new Mugs(1) completed

从以上代码可以看出少了static关键字,所以会重复执行。

5.8  数组的初始化
     数组的初始化有几种方法:
     第一种:int [] a={a,b,c}   这种方式是你明确知道要初始化多少个数据,这种形式很有用,但缺点也很明显,就是更加受限。
     第二种 : int [] a = new a [n]   这种形式可以解决你不知道具体要多少数据的难题,使用时可以根据情况而定。
      
5.9  枚举类型
      在Java SE5中添加了一个看似很小的特性,即enum关键字,它使得我们在需要群组并使用枚举类型集时,可以很方便的处理。在很大程度上,可以将enum当作其他任何类来处理,事实上enum确实是类,并且具有自己的方法。enum有一个特别实用的特性,即ta3可以在switch语句内使用;
     enum Spiciness{
     NOT, MILD, MEDIUM, HOT, FLAMING
}
public class Burrito {
     Spiciness degree;
     public Burrito(Spiciness degree){
          this.degree=degree;
     }
     public void describe(){
          System.out.print("this burrito is ");
          switch (degree) {
          case NOT:
               System.out.println("not spicy at all");
               break;
          case MILD:
          case MEDIUM:
               System.out.println("A little hot");
               break;
          case HOT:
          case FLAMING:
          default:
               System.out.println("maybe too hot");
               break;
          }
     }
     public static void main(String[] args) {
          Burrito
          plain = new Burrito(Spiciness.NOT),
          greenChile=new Burrito(Spiciness.MEDIUM),
          jalapeno=new Burrito(Spiciness.HOT);
         
          plain.describe();
          greenChile.describe();
          jalapeno.describe();
          
     }

}
运行结果:
this burrito is not spicy at all
this burrito is A little hot
this burrito is maybe too hot
浅谈云计算01 | 云计算服务的特点 在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。 阅读详情

相关推荐

【IC设计实战】去耦电容decap在电源完整性中的关键作用与选型策略

本文深入探讨了去耦电容(decap)在IC设计电源完整性中的核心作用。文章分析了decap如何通过提供本地电荷缓冲来抑制电源噪声与电压波动,并详细阐述了其选型与布局策略,包括MIM、MOM、MOS电容的特性对比,以及如何权衡峰值抑制与建立速度的矛盾,为设计稳定可靠的芯片电源系统提供实践指导。

weixin_29233857的博客 247

第五章:初始化与清理

第五章 初始化与清理 初始化和清理正是涉及安全的两个问题,Java中也引入了构造器,并额外提供了垃圾回收器 5.1 用构造器确保初始化 构造方法会在new对象的时候,也就是我们调用对象之前去执行一些初始化的操作 那么我们也可以在构造方法中去传参 如果某一种构造器是类中唯一的构造器,编译器不会允许你以其他任何方式创建该对象 练习1、创建一个类,初始化String为null pub...

pengbo6665631的博客 579

国产大模型 coding plan 实战决策指南:GLM、Kimi、豆包、abab 四大模型分层选型与工程落地

大模型辅助编程(coding assistant)正从概念验证走向规模化工程落地,其核心已不再是‘能否生成代码’,而是‘如何在真实开发流程中精准赋能’。理解模型能力边界、匹配技术栈特征、构建分层工作流(L1行级补全/L2函数生成/L3模块重构),是实现稳定提效的关键。GLM系列以工程稳定性见长,适合代码审计与测试生成;Kimi-Max凭借200K超长上下文胜任深度重构与合规审查;豆包响应快、框架适配深,是IDE高频补全的理想选择;abab系列则在IoT固件等跨模态场景中展现独特价值。本文聚焦国产模型在金融、

weixin_32238157的博客 427

第五章 初始化与清理

Java编程思想 第五章 初始化与清理

小付想暴富敷敷富富的博客 1455

群晖NAS从入门到精通的所有帖子汇总,只要这一篇就够了

本站陆陆续续的转载、原创帖子也有十几二十篇了,从不同的角度对群晖NAS的各种骚操作都有深入的讲解,虽然很多文章都不是讲的很深入,但是针对小白入门已经是足够了,希望对小白来说是一个入门,群晖NAS的大佬们勿喷,哪里写的不对的,请随时留言西安SEO优化站长一定在第一时间纠正修改。

西安SEO优化网站资源 8万+

树莓派5新手必看:保姆级ibus中文输入法安装与配置全流程(含.bashrc设置避坑)

本文详细介绍了在树莓派5上安装和配置ibus中文输入法的完整流程,包括系统环境准备、ibus框架安装、图形界面配置及常见问题解决方案。通过清晰的步骤说明和避坑指南,帮助新手快速实现中文输入功能,提升开发效率。

weixin_29159441的博客 524

《Java编程思想》读书笔记:第五章 初始化与清理

目录5.1用构造器确保初始化5.2方法重载5.2.1区分重载方法5.2.2涉及基本类型的重载5.2.3以返回值区分重载方法5.3默认构造器5.4this关键字5.4.1在构造器中调用构造器5.4.2static的含义5.5清理:终结处理和垃圾回收5.5.1finalize()的用途何在5.5.2你必须实施清理5.5.3终结条件5.5.4垃圾回收器如何工作5.6成员初始化5.6.1指定初始化5.7构造器初始化5.7.1初始化顺序5.7.2静态数据的初始化5.7.3显示的静态初始化5.7.4非静态实例初始化5.

Mr_Kian的博客 917

药物对接仿真软件:HADDOCK_(5).HADDOCK中蛋白质-配体对接流程

半柔性能量最小化阶段是在刚体能量最小化的基础上,允许配体的部分柔性,通过优化配体的构象来进一步提高对接的准确性。半柔性能量最小化阶段是在刚体能量最小化的基础上,允许配体的部分柔性,通过优化配体的构象来进一步提高对接的准确性。如果是PDB格式,确保文件包含所有必要的原子信息。对接完成后,HADDOCK会生成一系列的输出文件,包括对接后的蛋白质-配体复合物结构文件、能量评分文件和统计分析文件。对接完成后,HADDOCK会生成一系列的输出文件,包括对接后的蛋白质-配体复合物结构文件、能量评分文件和统计分析文件。

kkchenjj的博客 1077

第五章 初始化和清理

第五章 初始化和清理第五章 初始化和清理5.1 用构造器确保初始化练习1 :创建一个类,它包含一个未初始化的String引用,验证该引用被Java初始化成null创建一个类,它包含一个在定义时候就被初始化了String域,以及另一个通过构造器初始化的String域5.2 方法重载5.2.1 区分重载方法设计基本类型的重载5.2.3 已返回值区分重载方法5.3 默认构造器 第五章 初始化和清理 初始化变量和清理数据 5.1 用构造器确保初始化 假设为每个类都定义一个initialize方法,该方法提醒你在使用

lglgf的博客 295

AI辅助需求分析与提示词生成

文章标题 《AI辅助需求分析与提示词生成》 关键词 人工智能 需求分析 提示词生成 深度学习 机器学习 强化学习 数学模型 系统架构

AI天才研究院 1211

【2025最新版】Open3D 区域生长分割(python详细过程版)

点云区域生长分割算法的python详细过程版实现。博客长期更新,本文最新更新时间为:2025年3月23日。

点云侠的博客 9526

第五章笔记:初始化与清理

记录一下好的描述以及不知道的问题(会附带书中页码) (P77)在Java中,“初始化”和“创建”捆绑在一起,两者不能分离 (P77)构造器没有返回值,但是和返回值为空的(void)不同。   对于空返回值,尽管方法不会自动返回什么,但仍可选择让它返回别的东西。   构造器则不会返回任何东西,你别无选择(new表达式确实返回了对新建对象的引用,但构造器本身并没有任何返回值) (P81)重载方法中的...

LuM523的博客 286

【AUTOSAR-E2E】-2.3-配置E2E:基于E2EPW配置一个RX接收的Signal Group(使用E2E Profile 1)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <-.

「汽车电子助手」的博客 3949
上一篇: 第五章 初始化与清理(上)
下一篇: 第六章 访问权限控制
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值