第五章 初始化与清理

概要

在本章,主要介绍了类的初始化和清理相关知识。包括类成员初始化、方法成员初始化、static变量和static域的初始、static方法的调用等。于此同时,还介绍了finalize()方法的使用概念,以及垃圾回收器基本原理。
下面是本章记录的重点:
1. 在方法调用中,对于基本类型,若传入的参数与实际参数类型不符合,会自动转化成精度更高的类型。例如:

class A{
    void f(int a);//这里定义了一个方法f
}
//假设我们在这里调用
f('a');我们使用char类型,他会自动升级成int,但如果我们使用float则需要我们强制转换。
  1. 方法发生重载的条件是:方法名相同,参数类型(包括顺序)不同或者个数不同。值得记住的是不允许出现方法名一样,参数类型一样但返回类型不同。因为系统无法确认你到底调用了哪个方法。
  2. 我们可以在构造器中通过this()的形式调用别的构造器,值得注意的是,我们只能将这个this()写在第一行,并只允许调用一次别的构造器。除了构造器之外,其他任何地方禁止使用这种方式调用构造器。
  3. 在方法调用的时候,实际上我们会传入这个对象的this指针,系统在执行程序的时候,根据this指针判断来源于那个对象。但对于static方法调用的时候,他是不包含这个隐藏的this的。这让我想到了android activity中调用Handler的时候,不过不用static修饰可能会引起内存泄漏(因为handler会跟looper关联,而looper是一直存在的)。
  4. finalize()方法是在虚拟机内存不足的时候,产生gc操作回收这个对象内存前做一些清理工作,值得注意的是,他只会被调用一次。我们需要注意gc可能会引起内存泄漏,因为在gc的时候,一不小心就会让被回收的对象在没有引用的情况下变的有引用。
  5. JIT编译的全称是just-in-time,这种技术会把程序全部或者部分翻译成本地机器码,程序运行速度因此得以提升。在通过这种技术装载某个类的时候,编译器会首先找到.class文件,然后装入该类所有的字节码到内存。这个时候有两个选择,一中就是让编译器在最开始编译所有的代码,另一种选择是只在需要的时候编译必要的代码,不需要的代码压根不会被编译。下面是会关于编译和解释的介绍:

    编译是指将源语言转化为目标计算机的可执行二进制代码,如将CC++编译为Windows上的可执行2进制文件,这种编译一旦完成,那么就只能在特定平台上运行了,由于程序执行的是编译好的二进制文件,因此速度比较快(相对下面的解释)。
    解释是指程序不做任何变动,以源代码的形式提供在目标计算机上执行,但是源生代码计算机是不识别的,因此要边解释边执行,解释一条执行一条,这样的话就比编译要慢了。由于程序要在运行时动态解释语言,因此往往需要特定的平台,例如Java需要目标机器上安装JRE,但是这种方式也有一个好处就是可以跨平台,源代码不变,在运行时根据不同的平台,解释成不同的二进制执行。

    7.假设有个类Dog, 对象的创建过程如下(其实我们可以这样理解,我们在load一个类的时候,会执行类的所有静态变量初始化到永久区,然后在new的时候分配内存,并且初始化这个对象的全局变量为初始值,然后再执行构造函数):

    a.即使没有显示的使用static关键字,构造器实际上也是静态方法。因此当首次创建类为Dog的对象时,或者Dog类的静态方法/静态域首次被访问,java解释器必须查找类路径,以定位Dog.class文件。
    b.然后载入Dog.class,有关静态初始化的所有动作都会被执行,从这里可以看出,因为只会载入一次Dog.class所以静态初始化只会被执行一次。
    c.当用new Dog()创建对象的时候,首先在堆上为Dog对象分配足够的存储空间。
    d.这块存储空间会被清零,这就会自动的将Dog对象中的所有基本类型数据都设置成默认值,而引用则会被设置成null。(这里指的注意的是,我们定义的数据会被初始化一个默认值,在e步骤会再次执行我们给定的初始化值)
    e.执行所有出现于字段定义处的初始化动作。
    f.执行构造器。

  6. 数组有以下几种初始化方法:
    int[] a = {1,2,3,4,5};//值得注意的是,这种方法必须在定义的时候就初始化,不能在别的地方重新初始化值。
    int[] b = new int[]{1,2,3};//这种是可以在除了定义这个数组变量之外的地方初始化
    int[] c = new int[5];

数组实际上是一个引用(这就意味着传参或者复制会跟对象一样,会让本身数组对象值发生变化),使用第三种方式定义一个定长数组的时候,会自动初始化值(基本类型初始化默认值,对象初始化为null)。
7. 枚举的使用:

public enmum Spiciness{
    NOT,MILD,MEDIUN.HOT,FLAMING
}
Spiciness howHot = Spiciness.MEDIUM;//通过这种方式,可以定义一个枚举类型。
for(Spiciness s:Spiciness.values()){
    System.out.println(s+",ordinal"+s.ordinal());//通过ordinal方法可以查找当前这个枚举的位置
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值