最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Java如何創(chuàng)建和銷毀對象

 更新時間:2022年11月24日 16:37:48   作者:RonTech  
Java由Sun Microsystems發(fā)明并在1995年發(fā)布,是世界上使用最廣泛的編程語言之一。本文主要和大家介紹一下Java是如何創(chuàng)建和銷毀對象的,希望對大家有所幫助

一、介紹

Java由Sun Microsystems發(fā)明并在1995年發(fā)布,是世界上使用最廣泛的編程語言之一。Java是一個通用編程語言。由于它擁有功能強大的庫、運行時、簡單的語法、平臺無關(Write Once, Run Anywhere - WORA)以及令人敬畏的社區(qū)從而吸引了很多的開發(fā)者。

本系列文章我們我們將會覆蓋一些高級的Java概念,我們假設你對Java語言已經(jīng)有一些基礎知識。本系列文章并不是一個完整的參考,而是一個將您的Java技能提升到下一個級別的詳細指南。

本系列文章中將會看到一些代碼片段,在這些代碼片段里面將會使用java 7的語法以及java 8的語法。

二、實例構造(Instance Construction)

Java是面向對象的編程語言,所以新實例(objects)的創(chuàng)建可能是它最重要的概念之一。在新的類實例中構造器(Constructors)扮演了非常核心的角色,Java對于構造器(Constructors)的定義提供了很多方案。

2.1 隱式(implicitly)構造器

Java允許定義無任何構造器的類,但是這并不意味著此類沒有構造器。比如說,讓我們看一下下面這個類。

package com.javacodegeeks.advanced.construction;
public class NoConstructor {
}

此類沒有構造器,但是Java編譯器會隱式地(implicitly)生成一個構造器并且在使用new關鍵字創(chuàng)建新的類實例時會被調用。

final NoConstructor noConstructorInstance = new NoConstructor();

2.2 無參構造器(Constructors without Arguments)

無參構造器是顯式執(zhí)行Java編譯器工作的最簡單的方法。

package com.javacodegeeks.advanced.construction;
public class NoArgConstructor {
    public NoArgConstructor() {
        // Constructor body here
    }
}

在使用new關鍵字創(chuàng)建此類的新實例時會此構造器將會被調用。

final NoArgConstructor noArgConstructor = new NoArgConstructor();

2.3 有參構造器(Constructors with Arguments)

有參構造器是參數(shù)化創(chuàng)建類實例的一個非常有意思和有用的方法。下面這個類定義了一個具有兩個參數(shù)的構造器。

package com.javacodegeeks.advanced.construction;
public class ConstructorWithArguments {
    public ConstructorWithArguments(final String arg1,final String arg2) {
        // Constructor body here
    }
}

在這種情況下,當使用new關鍵字創(chuàng)建類實例時,兩個構造參數(shù)都必須提供。

final ConstructorWithArguments constructorWithArguments = new ConstructorWithArguments( "arg1", "arg2" );

非常有意思的是,使用this關鍵字,構造器之間可以相互調用。這種連接構造函數(shù)的方式在作為減少代碼重復方面是一個非常好的實踐,并且從跟本上說這樣做可以讓一個類只有一個初始化入口點。接上例,我們添加一個只有一個參數(shù)的構造器。

public ConstructorWithArguments(final String arg1) {
this(arg1, null);
}

2.4 初始化塊(Initialization Blocks)

Java也提供了另外一種使用初始化塊的方式實現(xiàn)初始化邏輯。這個特性很少使用但是非常有必要了解一下它的存在。

package com.javacodegeeks.advanced.construction;
    public class InitializationBlock {
    {
        // initialization code here
    }
}

在某些情況下,初始化塊可以彌補匿名無參構造器的缺陷。有一些特殊的類可能會有很多個初始化塊并且他們會依次按照他們在代碼中定義的順序被調用,比如:

package com.javacodegeeks.advanced.construction;
public class InitializationBlocks {
    {
        // initialization code here
    } {
        // initialization code here
    }
}

初始化塊并不是替代構造器并且他們可以獨立于構造器而存在。但是需要提及的最重要的一點就是初始化塊會在任何構造器被調用之前被執(zhí)行。

