天天看点

Java编程思想总结篇(1-11章学习笔记)——第五章第五章 初始化与清理第六章loading...

第五章 初始化与清理

1.用构造器确保初始化

构造器:和类名相同,分无参构造器和有参构造器。

和C++一样,你不写他也会帮你写。

构造器有利于减少错误,并使代码更易阅读。从概念上讲,“初始化”与“创建”是彼此独立的。在java中“初始化”和“创建”捆绑在一起,两者不能分离。

2.方法重载

 依据参数列表的不同进行重载,不能依据返回值的不同进行重载(因为很多方法的调用并不关心返回值)

 区分重载的方法很简单,每个重载的方法都必须有独一无二的参数类型列表。

  基本类型能从一个小的类型自动提升为一个较大的类型,此过程一旦牵涉到重载,可能会造成一些混淆。如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升。

  如果传入的实际参数较大,就得通过类型转换来执行窄化转换。如果不这样做,编译器会报错

不过注意:

a.声明为final的方法不能被重载

b.声明为static的方法不能重载,但是能够被再次声明。

c.重载方法的返回类型可以相同也可以不同,但仅返回类型不同不足以成为方法的重载。

d.编译器根据调用方法的签名逐个匹配,以选择对应方法的过程叫做重载分辨

3.默认构造器

默认构造器(又名“无参”构造器)是没有形式参数的---它的作用是创建一个“默认对象”。但是如果你已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。

4.this关键词

 this关键字只能在方法内部使用,标识对"调用方法的那个对象"的引用。

 return this, 返回当前对象的引用,可以对当前对象进行链式操作

构造器中调用构造器,使用this(args),且必须将构造器调用放在最起始处,否则编译器报错。

尽管可以用this调用一个构造器,但却在一个不能在构造器中同时调用两个。除构造器之外,编译器禁止在其他任何方法中调用构造器

 static方法就是没有this的方法。在static方法的内部不能调用非静态方法,反过来倒是可以的,而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。(在我的练习题里有好多明显的标注这类型的错误)

5.清理:终结处理和垃圾回收

首先,对象可能不被垃圾回收。

其次,Java中的

finalize()

不等于C++中的

析构函数。

最后,垃圾回收只与内存有关

关于finalize(),一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。

不过书中再三强调,不推荐适用finalize()做清理工作,因为对象可能不被垃圾回收,finalize()也就不会被保证一定被执行。所以不要指望finalize(),必须创建其它的清理方法,并且明确地调用它们。

垃圾清扫模式是标记清扫模式,运作方式是标记清扫和停止复制结合。

6.成员初始化

 默认类型的初始化内容见第一章总结,引用类型默认为null,指定初始化即定义字段时即初始化,所有对象的字段初始值都一样,在类的内部,变量定义的先后顺序决定了初始化的顺序。且优先级大于构造器初始化。

7.构造器初始化

 创建对象时,初始化。

8.数组初始化

数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。

数组定义方式:int[] a; int a[], 前者更符合语义,后者为c++中常用的形式

初始化:int[] a = {1,2,3,4,5,6};

编译器不允许指定数组大小。现在拥有的只是对数组的一个引用,并没有为数组分配内存空间。

在java中可以将一个数组赋值给另一个数组,其实真正做的只是复制了一个引用。

有了可变参数,就再也不用显式地编写数组语法了,当你指定参数时,编译器实际上会为你去填充数组。你获取的仍旧是一个数组

9.静态初始化

 无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值。如果它是一个对象引用,它的默认初始化值就是null。

注意,第一次访问静态数据的时候,静态对象会被初始化,此后都不会。

初始化的顺序是先静态对象(如果他们尚未因前面的对象创建过程而被初始化),而后是"非静态"对象

10.枚举类型

 枚举本质上还是一个类,所有类的很多特性在枚举里面也是通用的。枚举可以用于switch

11.main里面的String赋值方法

public class Code_08_DymanicArray {
    public static void main(String[] args) {
        Other.main(new String[]{ "fiddle", "de", "dum" });
    }
}

class Other {
    public static void main(String[] args) {
        for(String s : args)
            System.out.print(s + " ");
    }
}
           

12.对象创建的过程

a.当首次创建类对象时(构造器可以看成静态方法,但不是)或类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Main.class文件。

b.载入Main.class,执行静态初始化的所有动作,且只执行这一次。

c.当调用

new Main()

时,首先将在堆上分配存储空间。

d.存储空间清零。所有成员变量会置成0或null。

e.执行所有出现于字段定义处的初始化动作。

f.执行构造器。

第六章loading...