【案例演示】JVM之強引用、軟引用、弱引用、虛引用

1.背景

想要理解對象什麼時候回收,就要理解到對象引用這個概念,於是有了下文

2.java中引用對象結構圖

3.引用詳解

3.1.什麼是強引用

a.當內存不足,JVM開始垃圾回收,對於強引用的對象,就算是出現了00M也不會對該對象進行回收,死都不收。

b.強引用是我們最常見的普通對象引用,只要還有強引用指向一個對象,就能表明對象還“活着”,垃圾收集器不會碰這種對象。

在Java中最常見的就是強引用,把一個對象賦給一個引用變量,這個引用變量就是一個強引用。

當一個對象被強引用變量引用時,它處於可達狀態,它是不可能被垃圾回收機制回收的,即使該對象以後永遠都不會被用到JVM也不會回收。

因此強引用是造成Java內存泄漏的主要原因之一

c.對於一個普通的對象,如果沒有其他的引用關係,只要超過了引用的作用域或者顯式地將相應(強)引用賦值為null,一般認為就是可以被垃圾收集的了〈當然具體回收時機還是要看垃圾收集策略)。

案例:

package com.wfd360.demo03GC.referDemo;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 12:12
 * @description
 */
public class StrongRefer {
    /**
     * 強引用的理解
     *
     * @param args
     */
    public static void main(String[] args) {
        Object obj1 = new Object();
        // 建立強引用
        Object obj2 = obj1;
        // 觀察obj1 和 obj2 的各種內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("obj2=" + obj2);
        // obj1創建可以回收的條件
        obj1 = null;
        // gc回收
        System.gc();
        // 觀察各對象情況
        System.out.println("obj1=" + obj1);
        System.out.println("obj2=" + obj2);
    }
}

View Code

 從測試結果課程看出,obj1的實際對象別沒有回收;

3.2.什麼是軟引用

a.軟引用是用來描述一些還有用但並非必需的對象,需要用java.lang.ref.SoftReference類來實現。

b.對於軟引用關聯着的對象,在系統將要發生內存溢出異常之前,將會把這些對象列進回收範圍之中進行第二次回收。如果這次回收還沒有足夠的內存,才會拋出內存溢出異常。在JDK1.2之後,提供了Soft Reference類來實現軟引用。

c.軟引用通常用在對內存敏感的程序中,比如高速緩存就有用到軟引用,內存夠用的時候就保留,不夠用就回收!

案例:

package com.wfd360.demo03GC.referDemo;

import java.lang.ref.SoftReference;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 12:12
 * @description
 */
public class SoftRefer {

    /**
     * 軟引用的理解
     * 通過設置jvm參數,在不同的條件下觀察
     *
     * @param -Xms5m -Xmx5m -XX:+PrintGCDetails
     * @param args
     */
    public static void main(String[] args) {
        // 測試內存充足(不回收軟引用)
        //testSoftReferNOGc();
        // 測試內存不充足(回收軟引用)
        testSoftReferGc();
    }

    /**
     * 模擬內存充足的情況
     */
    public static void testSoftReferNOGc() {
        Object obj1 = new Object();
        // 建立軟引用
        SoftReference softRefer = new SoftReference<>(obj1);
        // 觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
        // obj1創建可以回收的條件
        obj1 = null;
        // gc回收
        System.gc();
        // 再次觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
    }

    /**
     * 模擬內存不足
     * 1.設置較小的堆內存
     * 2.創建大對象
     * 3.jvm參
     * -Xms5m -Xmx5m -XX:+PrintGCDetails
     */
    public static void testSoftReferGc() {
        Object obj1 = new Object();
        // 建立軟引用
        SoftReference softRefer = new SoftReference<>(obj1);
        // 觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
        // obj1創建可以回收的條件
        obj1 = null;
        try {
            byte[] bytes = new byte[6 * 1024 * 1024];
        } catch (Throwable e) {
            System.out.println("===============>error:" + e.getMessage());
        } finally {
            // 再次觀察內存地址
            System.out.println("obj1=" + obj1);
            System.out.println("softRefer=" + softRefer.get());
        }
    }
}