package com.javacodegeeks.advanced.construction;
public class InitializationBlockAndConstructor {
    {
        // initialization code here
    }
    public InitializationBlockAndConstructor() {
    }
}

2.5 構造保障(Construction guarantee)

Java提供了一些開發(fā)者所依賴的初始化保障,未初始化的實例和類參數(shù)會自動初始化為它們的默認值。

讓我們使用下面的例子來確認一下這些默認值。

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 );
    }
}

一旦使用new關鍵字實例化:

inal InitializationWithDefaults initializationWithDefaults = new InitializationWithDefaults();

將會在控制臺輸出如下結果:

booleanMember = false
byteMember = 0
shortMember = 0
intMember = 0
longMember = 0
charMember = 0
floatMember = 0.0
doubleMember = 0.0
referenceMember = null

2.6 可見性(Visibility)

構造器受Java可見性規(guī)則約束并且可以擁有訪問控制修飾符來決定是否其他類可以調用特定的構造函數(shù)。

2.7 垃圾回收(Garbage collection)

Java(特別是JVM)使用自動垃圾回收機制。簡而言之,當新對象被創(chuàng)建,JVM就會自動為這些新創(chuàng)建的對象分配內存。于是,當這些對象沒有任何引用的時候,他們就會被銷毀并且他們所占用的內存就會被回收。

Java垃圾回收是分代的,基于這種假設(分代假設)大多數(shù)的對象在很年輕的時候就已經(jīng)不可達(在他們被創(chuàng)建之后的很短的時間內就沒有任何引用并且被安全銷毀)。大多數(shù)開發(fā)者曾經(jīng)相信在Java中創(chuàng)建對象是很慢的并且應該盡可能地避免新對象的實例化。

實際上,這并不成立:在Java中創(chuàng)建對象的開銷非常的小并且很快。雖然如此,但是沒有必要創(chuàng)建生命周期比較長的對象,因為創(chuàng)建過多的長壽命對象最終可能會填滿老年代空間從而引發(fā)stop-the-world的垃圾回收,這樣的話開銷就會比較大。

2.8 終結器(Finalizers)

到目前為止,我們已經(jīng)談到了構造函數(shù)和對象初始化,但實際上并沒有提到任何關于對象銷毀的內容。這是因為Java使用垃圾收集器去管理對象的生命周期,并且垃圾收集器的責任就是去銷毀無用對象并回收這些對象占用的內存。

然而,在Java中有一個被稱為終結器(Finalizers)的特殊特性,它有點類似于析構函數(shù),但是在執(zhí)行資源清理時它所解決的是不同的意圖。終結器(Finalizers)是被考慮用來解決一些危險的特征(比如會導致無數(shù)的副作用和性能問題的問題)。

一般來說,他們是沒有必要的,應該避免(除了非常罕見的情況下,主要是有關本地對象)。Java 7語言引入了一種名為try-with-resources的更好的替代方法和AutoCloseable接口,它允許像如下的方式這樣干凈的寫代碼:

try ( final InputStream in = Files.newInputStream( path ) ) {
    // code here
}

3、靜態(tài)初始化(Static initialization)

到目前為止,,我們已經(jīng)談到了構造函數(shù)和對象初始化。但是Java也支持類級別的初始化構造,我們稱之為靜態(tài)初始化(Static initialization)。

靜態(tài)初始化(Static initialization)有點類似于初始化塊,除了需要添加static關鍵字之外。注意靜態(tài)初始化在每次類加載的時候它只執(zhí)行一次。比如:

package com.javacodegeeks.advanced.construction;
public class StaticInitializationBlock {
    static {
        // static initialization code here
    }
}

和初始化塊類似,在類定義時你可以包含任意數(shù)量的初始化塊,它們會根據(jù)在類代碼中出現(xiàn)的順序依次執(zhí)行,比如:

package com.javacodegeeks.advanced.construction;
public class StaticInitializationBlocks {
    static {
        // static initialization code here
    }
    static {
        // static initialization code here
    }
}

因為靜態(tài)初始化(Static initialization)塊可以從多個并行線程中觸發(fā)(第一次類加載發(fā)生),Java運行時保證在線程安全的前提下僅僅被執(zhí)行一次。

