一、初始化
初始化其实就是为变量分配内存空间,并确定其初始值的过程。想了解Java中初始化的各种情况,首先要了解Java中变量的类型。根据自己的理解,将Java中的变量类型分成以下几种,虽然可能不太准确,但只是为了方便理解把握:
(1)局部变量:内存空间被分配在堆栈上;一般是在方法中定义的变量;其初始化操作是必须的,否则编译器会报错,初始化操作有两种方式:一种是在定义的时候初始化其值,另一种是定义和初始化值分开,如下面所示:

int a = 6;
//或者
int a;
a = 6;

(2)静态成员变量(static变量或者类变量):内存空间被分配在堆上,而且只占一份存储区域,即多个实例共享一个static变量;局部变量不能被声明为静态变量;它的初始化操作是可选的,如果不人为对其进行初始化,它将会被自动初始化,人为初始化操作是在定义时对其进行赋值;其初始化过程只在类第一次实例化或者第一次调用静态方法的时候完成的。
(3)非静态成员变量(普通成员变量):内存空间被分配在堆上;初始化操作也是可选的,如果不人为初始化则会被自动初始化,初始化操作是在定义时对其赋值。
(4)引用变量(对象变量):即类的实例;是通过new的方式在堆上分配内存空间的;与C++不同,Java中不允许有局部对象变量;在被new完后,类的构造器被调用,从而完成初始化过程;如果在定义类时没有定义构造器,则默认构造器会在初始化过程中被调用,构造器还可以被重载,通过参数列表的不同来区分不同的构造器。
Java中,类在实例化后,其初始化的顺序通过下面的例子来直观说明:
package com.exercise;

import java.awt.peer.SystemTrayPeer;

class A {
public A(int i) {
System.out.println("A"+i+" was created!");
}
}

class B {
public B(int i) {
System.out.println("Static B"+i+" was created!");
}
}

class BaseClass {
A a = new A(1);
static {
System.out.println("BaseClass's first static block was execute!");
}
static B b = new B(2);
static {
System.out.println("BaseClass's second static block was execute!");
}
public BaseClass() {
System.out.println("BaseClass's constructor was called!");
}
A aa = new A(3);
static B bb = new B(4);
}

class ChildClass extends BaseClass {
A aaa = new A(5);
static {
System.out.println("ChildClass's first static block was execute!");
}
static B bbb = new B(6);
static {
System.out.println("ChildClass's second static block was execute!");
}
public ChildClass() {
System.out.println("ChildClass's constructor was called!");
}
A aaaa = new A(7);
static B bbbb = new B(8);
}

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
System.out.println("Enter the main function!");
ChildClass childClass = new ChildClass();
System.out.println("Leave the main function!");
}

}

运行结果如下:

Enter the main function!
BaseClass's first static block was execute!
Static B2 was created!
BaseClass's second static block was execute!
Static B4 was created!
ChildClass's first static block was execute!
Static B6 was created!
ChildClass's second static block was execute!
Static B8 was created!
A1 was created!
A3 was created!
BaseClass's constructor was called!
A5 was created!
A7 was created!
ChildClass's constructor was called!
Leave the main function!

根据运行结果可以看出,初始化顺序是
1、父类静态成员变量和静态初始化块,按在代码中出现的先后顺序
2、子类静态成员变量和静态初始化块,按在代码中出现的先后顺序
3、父类非静态成员变量,按在代码中出现的先后顺序
4、父类构造器
5、子类非静态成员变量,按在代码中出现的先后顺序
6、子类构造器
二、清理
      Java中提供了垃圾回收器用于自动回收在程序中通过new创建的内存空间,垃圾回收不能保证不用的内存空间立刻就能得到释放,如果程序对性能要求较高的话,可能要自己创建清理函数,然后在需要的时候调用。
      除了通过new方式分配内存空间,有时候可能调用了“本地方法”分配了内存空间(如调用C语言中的malloc()),针对类似的情况,Java中提供了finalize()方法来处理这类情况的内存回收,一般finalize()有用武之地的情况是,用于验证对象终结条件,从而发现潜在的缺陷。例如如下代码(摘自《Java编程思想》):

class Book {
boolean checkedOut=false;
Book(boolean checkOut) {
checkedOut=checkOut;
}

void checkIn() {
checkedOut=false;
}

protected void finalize() {
if(checkedOut)
System.ouy.println("Error:checked out");
//Normally,you'll also do this:
//super.finalize();//Call the base-class version
}
}