View Code

內存充足測試結果:

 內存不充足測試結果:

 實際案例

假如有一個應用需要讀取大量的本地數據(圖片、通訊率、臨時文件等):

如果每次讀取數據都從硬盤讀取則會嚴重影響性能,

如果一次性全部加載到內存中又可能造成內存溢出。

此時使用軟引用可以解決這個問題。

設計思路是:用一個HashMap來保存數據的路徑和相應數據對象關聯的軟引用之間的映射關係,在內存不足時,

JVM會自動回收這些緩存數據對象所佔用的空間,從而有效地避免了00M的問題。

Map<String,SoftReference>imageCache=new HashMap<String,SoftReference>();

 3.3.什麼是弱引用

a.弱引用也是用來描述非必需對象的,但是它的強度比軟引用更弱一些,被弱引用關聯的對象只能生存到下一次垃圾收集發生之前。

b..當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象。在JDK1.2之後,提供廣Weak Reference類來實現弱引用。

c.弱引用需要用Java.lang.ref.WeakReference類來實現,它比軟引用的生存期更短.

案例:

package com.wfd360.demo03GC.referDemo;

import java.lang.ref.WeakReference;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 12:12
 * @description
 */
public class WeakRefer {

    /**
     * 弱引用的理解
     *
     * @param args
     */
    public static void main(String[] args) {
        Object obj1 = new Object();
        // 建立弱引用
        WeakReference softRefer = new WeakReference<>(obj1);
        // 觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
        // obj1創建可以回收的條件
        obj1 = null;
        // gc回收
        System.gc();
        // 再次觀察內存地址
        System.out.println("obj1=" + obj1);
        System.out.println("softRefer=" + softRefer.get());
    }

}

View Code

 擴展知識-WeakHashMap

查看API介紹:

 測試代碼:

package com.wfd360.demo03GC.referDemo;

import java.util.HashMap;
import java.util.WeakHashMap;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 5:10
 * @description <p>
 * 弱引用引用之:WeakHashMap
 * 以弱鍵 實現的基於哈希表的 Map。在 WeakHashMap 中,當某個鍵不再正常使用時,將自動移除其條目。
 * 更精確地說,對於一個給定的鍵,其映射的存在並不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終止,
 * 然後被回收。丟棄某個鍵時,其條目從映射中有效地移除,因此,該類的行為與其他的 Map 實現有所不同。
 * </p>
 */
public class WeakReferMap {
    /**
     * 測試 HashMap 與 WeakHashMap 區別
     * 測試邏輯:
     * 1.創建不同的map
     * 2.創建key  value值
     * 3.放入各自的map,並打印結果
     * 4.將key設置為null,並打印結果
     * 5.手動GC,並打印結果
     *
     * @param args
     */
    public static void main(String[] args) {
        hashMapMethod();
        System.out.println("--------華麗的分割線--------");
        weakHashMapMethod();
    }

    /**
     * HashMap測試(強引用)
     */
    private static void hashMapMethod() {
        HashMap<String, String> map = new HashMap<>();
        String key = "key1";
        String value = "HashMap-value";

        map.put(key, value);
        System.out.println(map);

        key = null;
        System.out.println(map);

        System.gc();
        System.out.println(map);
    }

    /**
     * 若引用(WeakHashMap測試)
     */
    private static void weakHashMapMethod() {
        WeakHashMap<String, String> map = new WeakHashMap<>();
        // 注意這裏的new一個字符串與直接寫key="key2"對測試結果是有區別的,詳細原因可以看之前講的內存分配
        String key = new String("key2");
        String value = "WeakHashMap-value";

        map.put(key, value);
        System.out.println(map);

        key = null;
        System.out.println(map);

        System.gc();
        System.out.println(map);

    }

}

View Code

測試結果:

 從測試結果可以看出:弱引用的map數據已經被回收。

 擴展知識-ReferenceQueue引用隊列

 代碼:

package com.wfd360.demo03GC.referDemo;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 7:23
 * @description
 */