4、構造模式(Construction Patterns)

過去這幾年很多易于理解和廣泛應用的構造模式在Java社區(qū)出現(xiàn)。我們將會介紹幾個比較常用的:單例模式(singleton)、幫助器(helpers)、工廠模式(factory)、依賴注入(dependency injection )——大家熟知的控制反轉(inversion of control)。

4.1 單例模式(Singleton)

單例模式是軟件開發(fā)者社區(qū)中最老也是最具爭議性的模式之一?;緛碚f,它的主要思想就是確保在任何時候類僅僅只有一個實例被創(chuàng)建。思想就是如此簡單,然而單例模式引發(fā)了很多關于如何使之正確的討論,特別是線程安全的討論。下面是單例模式原生版本的例子:

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;
    }
}

這段代碼至少有一個問題就是如果多個線程同時調用,那么此類就能夠創(chuàng)建多個實例。設計合適的單例模式的方法之一是使用類的 static final屬性。

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;
    }
}

如果你不想浪費資源并且希望在單例對象真正需要的時候才被延遲創(chuàng)建的話,這就要求顯示同步了(explicit synchronization),這就有可能導致多線程環(huán)境中的并發(fā)性降低(關于并發(fā)的詳細內容我們將會在后續(xù)的文章中討論)。

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;
    }
}

如今,在大多數(shù)的案例中單例模式并不被考慮作為一個很好的選擇,主要是因為單例模式將會導致代碼很難測試。依賴注入模式讓單例模式變得沒有必要。

4.2 Utility/Helper類

utility或者helper類是被許多開發(fā)者所使用的相當流行的一種模式?;緛碚f,它所代表的是無實例( non-instantiable)類(構造器被定義成private),僅僅可以選擇將方法定義成final(后續(xù)會介紹如何定義類)或者static。比如;

package com.javacodegeeks.advanced.construction.patterns;
public final class HelperClass {
    private HelperClass() {
    }

    public static void helperMethod1() {
        // Method body here
    }

    public static void helperMethod2() {
        // Method body here
    }
}

站在開發(fā)者的角度,helpers類經(jīng)常所扮演的是一個容器的角色,這個容器中放了很多在其他地方找不到但是其他類需要相互共享和使用的互相不相關的方法。這種設計決定了在很多情況下要避免使用:總能找到另一種重用所需功能的方式,保持代碼的簡潔和清晰。

4.3 工廠模式(Factory)

工廠模式被證明是軟件開發(fā)人員手中非常有用的技術。因此,Java有幾種風格工廠模式,從工廠方法到抽象工廠。工廠模式最簡單的例子是返回特定類的新實例的靜態(tài)方法(工廠方法)。例如:

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 );
    }
}

有人可能會爭辯說,介紹newBook工廠方法并沒有什么意義,但是使用這種模式通常會使代碼更具可讀性。工廠模式的另一個變化涉及接口或抽象類(抽象工廠)。例如,讓我們定義一個工廠接口:

public interface BookFactory {
    Book newBook();
}

依賴庫類型,完成幾種不同的實現(xiàn):

public class Library implements BookFactory {
    @Override
    public Book newBook() {
        return new PaperBook();
    }
}

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

現(xiàn)在,Book的特定類被隱藏在BookFactory接口實現(xiàn)之后,BookFactory仍然提供創(chuàng)建book的通用方式。

4.4 依賴注入(Dependency Injection)

依賴注入(一說控制反轉)被類設計者認為是一個很好的做法:如果某些類的實例依賴其他類的實例,被依賴的實例應該通過構造(比如通過設置器——setters,或者策略——strategies模式等)的思想提供給依賴的實例,而不是依賴的實例自行創(chuàng)建??匆幌孪旅孢@種情況:

package com.javacodegeeks.advanced.construction.patterns;
import java.text.DateFormat;
import java.util.Date;
public class Dependant {
    private final DateFormat format = DateFormat.getDateInstance();

    public String format( final Date date ) {
        return format.format( date );
    }
}

類Dependant需要一個DateFormat的實例,并且它僅僅只是在構造時通過調用DateFormat.getDateInstance() 創(chuàng)建。最好的設計方案應該是通過構造器參數(shù)的形式去完成相同的事情。

