Java高级教程 - 创建和销毁对象

537 阅读3分钟
原文链接: www.codemore.top
通过构造函数创建

Java是面向对象的语言,因此创建类实例是Java最重要的一个功能。创建Java对象的时候,构造函数扮演了重要的角色。

隐式构造函数

Java运行定义一个类而无需定义构造函数,这并不意味这构造函数不存在,只是Java编译器会自动的替无构造函数的类生成一个默认无参数的构造函数。例如

package com.javacodegeeks.advanced.construction;

public class NoConstructor {
}
无参构造函数

提供无参构造函数相当于Java编译器编译是插入的无参构造函数显示提供

package com.javacodegeeks.advanced.construction;

public class NoArgConstructor {
    public NoArgConstructor() {
        // Constructor body here
    }
}
带参数的构造函数

带参数的构造函数是创建实例,初始化最常用的方式,例如

package com.javacodegeeks.advanced.construction;

public class ConstructorWithArguments {
    public ConstructorWithArguments(final String arg1,final String arg2) {
        // Constructor body here
    }
}
final ConstructorWithArguments constructorWithArguments = 
    new ConstructorWithArguments( "arg1", "arg2" ); 

同样的,可以创建多个构造函数,并且构造函数可以互相调用,例如

public ConstructorWithArguments(final String arg1) {
    this(arg1, null);
}
初始化块

Java 可以通过初始化块来进行初始化,这个特性用的较少,但是仍然需要知道,并且初始化块会在构造函数调用之前调用。

package com.javacodegeeks.advanced.construction;

public class InitializationBlock {
    {
        // initialization code here
    }
}
字段默认值

Java对类的字段提供了默认值

  • boolean 默认 false
  • byte 默认 0
  • short 默认 0
  • int 默认 0
  • long 默认 0L
  • char 默认 \u0000
  • float 默认 0.0f
  • double 默认 0.0d
  • Object 默认 null

例如:

package com.javacodegeeks.advanced.construction;

public class InitializationWithDefaults {
    private boolean booleanMember;
    private byte byteMember;
    private short shortMember;
    private int intMember;
    private long longMember;
    private char charMember;
    private float floatMember;
    private double doubleMember;
    private Object referenceMember;

    public InitializationWithDefaults() {     
        System.out.println( "booleanMember = " + booleanMember );
        System.out.println( "byteMember = " + byteMember );
        System.out.println( "shortMember = " + shortMember );
        System.out.println( "intMember = " + intMember );
        System.out.println( "longMember = " + longMember );
        System.out.println( "charMember = " + 
            Character.codePointAt( new char[] { charMember }, 0  ) );
        System.out.println( "floatMember = " + floatMember );
        System.out.println( "doubleMember = " + doubleMember );
        System.out.println( "referenceMember = " + referenceMember );
    }
}

输出

booleanMember = false
byteMember = 0
shortMember = 0
intMember = 0
longMember = 0
charMember = 0
floatMember = 0.0
doubleMember = 0.0
referenceMember = null
静态初始化块

相对于初始化块,静态初始化块只是在初始化块前加了static

package com.javacodegeeks.advanced.construction;

public class StaticInitializationBlock {
    static {
        // static initialization code here
    }
} 
对象的销毁

对于Java来说,由于有垃圾回收,所以对象创建不再使用后,是有垃圾回收线程默认回收的。但是可以是公用finalizer()方法,来控制垃圾回收。当时先了finalizer()方法后,Java会将其放入Finalizer的垃圾回收队列中。finalizer()是一个很危险的操作,因为它会阻止对象被回收,尤其是操作错误是会导致对象复活,导致垃圾回收失败,所以尽可能不要使用。

创建对象的模式
单例模式

单例模式可以很简单的创建一个对象,并且保证整个应用中仅有一个对象存在。 例如:

package com.javacodegeeks.advanced.construction.patterns;

public class NaiveSingleton {
    private static NaiveSingleton instance;
    
    private NaiveSingleton() {        
    }
    
    public static NaiveSingleton getInstance() {
        if( instance == null ) {
            instance = new NaiveSingleton();
        }
        
        return instance;
    }
}

或者:

final property of the class.
package com.javacodegeeks.advanced.construction.patterns;

public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();
    
    private EagerSingleton() {        
    }
    
    public static EagerSingleton getInstance() {
        return instance;
    }
}

或者为了线程安全

package com.javacodegeeks.advanced.construction.patterns;

public class LazySingleton {
    private static LazySingleton instance;
    
    private LazySingleton() {        
    }
    
    public static synchronized LazySingleton getInstance() {
        if( instance == null ) {
            instance = new LazySingleton();
        }
        
        return instance;
    }
}

当然还可以通过双检锁,静态子类,枚举等方式创建单例

工厂方法

使用工厂方法模式,可以轻松的创建多个对象例如:

package com.javacodegeeks.advanced.construction.patterns;

public class Book {
    private Book( final String title) {
    }     

    public static Book newBook( final String title ) { 
        return new Book( title );
    }
}
public interface BookFactory {
    Book newBook();
c class Library implements BookFactory {
    @Override
    public Book newBook() {
        return new PaperBook();
    }
}

public class KindleLibrary implements BookFactory {
    @Override
    public Book newBook() {
        return new KindleBook();
    }
}