public class QueueRefer {
    /**
     * 測試弱引用回收前,把數據放入隊列中
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Object obj1 = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue();
        // 當GC釋放對象內存的時候,會將引用加入到引用隊列
        WeakReference<Object> weakReference = new WeakReference<>(obj1, referenceQueue);

        System.out.println(obj1);
        System.out.println(weakReference.get());
        System.out.println(referenceQueue.poll());

        System.out.println("--------華麗的分割線--------");
        obj1 = null;
        System.gc();
        Thread.sleep(500);

        System.out.println(obj1);
        System.out.println(weakReference.get());
        System.out.println(referenceQueue.poll());
    }

}

View Code

採用弱引用的方式測試結果:

從測試結果可以看出,需要回收的對象已經進入隊列。

 採用軟引用的方式測試結果:

 從測試結果可以看出,軟引用,沒有到達回收的條件,並沒有進行回收,也不會進入隊列;

3.4.什麼是虛引用

1.虛引用需要java.lang.ref.PhantomReference類來實現。

2.與其他幾種引用都不同,虛引用並不會決定對象的生命周期。如果一個對象僅持有

虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收,它不能單獨使用也不能通過它訪

問對象,虛引用必須和引用隊列(ReferenceQueue)聯合使用。

3.虛引用的主要作用是跟蹤對象被垃圾回收的狀態。僅僅是提供了一種確保對象被finalize以後,做某些事情的

機制。PhantomReference的get方法總是返回null,因此無法訪問對應的引用對象。其意義在於說明一個對象己

經進入俑finalization階段,可以被gc回收,用來實現比finalization機制更靈活的回收操作。

4.設置虛引用關聯的唯一目的,就是在這個對象被收集器回收的時候收到一個系統通知或者後續添加

進一步的處理。Java技術允許使用finalize()方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。

代碼:

package com.wfd360.demo03GC.referDemo;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 7:44
 * @description
 */
public class PhantomRefer {
    /**
     * 虛引用測試
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Object obj1 = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue();
        PhantomReference<Object> phantomReference = new PhantomReference<>(obj1,referenceQueue);

        System.out.println(obj1);
        System.out.println(phantomReference.get());
        System.out.println(referenceQueue.poll());

        System.out.println("--------華麗的分割線--------");

        obj1 = null;
        System.gc();
        Thread.sleep(500);

        System.out.println(obj1);
        System.out.println(phantomReference.get());
        System.out.println(referenceQueue.poll());
    }

}

View Code

測試結果:

4.重要總結

對象是否存活判斷流程:

1.可達性分析,看是否有GC Roots的引用鏈,如果沒有將做第一次標記;

2.檢查是否需要執行finalize()方法,

如果沒必要(之前執行過了),直接回收內存;

如果要執行finalize()方法,這個時候對象如果再次建立引用鏈(唯一自救機會),對象不會被回收,否則直接回收;

總結:

1.對象回收滿足兩個條件:

a.沒有引用鏈。

b.回收前會執行finalize()方法,如果執行finalize(),沒有再次建立連接(如果重新與引用鏈上的任意對象建立連接,例如給對象賦值,該對象都不會被回收)

2.在gc回收前會執行finalize()方法,只執行一次,並且是異步執行不保證執行成功,線程優先級低

代碼演示:

package com.wfd360.demo03GC.referDemo;

/**
 * @author 姿勢帝-博客園
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 06/20 8:34
 * @description
 */
public class FinalizeGC {
    public static FinalizeGC obj1 = null;

    /**
     * 重寫finalize方法
     * @throws Throwable
     */
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("執行finalize方法");
        // 自救,在回收時建立引用鏈
        FinalizeGC.obj1 = this;
    }

    public static void main(String[] args) throws InterruptedException {
        obj1  = new FinalizeGC();

        obj1 = null;
        System.gc();
        Thread.sleep(600);
        System.out.println("第一次自救成功:"+obj1);

        obj1 = null;
        System.gc();
        Thread.sleep(600);
        System.out.println("第二次自救失敗,不會再次執行finalize方法:"+obj1);
    }
}

View Code

測試結果:

