构造器
与C++类似,构造器明后才能与类名相同。
但注意区分,在JAVA中,若只定义了一个带参的构造器,需要显示定义另外一个无参构造器,才能满足无参构造器调用。


重载

  • 每个被重载的方法必须有UNIQUE的参数列表
  • 难以通过返回值进行函数重载,因为有时候需要利用函数副作用仅进行操作而不返回值,导致难区分

this应用场合

  • 用在return语句中返回当前对象的引用。
  1. class Leaf{
  2. Leaf increment(){
  3. i++;
  4. return this;
  5. }
  6. void main(){
  7. Leaf x = new Leaf();
  8. x.increment().increment();
  9. }

初始化i=0,进行Main()后,i=2

  • 在构造器中调用构造器
  1. class Flower(){
  2. Flower(){
  3. this(1);
  4. ...
  5. }
  6. Flower(int x){
  7. ...
  8. }
  9. }

在Flower()里面通过this调用Flower(int x)


static

  • 静态变量,作为类间共享全局变量
  • Static Blocks(静态代码块):
    加载类之前执行
  1. class Human{
  2. int x;
  3. static{
  4. x = 2;
  5. }
  6. Human(){System.out.println(x);}
  7. }

result: 2


垃圾回收器

  • 对象可能不被垃圾回收
  • 垃圾回收不等于析构
  • 垃圾回收只与内存有关

Stop and Copy
暂停程序的运行,将所有存活的对象从当前堆赋值到另外一个堆中,没有复制的就需要被垃圾回收,同时回收碎片空间。
mark and sweep
从栈和静止存储区出发,遍历所有的引用,找出所有存活的对象。每找到一个存活对象,给对象设一个标记,当标记过程完成后,清理才开始。清理过程中,没有标记的对象将被释放。

finalize()

1.在GC准备释放对象所占用的内存空间之前,首先调用finalize方法。
2.调用时机:一般用于释放非JAVA资源(打开的文件资源、数据库连接),或是调用非JAVA方法(native方法)分配的内存

成员初始化

  • 直接定义
  1. class A{
  2. int x = 1;
  3. Depth d = new Depth();
  4. }
  • 调用function
  • 构造器初始化

初始化顺序

优先级:

静态>非变量>function(包括构造器)

创建对象过程概括:(以Dog类为例)
1.首次创建Dog时或Dog的静态方法属性时,Java首先查找类路径,定位Dog.class
2.加载完Dog.class后,静态初始化完成
3.new dog() 创建对象后,清零并设默认值。
4.执行在字段定义处的初始化动作。
5.执行构造器

显示的静态初始化
  1. // housekeeping/Spoon.java
  2. public class Spoon {
  3. static int i;
  4. static {
  5. i = 47;
  6. }}

非静态实例初始化
  1. public class Mugs{
  2. Mug mug1;
  3. {
  4. mug1 = new Mug(1);
  5. }
  6. }

同样在构造器之前执行。

数组初始化
  • 所拥有的只是对数组的一个引用(你已经为该引用分配了足够的存储空间),但是还没有给数组对象本身分配任何空间。
  • new 非基本类型的数组时,创建的是一个引用数组 ,直到创建新的对象并把对象赋值给引用,初始化才算结束。

可变参数列表

由于Java的类均是继承与Object基类,故可用Object创建数组,进行可变参数列表创建。

  1. printArray(new Object[] {47, (float) 3.14, 11.11});

但当你指定参数时,编译器会为你填充数组。

  1. printArray(47, (float) 3.14, 11.11);

并且对于其他类型,也可作用可变参数,在进行自动填充时会先进行匹配。

  1. void print(int ...)
  2. //这里的...表示n个int类型的参数