《JAVA编程思想》chapter5【初始化与清理】学习笔记
1、构造方法/constructor:
- 构造方法的名称与类名相同;
- 可以定义多个构造方法,调用时靠参数(数量、类型)的不同来调用对应的构造方法。但是要注意方法中参数的类型转换的发生;
- 如果自己定义过构造方法,则编译器不会产生默认的构造方法。所以建议定义构造方法时,首先定义一个无参的构造方法。
2、this关键字:
this可以指明/返回当前对象的句柄,即返回的是当前类的句柄;
可以用来调用构造方法。注意:用this来调用构造方法时,必须放在方法内的首行!
public class Flower<span style="font-family: Arial, Helvetica, sans-serif;">{</span>
private int flowerNumber = 0;
<span style="white-space:pre"> </span>Flower(){
<span style="white-space:pre"> </span> System.out.println("Flower is beautyful");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>Flower( int number){
<span style="white-space:pre"> </span> this();// 使用this来调用构造方法,但是必须将这个调用放在开始!
<span style="white-space:pre"> </span> System.out.println("Here are " + number + " flowers");
<span style="white-space:pre"> </span> this.flowerNumber = number;
<span style="white-space:pre"> </span>}
}
一般static修饰的变量/方法称为全局(静态)变量/方法。其实就是static变量/方法的内存是固定的,只有一块,没有副本,在任何地方对其进行操作,操作的内容都是定义的这块内存中的内容。类似于全局变量/方法。
static的一个作用就是可以实现对象之间的数据共享。
另外,java编程思想中写到,在static方法的内部不能调用非静态方法,我的理解是:使用static定义的是静态方法,编译器只给它分配一块内存,所以说这个方法是不属于任何类的,也就不会包含类对象的句柄,当然不能对包含类对象句柄的非静态方法进行调用。
4、清理
内存清理的流程:垃圾回收器调用finalize() --> (下一次)垃圾回收器发生回收动作 --> 内存得到清理。
一般只有在使用“本地方法”的情况下,才需要调用finalize()释放存储空间。
如果在某种情况下,类对象再被垃圾回收前需要满足某个判定条件,则可以定义protect void finalize()方法,满足时则调用super.finalize(),否则进行提示或其他操作。
5、初始化
在java中,所有的变量在使用前,都需要能得到恰当的初始化。对于类中的变量,可以在定义类成员变量的时候直接为其赋值(此处与C++截然相反),对于类可以使用new来创建一个对象对初始化它。
使用构造方法进行初始化之前,编译器会自动进行初始化,这个初始化过程是无法阻止的。
包含(静态存储区)的变量初始化:程序执行main方法,首先要初始化main方法所在类的变量(创建的对象或者静态变量/对象),初始化被创建的类中的变量和方法,然后执行main方法所在类的(main)方法。其中,类中变量定义的顺序决定了初始化的顺序。另外一点,类的构造方法可以看成是静态方法。静态初始化只有在必要时才会进行。
6、数组的初始化
定义数组有两种方法:int[ ] array或者int array[ ]。两种方法是等价的,建议使用前一种,因为直观上来讲,int[ ] array表明array的数据类型为 int类型的数组。
三种初始化的方法:
1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
eg: int[] array; array = new int[3]; array[n] = .....
2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;
eg: int[] array = {1,2,3,4,5};
3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化。
eg: int[] array = new int[3];