 完美!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

西門子檢討澳洲煤礦案 瑞典環保少女籲做對的事

摘錄自2020年01月11日中央通訊社澳洲報導

德國西門子公司(Siemens AG)即將公布是否參與協助一項澳洲煤礦開採計畫,瑞典環保少女童貝里今天(11日)呼籲西門子做出正確的決定。

童貝里(Greta Thunberg)今天在推特(Twitter)發文:「星期一(13日),他們(西門子)將宣布決定。請幫助他們做出唯一正確的決定。」環保人士憂心,繼續使用煤炭會導致二氧化碳排放量增加,二氧化碳則是造成全球暖化的相關氣體。

西門子公司表示,他們將於13日前決定,是否參與印度阿達尼電力公司(Adani Power)興建的煤礦場計畫。

澳洲相當依賴燃煤電廠,是全球人均碳排放量最高的國家之一。澳洲政府去年批准阿達尼電力公司在昆士蘭州(Queensland)興建新的煤礦場,這座煤礦場預計每年生產800萬至1000萬噸燃料用煤。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

雷諾因制動器隱患在歐洲召回約8000輛Twizy電動車

雷諾日前宣佈在歐洲市場召回大約8,000輛Twizy,原因是上述車輛制動器存在問題。

雷諾表示,部分Twizy電動車的制動液存在緩慢洩露的情況,原因可能是部分該車型在工廠進行組裝時,制動液的密封部件受到損壞。

雷諾日前就此問題向歐洲地區大約8,000名Twizy電動車的車主進行了通報,並建議車主將車輛送回經銷商處進行維修。

今年3月份雷諾向法國市場推出了Twizy電動車,並隨後將該車型投放至歐洲其它國家,該車型的概念車曾在2009年法蘭克福車展中首次亮相。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

廣汽首款混合動力車型傳祺亮相廣州車展

在此次廣州車展上,廣汽發佈了該品牌首款型傳祺混動版。

新車的外觀與普通版車型基本保持一致,只是車頭和車尾的LOGO採用了藍色底色以表明這款車與普通版車型的不同,另外前進氣格柵加入了更多鍍鉻裝飾條。

該車的混合動力技術為廣汽自主研發,新車已經進入國家的公務車採購目錄,預計公車採購將成為它的主要銷售份額。動力方面,混動版傳祺在驅動方式上將有兩驅和四驅可選,對應的百公里綜合油耗分別為7.5L/km和6.6L/km。汽油機方面,它搭載的1.8L發動機最大功率可達106kW(144PS),電動機方面的資訊還尚不明確。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

福汽集團投資8000萬元開展A級純電動轎車研發專案

福汽集團與榕籍院士郭孔輝共同建立福汽集團汽車工程研究院院士工作站,開展“A級純電動轎車研發”項目合作。該專案總投資8000萬元,預計可實現產值9億元。目前,該專案已被列為福建省“百項千億”專案及省科技廳2013年“863”儲備專案。

工作站將以福汽集團汽車工程研究院為依託,充分發揮以郭孔輝院士領銜的專家們多學科、多專業的學術優勢和豐富的從業經驗,進行多層次、寬領域的合作,為福汽集團在產業政策的消化、利用以及企業發展戰略和發展規劃的研究提供諮詢和服務,並為福汽集團、發動機、微車產品等領域的自主研發、技術創新提供指導和幫助。