package com.javacodegeeks.advanced.construction.patterns;
import java.text.DateFormat;
import java.util.Date;
public class Dependant {
    private final DateFormat format;

    public Dependant( final DateFormat format ) {
        this.format = format;
    }


    public String format( final Date date ) {
        return format.format( date );
    }
}

按這種方案實現(xiàn)的話,類的所有依賴都是通過外部提供,這樣就很容易的修改date format和為類寫測試用例。

在本系列文章的這一部分中,我們一直在研究類和類的實例構造以及初始化技術,涵蓋了幾種廣泛使用的模式。在下一部分中,我們將分析Object類以及其熟知方法的用法:equals,hashCode,toString和clone。

以上就是一文詳解Java如何創(chuàng)建和銷毀對象的詳細內容,更多關于Java創(chuàng)建 銷毀對象的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot中過濾器Filter+JWT令牌實現(xiàn)登錄驗證

    SpringBoot中過濾器Filter+JWT令牌實現(xiàn)登錄驗證

    本文主要介紹了SpringBoot中過濾器Filter+JWT令牌實現(xiàn)登錄驗證,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-04-04
  • Spring @RestController注解組合實現(xiàn)方法解析

    Spring @RestController注解組合實現(xiàn)方法解析

    這篇文章主要介紹了Spring @RestController注解組合實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Java靜態(tài)工廠方法的實例詳解

    Java靜態(tài)工廠方法的實例詳解

    這篇文章主要介紹了 Java靜態(tài)工廠方法的實例詳解的相關資料,希望通過本文大家能掌握java今天工廠方法,需要的朋友可以參考下
    2017-09-09
  • Security 登錄認證流程詳細分析詳解

    Security 登錄認證流程詳細分析詳解

    本文Security登錄認證流程詳細分析詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Mybatis-plus如何在xml中傳入自定義的SQL語句

    Mybatis-plus如何在xml中傳入自定義的SQL語句

    這篇文章主要介紹了Mybatis-plus如何在xml中傳入自定義的SQL語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Mybatis的mapper.xml中if標簽test判斷的用法說明

    Mybatis的mapper.xml中if標簽test判斷的用法說明

    這篇文章主要介紹了Mybatis的mapper.xml中if標簽test判斷的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Feign+mybatisplus搭建項目遇到的坑及解決

    Feign+mybatisplus搭建項目遇到的坑及解決

    這篇文章主要介紹了Feign+mybatisplus搭建項目遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • emoji表情與unicode編碼互轉的實現(xiàn)(JS,JAVA,C#)

    emoji表情與unicode編碼互轉的實現(xiàn)(JS,JAVA,C#)

    這篇文章主要介紹了emoji表情與unicode編碼互轉的實現(xiàn)(JS,JAVA,C#),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • maven多模塊工程打包部署的方法步驟

    maven多模塊工程打包部署的方法步驟

    本篇文章主要介紹了maven多模塊工程打包部署的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • SpringAop中AspectJ框架的切入點表達式

    SpringAop中AspectJ框架的切入點表達式

    這篇文章主要介紹了SpringAop中AspectJ框架的切入點表達式,AspectJ是一個基于Java語言的AOP框架,Spring2.0以后新增了對AspectJ切點表達式支持,@AspectJ 是AspectJ1.5新增功能,通過JDK5注解技術,允許直接在Bean類中定義切面,需要的朋友可以參考下
    2023-08-08

最新評論

江华| 宾阳县| 和静县| 长岭县| 贞丰县| 怀安县| 阜平县| 东台市| 杨浦区| 石城县| 满洲里市| 湘阴县| 蕉岭县| 美姑县| 桐柏县| 洛宁县| 太和县| 侯马市| 云龙县| 耒阳市| 乌兰县| 那坡县| 东城区| 武宣县| 霍城县| 荆州市| 米易县| 佛坪县| 新乡市| 文昌市| 左贡县| 盘锦市| 石台县| 茶陵县| 津市市| 聂拉木县| 桓台县| 青龙| 芦溪县| 德庆县| 稻城县|