public class TerminatoinCondition {
public static void main(String[]args) {
Book novel=new Book(true);
//Proper cleanup:
novel.checkIn();
//Drop the reference,forget to clean up:
new Bool(true);
//Force garbage collection & finalization:
System.gc();
}
}

转载于:https://www.cnblogs.com/Pickuper/archive/2011/06/25/2090123.html

《Java编程思想》学习笔记(三)——初始化与清理相关推荐

  1. Java编程思想学习笔记-第11章

    <?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...

  2. Java编程思想学习笔记4 - 序列化技术

    今天来学习下Java序列化和反序列化技术,笔者对<Java编程思想>中的内容,结合网上各位前辈的帖子进行了整理和补充,包括: 序列化概述 Java原生序列化技术 Hessian序列化技术 ...

  3. JAVA编程思想学习笔记——第一章 对象导论

    搞了一年多java,野路子出身,发现java基础这块还是相当的薄弱!故决定学习<Java编程思想>这本书.在此把学习的知识点记录下! 面向对象的五大特性 1.万物皆为对象 2.程序是对象的 ...

  4. java编程思想初始化引用,JAVA编程思想--第5章 初始化与清理

    随着计算机革命的发展,"不安全"的编程方式已逐渐成为编程代价高昂的主因之一. 初始化和清理(cleanup)是涉及安全的两个问题.初始化时,忘记初始化时许多错误的来源,还有就是不知 ...

  5. 一起读Java编程思想(2)---构造器的初始化与清理

    初始化与清理 用构造器确保初始化 每个类都要定义一个initialize()方法,提醒在使用对象之前必须调用这个方法,使得类的设计者可以确保每个对象都可以被初始化. 构造函数是没有返回类型的函数,用于 ...

  6. Java编程思想 学习笔记7

    七.复用类 1.组合语法 在新的类中产生现有类的对象.由于新的类是由现有类的对象所组成,所以这种方法叫做组合. 类中域为基本类型时能够自动被初始化为零.对象引用被初始化为null. 编译器不是简单地为 ...

  7. Java编程思想 学习笔记1

    一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...

  8. java编程思想 学习笔记(2)

    第二章     一切都是对象 用引用(reference)操纵对象 String s = "asdf"; String s; 但这里所创建的只是引用,并不是对象.如果此时向s 发送 ...

  9. java编程思想学习笔记(第七章:复用类)

    复用代码是java众多引人注目的功能之一.但是要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. 7.1组合语法 将对象引用置于新类中.每一个非基本类型的对象 ...

  10. JAVA编程思想读书笔记(三)--RTTI

    接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...

最新文章

  1. Android 应用程序集成Google 登录及二次封装
  2. 【每周CV论文推荐】 初学深度学习图像分割必须要读的文章
  3. Ecplise中的Maven项目提示找不到jar包
  4. PPT 下载 | 神策数据杜明翰:数据赋能产品的 3 个锦囊
  5. 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))
  6. SpringBoot 处理内置对象
  7. 怎么上传文件到kk服务器,VS Code 关于SFTP上传文件到多服务器的配置
  8. HTML DOM教程 36-HTML DOM Link 对象
  9. C++新特性探究(五):for循环、范围for语句
  10. PHP书写规范 匈牙利命名法+驼峰法命名
  11. MPLS在ATM技术上实现的研究
  12. 绘图之使用工作空间直接绘图
  13. dlib 人脸特征点检测
  14. 使用MATLAB计算切比雪夫多项式系数
  15. 聊聊如何实施负载均衡
  16. cpu第几代计算机,赛扬G系列有几代cpu分别是
  17. 【9505】部落卫队
  18. python框架之Scrapy自动存储mysql数据库
  19. 【python】一篇文章入门python简单画图
  20. 最近我都干了些什么——反思!!

热门文章

  1. 前端使用vue-i18n做中英文翻译
  2. 因时而动 顺势而为——广告人独家专访快友股份CEO林森
  3. 将Model对象转换成json文本或者json二进制文件
  4. 如何在CentOS6.2上安装并运行飞鸽传书
  5. Exchange监控用户邮件
  6. 软件单元测试工具比较
  7. react input[type='number']
  8. vuex之state-状态对象的获取方法(三)
  9. JavaScript常见集合操作
  10. PHP7 RC7 Release对比PHP5.6快速排序20000数据性能体验以及新语法尝鲜