 “A級純電動轎車研發”項目合作將在量產化純電動轎車的底盤換電系統、資訊交互系統、動力系統等核心技術方面展開系統研發。專案立足於福汽集團的整車開發優勢,同時聯合了吉林大學、同濟大學、東南汽車、新鄉新能公司等單位,組建聯合專案團隊共同開發。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

乾旱重創澳洲 夏季農作收成預估創新低

摘錄自2020年2月18日中央社報導

根據今天(18日)公布的澳洲官方預測,澳洲有史以來最熱和最乾旱的一年已經大幅削減農作收成,夏季產量預估將創下新低。

澳洲農業部表示,預估高粱、棉花及稻米等作物產量下滑66%,這是1980到1981年有紀錄以來最低的水準。

澳洲農業部統計單位農業資源經濟科學局(ABARES)資深經濟學家柯林斯(Peter Collins)告訴法新社:「這是夏季作物產量同期最低的一年,差距很大。」

澳洲大片農田受3年以上乾旱所苦。2019年降雨量低於1902年的歷史新低紀錄,平均氣溫比2013年的最高溫高出攝氏0.2度。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

首屆中國高新汽車國際峰會匯聚國內外行業領軍人物擔任演講嘉賓

 

首屆中國高新汽車國際峰會將於2012年12月11至13日與Automechanika Shanghai — 上海國際汽車零配件、維修檢測診斷設備及服務用品展覽會同期毗鄰舉行,邀請到來自德國、日本、馬來西亞、瑞典、台灣、英國及美國等地的國際級演講嘉賓匯聚一堂,交流理念。   本次峰會由中國國家發展和改革委員會國際合作中心與法蘭克福展覽(上海)有限公司聯合主辦,匯聚高端業界智囊,分享新技術與管理和產品創新戰略。會議將著重探討如何與汽車行業整個產業鏈上的原始設備製造商、供應商和服務商一起促進未來汽車產業發展,使整個行業更具可持續性,更有經濟效益。峰會將雲集逾百位行業高層決策者、政府部門和政府官員,以及來自權威學術研究機構的代表蒞臨出席。   法蘭克福展覽(香港)有限公司高級總經理曹建生先生表示:「我們很榮幸得到各位國內外演講嘉賓的大力支持。這些汽車行業的領軍人物或技術專家將與大家分享有關中國汽車業發展的各領域經驗及觀點,其中有多位嘉賓都是第一次在中國演講。」   中國國家發展和改革委員會國際合作中心的代表補充說:「本次峰會將討論對中國汽車行業實現可持續發展至關重要的一系列問題,並探討具有前景的解決方案,其中包括為未來汽車行業更智能、更清潔、更節能而制定的主要政策和工作重點,採用新業務模式和更好的協調的生態系統,以及在混合動力汽車、電動交通以及個人交通工具等領域的產品創新。」     國家主要部委、市政府部門、業內領先公司以及知名研究機構代表將在會上就中國在「十二五」期間發展汽車工業方面的進程及工作重點發表演講。參加本次峰會的相關領導包括有:  

  • 中國國家發展和改革委員會代表

主題演講:貫徹落實中國2011-2015十二五規劃新節能汽車產業發展的相關政策、優先重點及進程

  • 中國國家科技部原高新司副司長陳家昌先生

題目:中國節能及新能源汽車產業發展規劃的演變

  • 國務院發展研究中心副主任侯雲春先生

題目:多措並舉積極發展電動汽車

  • 中國國家科技部國家863計劃節能與新能源汽車重大項目辦公室副主任甄子建博士

題目:促進中國汽車行業的科技進步,提升行業競爭力並促進增長

  • 中國汽車流通協協會名譽會長徐秉金先生

題目:中國汽車市場的持續發展: 提升商品及服務水平以達致顧客期望

  • 上海市經濟和信息化委員會 – 新能源汽車推進辦公室副處長劉建華先生

題目:支持上海新能源汽車行業發展的政策、規劃與首要任務   主辦單位同樣邀請到來自海外多國的汽車行業領軍人物出席本次峰會,其中業界著名的演講嘉賓包括有:  

  • 瑞典ElBil2020項目副主席Allan Larsson先生

題目:瑞典ElBil項目將在2020年之前成為電動汽車應用的世界領導者

  • 德國電動車協會(BEM EV)行政總裁及市場部主管Christian Heep先生

題目:即將成為全球電力交通市場競爭者:歐洲在全球變革中的願景與事實

  • 美國高效動力傳動系統公司首席技術官,被譽為「插電式混合動力車之父」Andrew Frank博士

題目:電動出租車系統:適合中國城市,實用低價,延長行程

  • 馬來西亞汽車研究院(MAI)首席執行官 M. Madani Sahari 

題目:將馬來西亞轉化為節能汽車(EEV)國際樞紐

  • 英國GSMA互聯生活計劃mAutomotive項目總裁Francesca Forestieri女士

題目:加快內建汽車設備與移動連通性方案的開發與部署

  • 英國高通歐洲公司業務發展和市場營銷部副總裁,HaloIPT無線電源技術開創者Anthony Thomson博士

題目:無線充電——電氣化未來   如欲瞭解更多有關演講嘉賓及會議議程信息,敬請訪問官方網站 。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

日產電動車銷量破10萬台,明後年歐洲車市恐續縮

據Thomson Reuters報導,兼任日產汽車(Nissan)、法國雷諾(Renault SA)CEO職務的Carlos Ghosn近日表示,截至6月底,旗下電動車全球累計銷量已破10萬台大關。於今年在法國開賣的電動車「ZOE」目前則已在法國賣出3,000台以上、歐洲整體銷售量也達6,000台以上。

歐洲汽車製造商協會(ACEA)6月18日公佈的數據顯示,2013年5月歐盟27國新車掛牌數年減5.9%至104.27萬輛、創1993年同期以來新低;2013年1-5月歐盟27國新車掛牌數年減6.8%。

另據彭博報導指出,Carlos Ghosn表示,預估歐洲汽車市場於2014、2015年持續縮小的可能性很大,惟下滑幅度預估將不會像前幾年那般劇烈。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

800台比亞迪E6出租車 在深累計行程超1億公裡

8月15日,在2013年中國(深圳)國際公共交通科技博覽會上,比亞迪綠色公交發展事業部人員表示,E6出租車在深圳累計行駛裡程已超1億公裡。截至2013年7月底,在深圳投入的公交運營E6純電動出租車約為800台。

該人士表示,E6作為F3DM的升級版,最大的亮點在於採用了電力驅動,其動力電池和啟動電池均採用比亞迪自主研發生產的eT-POWeR鐵電池。

E6還分為個人消費者版和出租車版,其中個人版市場有待培育,將是比亞迪銷售部門下半年的工作重點。E6出租車目前推廣順利,年初制定的計劃推廣城市現在基本已經打開。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

Golang簡易入門教程——面向對象篇

本文始發於個人公眾號:TechFlow,原創不易,求個關注

今天是golang專題的第9篇文章,我們一起來看看golang當中的面向對象的部分。

在現在高級語言當中,面向對象幾乎是不可或缺也是一門語言最重要的部分之一。golang作為一門剛剛誕生十年的新興語言自然是支持面向對象的,但是golang當中面向對象的概念和特性與我們之前熟悉的大部分語言都不盡相同。比如Java、Python等,相比之下, golang這個部分的設計非常得簡潔和優雅(仁者見仁),所以即使你之前沒有系統地了解過面向對象,也沒有關係,也一定能夠看懂。

常見的面向對象的部分,比如繼承、構造函數、析構函數,這些內容在golang當中統統沒有,因此整體的學習成本和其他的語言比起來會更低一些。

struct

在golang當中沒有類的概念,代替的是結構體(struct)這個概念。我們可以給結構體類型定義方法,為了表明該方法的適用對象是當前結構體,我們需要在方法當中定義接收者,位於func關鍵字和方法名之間。

我們一起來看一個例子:

type Point struct {
 x int
 y int
}

func (p Point) Dis() float64 {
 return math.Sqrt(float64(p.x*p.x + p.y*p.y))
}

在上面這段代碼當中我們定義了一個叫做Point的結構體,以及一個面向這個結構體的方法Dis。我們一個一個來看它們的語法。

對於結構體來說,我們通過type關鍵字定義。在golang當中type關鍵字的含義是定義一個新的類型。比如我們也可以這樣使用type:

type Integer int

它的含義是從int類型定義了一個新的類型Integer,從此之後我們可以在後序的代碼當中使用Integer來代替int。它有些類似於C++當中的typedef,結合這個含義,我們再來看結構體的定義就很好理解了。其實是我們通過struct關鍵字構造了一個結構體,然後使用type關鍵字定義成了一個類型。

之後我們創建了一個面向結構體Point的函數Dis,這個函數和我們之前使用的函數看起來並沒有太多的不同,唯一的區別在於我們在func和函數名之間多了一個(p Point)的定義。這其實是定義這個函數的接收者,也就是說它接受一個結構體的調用。

不僅如此,我們可以給golang當中的任何類型添加方法,比如:

type Integer int

func (a Integer) Less(b Integer) bool {
 return a < b
}

在這個例子當中,我們給原生的int類型添加了Less這個方法,用來比較大小。我們在添加方法之前使用type給int起了一個別名,這是因為golang不允許給簡單的內置類型添加方法,並且接收者的類型定義和方法聲明必須在同一個包里,我們必須要使用type關鍵字臨時定義一個新的類型。這裏要注意的是,雖然我們定義出來的Integer和int的功能完全一樣,但是它們屬於不同的類型,不能互相賦值。

和別的語言比較起來,這樣的定義的一個好處就是清晰。舉個例子,比如在Java當中,同樣的功能會寫成不同的樣子:

class Integer {
    private int val;
    public boolean less(Integer b) {
        return this.val < b.val;
    }
}

對於初學者而言,可能會覺得困惑,less函數當中的這個this究竟是哪裡來的?其實這是因為Java的成員方法當中隱藏了this這個參數,這一點在Python當中要稍稍清晰一些,因為它將self參數明確地寫了出來:

class Integer:
    def __init__(self, val):
        self.val = val
    def less(self, val):
        return self.val < val.val

而golang明確了結構體函數的接收者以及參數,顯得更加清晰。

指針接收者

golang當中,我們也可以將函數的接收者定義成指針類型

比如我們可以將剛才的函數寫成這樣:

type Point struct {
 x int
 y int
}

func (p *Point) Dis() float64 {
 return math.Sqrt(float64(p.x*p.x + p.y*p.y))
}

指針接收者和類型接收者在使用上是一樣的,我們並不需要將結構體轉化成指針類型,可以直接進行調用。golang內部會自己完成這個轉化:

func main() {
 p := Point{3, 4}
 fmt.Print(p.Dis())
}

那麼這兩者的區別是什麼呢?我們既然可以定義成普通的結構體對象,為什麼還要有一個指針對象的接收者呢?

其實很好理解, 兩者的區別有些類似於C++當中的值傳遞和引用傳遞。在值傳遞當中,我們傳遞的是值的一個拷貝,我們在函數當中修改參數並不會影響函數外的結果。而引用傳遞則不然,傳遞的是參數的引用,我們在函數內部修改它的話,會影響函數外的值。

也就是說在golang當中,如果我們函數接收的是一個指針類型,我們可以在函數內部修改這個結構體的值。否則的話,傳入的是一個拷貝,我們在其中修改值並不會影響它本身。我們來看個例子:

func (p *Point) Modify() {
 p.x += 5
 p.y -= 3
}

func main() {
 p := Point{3, 4}
 p.Modify()
 fmt.Print(p)
}

上面這段代碼當中函數的接收者是一個指針,所以我們得到的結果會是{8, 1},如果我們把指針去掉,改成普通的值接收的話,那麼最後的結果仍然是{3, 4}。

總結

我們今天學的內容有些多,我們來簡單梳理一下。首先,我們了解了通過type和struct關鍵字來定義一個結構體,結構體是golang當中面向對象的載體,golang拋棄了傳統的面向對象的實現方式和特性,擁有自己的面向對象的理念。

對於結構體來說,我們可以把它當做是接受者傳遞給一個函數,使得我們可以以類似調用類當中方法的形式來調用一個函數。並且對於函數而言,接受者除了值以外還可以是一個指針。如果是指針的話,當我們對結構體值進行修改的時候,會影響到原值。即使我們定義的接收者類型是指針,我們在調用的時候也不必显示將它轉化成結構體指針,golang當中會自動替我們完成這樣的轉化。

面向對象部分可以說是golang這一門語言當中最大的創新之一,也正是因為拋棄了傳統的類以及繼承、派生的概念,使得golang當中的面向對象語法糖相對簡潔。也因此有人將golang稱為升級版的C語言。雖然我們啰啰嗦嗦寫了很多,但是實際談到的內容並不多,我想理解起來也不會特別困難。

今天的文章到這裏就結束了,如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。

本文使用 mdnice 排版

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心