特斯拉出貨不順,第二季交車輛不如預期

全球電動車龍頭廠商特斯拉(Tesla)雖然討論度極高,旗下各款電動車產品的訂單量也大,但交車量卻不如預期,已是連續第三季度挑戰交車目標失敗。

相關報導指出,特斯拉今年第二季交車量合計約14,370輛,不只低於原先預期的17,000輛,也比第一季的14,810輛還少了3%左右。這已是特斯拉連續第三季實際交車量低於目標。

特斯拉表示,交車量不如預期的原因是因為產能擴張太快、且電動休旅車Model X生產延誤。特斯拉亦表示,目前仍有約5,150輛車正在運送途中,預計在第三季初陸續交付客戶,並將計入第三季交車量。

為供應大量訂單,特斯拉近期積極擴產,預計今年下半年共可交車5萬輛;但全年預計7.9萬輛的交車量,仍將低於原先預期的8~9萬輛。今年稍早,特斯拉執行長Elon Musk曾表示要在2018年前將年產能提高至50萬輛;但近期的出貨狀況再次引發市場懷疑。

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

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

電動巴士開上阿里山!政府續推電池在地生產

知名台灣旅遊景點阿里山森林遊樂區交通運輸再突破!在地遊覽車業者加成交通引入電動巴士作為遊園車使用,可克服高海拔、高濕度、低溫等環境問題穩定運轉。

繼太魯閣、日月潭等觀光名勝之後,阿里山也於去年開始陸續採用電動巴士作為交通運輸方案,排氣與噪音汙染都能減輕。加成交通董事長鄭榮華表示,自從公司開始接觸政府標案後,陸續引入電動巴士車隊;巴士在前一晚充飽電後,白天可以行使一整天,一年多來未發生故障的問題。

經濟部:推動生產在地化

阿里山電動巴士車隊有三分之二零件於台灣在地生產,包括動力系統馬達與控制器;且成功行駛經驗證實台產電動巴士的品質穩定,未來10年內希望能在全台投入一萬輛電動巴士。

經濟部工業局智慧電動車辦公室主任王正健指出,目前電動巴士在地化生產比例已達67%,希望明年能達到70%,關鍵是電池技術的進步。電動車用電池在車輛加速時,需有瞬間大量放電的功能,與台灣所擅長的筆電、手機電池等產品性質有別。

目前,台灣已有本地業者開始生產電池模組,但電池芯多向日本、南韓、中國大陸進口,希望能推動在地研發電池芯,並進一步落實電動巴士的在地化生產。電動車搭載的電池亦可整合智慧電網,作為儲能設備來使用。

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

彰化縣祭出電動機車補助,加速改善空氣品質

彰化縣長年受空污所苦,縣府為改善空氣品質,祭出最高新台幣1.9萬元的電動機車購車補助,希望能加速淘汰縣內2.5萬輛老舊機車改用電動車,以減輕空污排放。

彰化縣環保局統計,縣內目前領牌機車共有81.4萬輛,其中有約24.9萬輛是出廠超過12年的二行程老車,空污影響相當大。環保局為減輕PM2.5排放,推出多項補貼措施,目標在今年汰換2.5萬輛老車改用電動車。若能完成目標,每年可減少13公噸PM2.5排放,對縣內空氣環境改善大有助益。

縣府推出的補貼措施依照汰換產品與新購置的電動機車有所不同。汰換二行程機車補貼新台幣1,500元,汰換舊車後新購機車,小型與輕型再補助16,300元、換購重型電動機車則補助19,100元,相當於新車價格的三分之一。

今年前半年,彰化民眾已汰換12,806輛二行程機車,民眾反映普遍良好。但也有民眾希望政府進一步補助電池更換的費用。

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

鴻海電動車團隊成軍,2020年推出新車款

中國騰訊集團、和諧汽車與台灣背景的鴻海集團共同成立電動車商產生Future Mobility,並預計在今年第三季完成首輪融資、陸續增聘人手,計畫在2020年前推出旗下首款智能電動車。

外媒報導,Future Mobility的聯合創始人暨營運長Daniel Kirchert挖角自中國Infiniti。Kirchert打算將公司員工從目前的50人擴增到明年底的600人規模,並表示將在中國大陸生產旗下電動車。公司亦正與中國與香港上市公司商討融資,預計在第三季就會完成首輪融資,未來也會考慮與歐美投資者合作。

Future Mobility是鴻海、騰訊、和諧汽車於2015年共同成立的電動車公司「和諧富騰」旗下之新創公司。和諧富騰由騰訊、鴻海分別持股29.4%,其餘由和諧汽車持股,致力於推動「互聯網+智能電動車」,並已從BMW借將Carsten Breitfeld擔任CEO。

新車價格與Audi A4、BMW i3相等

Kirchert指出,Future Mobility的首輛智能電動車款預計最晚將在2020年亮相,初步規劃定價為30萬元人民幣左右,約與Audi A4、BMW i3同一等級。新車將在中國大陸生產,但目前還未決定要自建廠房或與其他車廠合作。

另一方面,富士康、騰訊、和諧汽車以簽署協議,將在鄭州投資人民幣10億元成立公司,以布局智慧電動車級互聯網相關專案工作。

鴻海除積極入主電動車事業之外,和諧汽車亦於去年底取得河南和諧旗下鋰電池汽車公司綠野汽車之55%股權給和諧富騰,鴻海相當於間接掌握里電池電動車的事業。加上鴻海已在鄭州、杭州、北京布局新能源汽車租賃服務,從鋰電池到電動車事業皆已有策畫。

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

電動車需求看好,2016年美國銷量可達20萬輛

電動車市場越趨火熱,在許多國家甚至能經常撞見電動車在街頭奔走。根據美國市場研究機構Navigant Research 近日發布的研究指出,預計從2016 年起,美國電動車市場每年將成長62%,而今年銷量可望達到近20 萬台。

Navigant Research 指出,定價低於4 萬美元的長程純電動車(BEVs),舉例來說,定價3.7 萬美元、預計於今年秋季上市的雪佛蘭(Chevrolet)Bolt 車款,將是造成電動車市場成長的關鍵。此外,特斯拉(Tesla)的純電動車Model X,以及雪佛蘭Volt 、豐田(Toyota)的Prius Prime 與即將推出的三菱(Mitsubishi)Outlander 等插電式混合動力汽車(PHEV),都將引爆美國市場對電動車需求的熱潮。

隨著電動車續航力提高、定價逐漸下滑,加上各家車廠紛紛加入這塊兵家之地,使消費者購買電動車的選擇相對變多,對於消費者來說,現階段要購買一台好用的電動車變得容易許多。2015 年時,就已有9 種不同的電動車種類,從2 人座到標準運動休旅車(SUV)大小的種類都有,而當年度所售出的插電式電動車中,約6 成為如日產(Nissan)Leaf 與特斯拉Model S 等中型或大型車款。

Navigant Research 與美國能源部認為,插電式電動車市場真正開啟是在2011 年,當時僅有4 種車款可供選擇,而現在,從純電動小車Fiat 500e 到富豪(Volvo)XC90 插電式混合動力車,一共有29 種車款可供選擇。

2011 年至今,電動車銷量已從當年的2 萬台,增加到12 萬台,等於成長了6 倍,不過,若以全美的車輛銷售量來看,這個數字依然只占了美國車輛銷量不到1%,就且待Navigant Research 對於電動車2016 年的銷量預測是否真能達標了。

(本文授權自《》──〈〉。照片來源:shared by CC 2.0)

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

三星投資比亞迪,傳砸美金5億取得4%股權

中國電動車市場蓬勃,海外投資也躍躍欲試。市場傳出南韓三星電子的中國分公司將參與中國最大的電動車廠商比亞迪(BYD)增資,投資人民幣30億元(約美金5億元)取得比亞迪的4%股權。

《韓國經濟日報》、《日經》等媒體指出,三星電子於7月15日發布消息,指出將投資人民幣30億元取得比亞迪的4%股權。但比亞迪於同日下午否認三星的投資金額。

中國最大電動車廠,比亞迪大發利市

比亞迪以電動車、油電混和車等新能源車產品,於2015年搶下61,772輛的銷售佳績,銷售額達人民幣776億元。在中國,比亞迪亦有30%左右的市占率,且在中央政府持續推動電動車的動能下,比亞迪2016年提出銷量倍增的目標,對零組件的需求也跟著增加。

比亞迪成立於1995年,除電動車事業外,亦有一般汽車、IT產業、新能源產業等相關事業群。目前,比亞迪所使用的車用電池主要皆為自主生產,使比亞迪成為中國目前少數可整合新能源發電、儲能系統、電動車事業的公司之一。

三星積極佈局電動車市場

三星集團對電動車市場的布局行動頻頻。2015年12月,三星電子成立「電裝事業組」,致力於生產次世代汽車零組件,例如:車載半導體、電池、顯示器等。無人駕駛車與聯網汽車也是此事業組的發展方向。

三星表示,本次對比亞迪的投資主要是提高資本業務、零組件供應方面的合作,以搶攻中國正要起飛的電動車市場。但三星也強調不會涉入比亞迪的經營,純屬財務投資。

除了注資比亞迪外,三星旗下的三星SDI也與中國逆變器廠商陽光電源(Sungrow)於合肥投資儲能系統廠,年產能2,000MWh,第一期已於日前投產。此外,三星SDI也曾申請中國工信部的電動車車用電池補助名單,但鎩羽而歸。若要搶攻中國市場,與中國本地企業合作是必須採取的行動。

三星並非第一個入股比亞迪的外資,美國股神巴菲特所擁有的投資公司Berkshire Hathaway曾在2008年取得比亞迪近10%股權,成為一大股東。除此之外,美商蘋果公司在5月12日宣布砸下10億美元投資中國叫車服務公司「滴滴打車」,為三星帶來了中國市場的競爭壓力。

(照片:比亞迪新能源車「元」。來源:)

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

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

上海市半年內推出八項新能源汽車政策

2016上半年,中國與新能源汽車相關的中央及地方各類政策已經推出了80餘項,包括新能源汽車及充電基礎設施推廣規劃、補貼標準、充電費、充電服務費標準、專項資金補貼、及指標交通等配套優惠政策。雖然政策密集,但2016上半年新能源汽車產業的發展依然掣肘於政策的完善性。   2016年上半年,上海市共推出了8項新能源汽車相關政策,包括購買和使用新能源汽車暫行辦法、操作流程、補貼標準,充電基礎設施建設規劃、補貼標準,新能源汽車專項資金,支援新能源貨車推廣計畫,促進新能源汽車分時租賃業務發展指南,以及嘉定區補貼方案。這些政策在內容上覆蓋了從生產、銷售、購買、使用整個新能源汽車生產鏈,也對技術研發給予專項資金的鼓勵支援,同時覆蓋了新能源汽車的分時租賃業務。   相對比2015年上海市新能源汽車的補貼標準,2016年上海的補貼標準在乘用車、客車及專用車領域都有所消退,同時,上海市還首次提出了補貼「按量退坡(減少)」的概念,即超過一定量後補貼會繼續減少,這體現了上海由補貼向市場引導新能源汽車發展的策略。除了補貼標準的降低外,上海市對補貼的審批也更加嚴格,對廠商的銷售資格及消費者的購買資格都做出了嚴格要求。   除此之外,上海市的推廣政策還照顧到了分時租賃業務,通過支持運營車輛額度需求及相關補貼政策鼓勵新能源汽車分時租賃業務發展。  
文章來源:第一電動網(中國大陸)

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

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

Tesla:自動駕駛未來十年可實現

Tesla 電動車在自動駕駛模式下發生致命車禍,讓自動駕駛技術的前景蒙上了一層陰影,Tesla 聯合創辦人兼CTO JB Straubel 近日在某論壇演講時表示,Tesla 對於產品和技術充滿信心,外界的批評不會對公司內部造成太大影響,未來十年內一定會實現自動駕駛。

JB Straubel 表示Tesla 關注的是如何提高交通的效率,能源的可持續利用,降低交通運行的過程中二氧化碳的排放量,這是Tesla 的目標。目前Tesla 推出了Model S、Model X 和Model 3 三款電動車,這三款產品市場定位是高階轎車、SUV 和平價車,在2016年下半年開放預售的Model 3 預售量已經超過了40 萬台。為了提升電動車系統的性能和便利性,Tesla 還推出了電動車軟體系統,透過不斷更新軟體來實現電動車在短週期內的升級,許多新的功能都是透過軟體的推送提供給車主。

對於近日Tesla 電動車發生的車禍和引發的質疑,JB Straubel 認為這不會給Teals 帶來太大的影響,公司剛剛成立的時候,質疑和批評的聲音也很多,但是Tesla 的團隊對於產品和技術充滿信心,外界的評價不是很重要,每個人對於同一個技術或產品的看法不同很正常,Tesla CEO Elon Musk 在電動車的研發上投入了巨大的成本,成功的幾率並不大,但是仍值得去努力,新創公司從事的業務失敗的概率很大,但不能因此失去信心,融資的目的不僅僅是為了讓公司繼續運營下去,Tesla 只會選擇自己需要的錢。Tesla 關注的技術主要有三個方向,分別是電池技術、二是汽車電子。

對於自動駕駛技術而言,軟體和系統的開發需要投入大量的人力,JB Straubel 認為技術發展的速度很快,未來十年自動駕駛一定會實現。

(本文授權自《》──〈〉。圖片來源:wikipedia)

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

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

騙補者或被取消資質 新能源補貼新政欲出

中國新能源汽車騙補事件結果即將出爐。日前,國務院方已經就新能源汽車推廣應用督查報告作出批示,要求嚴肅懲處市場騙補行為,同時完善相關補貼制度。  
 
部分騙補車企或被取消資質 今年初,部分車企被爆造假資料,騙取中國國家財政補貼,形成了新能源汽車騙補產業鏈,引起外界一片譁然。隨後,工信部、財政部、科技部以及 發改委聯合發佈《關於開展新能源汽車推廣應用核查工作的通知》,通過自查與現場督查的方式,調查全部車輛生產企業以及新能源汽車運營企業(含公交、客運、專用車等)、租賃企業、企事業單位等新能源汽車用戶,全面核查財政資金使用及管理情況、新能源汽車生產與使用情況。   目前,中國界定騙補和違規謀補方式主要有三種,包括車輛未達到推廣標準甚至未生產,違規取得牌照騙取補貼;車輛符合規定,但賣給關聯企業而非終端使用者,未達到補貼條件提前謀取補貼;車輛賣給終端使用者,但在獲取補貼後大量閒置,造成財政資金嚴重浪費。   同時,根據車企的違規情節採取不同的措施,包括取消財政補貼資格,追回補貼資金、罰款、取消汽車生產資質,將問題車型從推薦車型目錄中剔除,等等。  
新一輪補貼政策即將推出 目前,按照中’國的補貼政策,新能源汽車補貼分為國家補貼和地方補貼兩大類,而大部分新能源汽車示範推廣城市的地方補貼標準與國家1:1配比。高額的政策性補貼,不僅成為了新能源生產企業的主要利潤來源,也是新能源汽車推廣的重要動力。   分析人士指出,打擊騙補為未來新能源車發展奠定較好的補貼環境基礎。而出臺更為完善的政策,將是新能源汽車未來可持續性發展的關鍵,才能讓大市場刺激強勢產品和讓優秀企業脫穎而出。   據悉,隨著騙補調查結果的出爐,新一輪的新能源補貼政策也將隨之出爐。  
文章來源:南方日報(中國大陸)

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

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

類加載器 – 類的加載、連接與初始化

類的加載、連接與初始化

概述

在Java代碼中,類型的加載、連接與初始化過程都是在程序運行期間完成的

  • 類型:可以理解為一個class
  • 加載:查找並加載類的二進制數據,最常見的情況是將已經編譯完成的類的class文件從磁盤加載到內存中
  • 連接:確定類型與類型之間的關係,對於字節碼的相關處理
    • 驗證:確保被加載的類的正確性
    • 準備:為類的靜態變量分配內存,並將其初始化為默認值。但是在到達初始化之前,類變量都沒有初始化為真正的初始值
    • 解析:在類型的常量池中尋找類、接口、字段和方法的符號引用,把這些符號引用轉換為直接引用的過程
  • 初始化:為類的靜態變量賦予正確的初始值
  • 使用:比如創建對象,調用類的方法等
  • 卸載:類從內存中銷毀

理解:public static int number = 666;

上面這段代碼,在類加載的連接階段,為對象number分配內存,並初始化為0;然後再初始化階段在賦予正確的初始值:666

類的使用方式

Java程序對類的使用方式可分為兩種

  • 主動使用
    • 創建類的實例
    • 訪問某個類或接口的靜態變量,或者對靜態變量賦值
    • 調用類的靜態方法
    • 反射
    • 初始化類的子類
    • Java虛擬機啟動時被標明為啟動類的類(包含main方法)
    • JDK1.7開始提供的動態語言支持(java.lang.invoke.MethodHandle實例的解析結果REF_getStatic,REF_putStatic,REF_invokeStatic句柄對應的類沒有初始化,則初始化)
  • 被動使用
    • 除了主動使用的七種情況之外,其他使用Java類的方法都被看作是對類的被動使用,都不會導致類的初始化

所有的Java虛擬機實現必須在每個類或接口被Java程序“首次主動使用”時才初始化他們

代碼理解

示例一:類的加載連接和初始化過程

代碼一

public class Test01 {
    public static void main(String[] args) {
        System.out.println(Child01.str);
    }
}

class Father01 {
    public static String str = "做一個好人!";
    static {
        System.out.println("Father01 static block");
    }
}

class Child01 extends Father01 {
    static {
        System.out.println("Child01 static block");
    }
}

運行結果做一個好人!

Father01 static block
做一個好人!

代碼二

public class Test01 {
    public static void main(String[] args) {
        System.out.println(Child01.str2);
    }
}

class Father01 {
    public static String str = "做一個好人!";

    static {
        System.out.println("Father01 static block");
    }
}

class Child01 extends Father01 {
    public static String str2 = "做一個好人!";
    static {
        System.out.println("Child01 static block");
    }
}

運行結果

Father01 static block
Child01 static block
做一個好人!

分析:

  • 代碼一中,我們通過子類調用父類中的str,這個str是在父類被定義的,對Father01主動使用,沒有主動使用Child01,故Child01的靜態代碼塊沒有執行,父類的靜態代碼塊被執行了。 -> 對於靜態字段來說,只有直接定義了該字段的類才會被初始化。
  • 代碼二中,對Child01主動使用;根據主動使用的7種情況,調動類的子類時,其所有的父類都會被先初始化,所以Father01會被初始化。 -> 當一個類初始化時,要求其父類全部都已經初始化完畢了。

以上驗證的是類的初始化情況,那麼如何驗證類的加載情況呢,可以通過在啟動的時候配置虛擬機參數:-XX:+TraceClassLoading查看

運行代碼一,查看輸出結果,可以看見控制台打印了very多的日誌,第一個加載的是java.lang.Object類(不管加載哪個類,他的父類一定是Object類),後面是加載的一系列jdk的類,他們都位於rt包下。往下查看,可以看見Loaded classloader.Child01,說明即使沒有初始化Child01,但是程序依然加載了Child01類。

[Opened /usr/local/jdk1.8/jre/lib/rt.jar]
[Loaded java.lang.Object from /usr/local/jdk1.8/jre/lib/rt.jar]
...
[Loaded java.lang.Void from /usr/local/jdk1.8/jre/lib/rt.jar]
[Loaded classloader.Father01 from file:/home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/]
[Loaded classloader.Child01 from file:/home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/]
Father01 static block
做一個好人!
[Loaded java.lang.Shutdown from /usr/local/jdk1.8/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /usr/local/jdk1.8/jre/lib/rt.jar]

拓展:JVM參數介紹

因為前一章節使用了JVM參數,所以對其做一下簡單的介紹

  • 所有的JVM參數都是以-XX:開頭的
  • 如果形式是:-XX:+<option>,表示開啟option選項
  • 如果形式是:-XX:-<option>,表示關閉option選項
  • 如果形式是:-XX:<option>=<value>,表示將option選項的值設置為value

示例二:常量的本質含義

public class Test02 {
    public static void main(String[] args) {
        System.out.println(Father02.str);
    }
}

class Father02{
    public static final String str = "做一個好人!";

    static {
        System.out.println("Father02 static block");
    }
}

執行結果

做一個好人!

分析

可以看見,此段代碼並沒有初始化Father02類。這是因為final表示的是一個常量,在編譯階段常量就會被存入到調用這個常量的方法所在的類的常量池當中,本質上,調用類並沒有直接引用到定義常量的類,因此並不會觸發定義常量的類的初始化。在本代碼中,常量str會被存入到Test02的常量池中,之後Test02與Father02沒有任何關係,甚至可以刪除Father02的class文件。

我們反編譯一下Test02類

Compiled from "Test02.java"
public class classloader.Test02 {
  public classloader.Test02();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #4                  // String 做一個好人!
       5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

第一塊是Test02類的構造方法,第二塊是我們要看的main方法。可以看見3: ldc #4 // String 做一個好人!,此時這個值已經是確定無疑的做一個好人!了,而不是Father02.str,證實了上面說的在編譯階段常量就會被存入到調用這個常量的方法所在的類的常量池當中

拓展:助記符

因前一章節涉及到了助記符,所以介紹下本章節涉及到的助記符及擴展

  • ldc:表示將int、float或String類型的常量值常量池中推送至棧頂
  • bipush:表示將單字節(-128 -至 127)的常量推送至棧頂
  • sipush:表示將一個短整形(-32768 至 32767)的常量推送至棧頂
  • iconst_1:表示將int類型的1推送至棧頂(這類助記符只有iconst_m1 – iconst_5七個)

示例三:編譯期常量與運行期常量的區別

public class Test03 {
    public static void main(String[] args) {
        System.out.println(Father03.str);
    }
}

class Father03 {
    public static final String str = UUID.randomUUID().toString();

    static {
        System.out.println("Father03 static block");
    }
}

運行結果

Father03 static block
a60c5db4-2673-4ffc-a9f0-2dbe53fae583

分析

本代碼與示例二的區別在於str的值是在運行時確認的,而不是編譯時就確定好的,屬於運行期常量,而不是編譯期常量。當一個常量的值並非編譯期間確定的,那麼其值就不會被放到調用類的常量池中,這時在程序運行時,會導致主動使用這個常量所在的類,導致這個類被初始化。

示例四:數組創建本質

代碼一

public class Test04 {
    public static void main(String[] args) {
         Father04 father04_1 = new Father04();
        System.out.println("-----------");
        Father04 father04_2 = new Father04();
    }
}

class Father04 {
    static {
        System.out.println("Father04 static block");
    }
}

運行結果

Father04 static block
-----------

分析

  • 創建類的實例時,會初始化類
  • 所有的Java虛擬機實現必須在每個類或接口被Java程序“首次主動使用”時才初始化他們

代碼二

public class Test04 {
    public static void main(String[] args) {
        Father04[] father04s = new Father04[1];
        System.out.println(father04s.getClass());
    }
}

運行結果

class [Lclassloader.Father04;

分析

  • 創建數組對象不再主動使用的7種情況內,屬於被動使用,故不會初始化Father04
  • 打印father04s的類型為[Lclassloader.Father04,這是虛擬機在運行期生成的。 -> 對於數組示例來說,其類型是有JVM在運行期動態生成的,表示為[Lclassloader.Father04這種形式,動態生成的類型,其父類就是Object。
  • 對於數組來說,JavaDoc經常將構成數組的元素為Component,實際上就是將數組降低一個維度后的類型

反編譯一下:

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: anewarray     #2                  // class classloader/Father04
       4: astore_1
       5: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       8: aload_1
       9: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      12: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      15: return
  • anewarray:表示創建一個引用類型(如類、接口、數組)的數組,並將其引用值值壓入棧頂
  • newarray:表示創建一個指定的原始類型(如int、float、char等)的數組,並將其引用值壓入棧頂

示例五:接口的加載與初始化

代碼一

public class Test05 {
    public static void main(String[] args) {
        System.out.println(Child05.j);
    }
}

interface Father05 {
    int i = 5;
}

interface Child05 extends Father05 {
    int j = 6;
}

運行結果

6

分析

  • 接口中定義的常量本身就是public、static、final的
  • 結果顯而易見,這時我們刪除掉Father05.class文件和Child05.class文件,程序依然可以正常運行
    • 接口中的常量本身就是final常量,會被加載到Test05的常量池中
    • 此時,Father05和Child05都不會被加載

代碼二

public class Test05 {
    public static void main(String[] args) {
        System.out.println(Child05.j);
    }
}

interface Father05 {
    int i = 5;
}

interface Child05 extends Father05 {
    int j = new Random().nextInt(8);
}

運行結果

6

將Father05.class文件刪除,運行結果

Exception in thread "main" java.lang.NoClassDefFoundError: classloader/Father05
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at classloader.Test05.main(Test05.java:15)
Caused by: java.lang.ClassNotFoundException: classloader.Father05
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 13 more

分析

  • 只有在真正使用到父接口的時候(如引用接口中所定義的常量時),才會加載初始化

代碼三

public class Test05 {
    public static void main(String[] args) {
        System.out.println(Child05.j);
    }
}

interface Father05 {
    Thread thread = new Thread() {
        {
            System.out.println("Father05 code block");
        }
    };
}

class Child05 implements Father05 {
    public static int j = 8;
}

運行結果

8

分析

  • 在初始化一個類時,並不會先初始化他所實現的接口

代碼四

public class Test05 {
    public static void main(String[] args) {
        System.out.println(Father05.thread);
    }
}

interface GrandFather {
    Thread thread = new Thread() {
        {
            System.out.println("GrandFather code block");
        }
    };
}

interface Father05 extends GrandFather{
    Thread thread = new Thread() {
        {
            System.out.println("Father05 code block");
        }
    };
}

運行結果

Father05 code block
Thread[Thread-0,5,main]

分析

  • 在初始化一個接口時,並不會先初始化他的父接口

示例六:類加載器準備階段和初始化階段

代碼一

public class Test06 {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();

        System.out.println("i:" + Singleton.i);
        System.out.println("j:" + Singleton.j);
    }
}

class Singleton {
    public static int i;

    public static int j = 0;

    private static Singleton singleton = new Singleton();

    private Singleton() {
        i ++;
        j ++;
    }

    public static Singleton getInstance() {
        return singleton;
    }
}

運行結果

i:1
j:1

分析

首先Singleton.getInstance();進入SingletongetInstance方法,getInstance會返回Singleton的實例,Singleton的實例是new Singleton();出來的,因此調用了自定義的私有構造方法。在調用構造方法之前,給靜態變量賦值,i默認賦值為0,j顯式的賦值為0,經過構造函數之後,值都為1。

代碼二

public class Test06 {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();

        System.out.println("i:" + Singleton.i);
        System.out.println("j:" + Singleton.j);
    }
}

class Singleton {
    public static int i;

    private static Singleton singleton = new Singleton();

    private Singleton() {
        i ++;
        j ++;
    }

    public static int j = 0;

    public static Singleton getInstance() {
        return singleton;
    }
}

運行結果

i:1
j:0

分析

程序主動使用了Singleton類,準備階段對類的靜態變量分配內存,賦予默認值,下面給出類在連接及初始化階段常量的值的變化

  • i : 0
  • singleton:null
  • j : 0
  • getInstance:初始化
    • i:0
    • singleton:調用構造函數
      • i:1
      • j:1
    • j:0【覆蓋了之前的1】

故返回的值i為1,j為0

深入解析類的加載、連接與初始化

類的加載

  • 將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後再內存中創建一個java.lang.Class對象(規範並未說明Class對象位於哪裡,HotSpot虛擬機將其放在了方法區中)用來封裝類在方法區的數據結構
  • 加載.class文件的方式
    • 從本地系統直接加載
    • 通過網絡下載.class文件
    • 從zip等歸檔文件中加載.class文件
    • 從專有數據庫中提取.class文件
    • 將Java源代碼動態編譯為.class文件
  • 類的加載的最終產品是位於內存中的Class對象
  • Calss對象封裝了類在方法區內的數據結構,並且向Java程序員提供了訪問方法區內的數據結構的接口
  • 有兩種類型的類加載器
    • Java虛擬機自帶的類加載器
      • 根類加載器(Bootstrap):該加載器沒有父加載器。他負責加載虛擬機的核心類庫,如java.lang.*等。根類加載器從系統屬性sun.boot.class.path所指定的目錄中加載類庫。根類加載器的實現依賴於底層操作系統,呀沒有繼承java.lang.CalssLoader類
      • 擴展類加載器(Extension):父加載器為根加載器。從java.ext.dirs系統屬性所指定的目錄中加載類庫,或者從JDK的安裝目錄的jre\lib\ext子目錄(擴展目錄)下加載類庫,如果用戶創建的JAR文件放在這個目錄下,也會自動由擴展類加載器加載。擴展類加載器是純Java類,是java.lang.ClassLoader類的子類
      • 系統(應用)類加載器(System):父加載器為擴展加載器。從環境變量classpath或者系統屬性java.class.path所指定的目錄中加載類,是用戶自定義類加載器的默認父加載器。系統類加載器是純Java類,是java.lang.ClassLoader類的子類
    • 用戶自定義的類加載器
      • java.lang.ClassLoader的子類
      • 用戶可以定製類的加載方式
  • 類加載器並不需要等到某個類被“首次使用”時再加載他
  • JVM規範允許類加載器在預料某個類將要被使用時就預先加載他,如果在預先加載的過程中遇到了.class文件缺失或存在錯誤,類加載器必須在程序首次主動使用時才報告錯誤(LinkageError錯誤)。如果這個類一直沒有被程序主動使用,那麼類加載器就不會報告錯誤

類的連接

類被加載后,就進入連接階段。連接就是將已經讀入到內存中的類的二進制數據合併到虛擬機的運行時環境中去

類的驗證

類的驗證的內容

  • 類文件的結構檢查
  • 語義檢查
  • 字節碼驗證
  • 二進制兼容性驗證

類的準備

在準備階段,Java虛擬機為類的靜態變量分配內存,並設置默認的初始值。例如對於下面的Sample類,在準備階段,將為int類型的靜態變量i分配4個字節的內存空間,並且賦默認值0;為long類型的靜態變量j分配8個字節的內存空間,並賦予默認值0

public class Sample {
    private static int i = 8;
    private static long j = 8L;
    ......
}

類的初始化

在初始化階段,Java虛擬機執行類的初始化語句,為類的靜態變量賦予初始值。在程序中,靜態變量的初始化有兩種途徑:

  • 在靜態變量的聲明處初始化
  • 在靜態代碼塊中初始化

靜態變量的聲明語句,預計靜態代碼塊都被看作類的初始化語句,Java虛擬機會按照初始化語句在類文件中的先後順序來依次執行他們

類的初始化步驟

  • 假如這個類還沒有被加載和連接誒,需要先進行加載和連接
  • 假如類存在直接父類,並且這個父類還沒有被初始化,需要先初始化直接父類
  • 假如類中存在初始化語句,需要依次執行這些初始化語句

類的初始化時機

  • 當Java虛擬機初始化一個類時,要求他的所有父類都已經被初始化,但是這條規則並不適用於接口

    • 在初始化一個類時,並不會先初始化他所實現的接口
    • 在初始化一個接口時,並不會先初始化他的父接口

    因此,一個父接口並不會因為他的子接口或實現類的初始化而初始化,只有當程序首次使用特定接口的靜態變量時,才會導致該接口的初始化。代碼參照代碼理解-接口的初始化

  • 只有當程序訪問的靜態變量或者靜態方法確實在當前類或者當前接口中定義時,才認為是對類或接口的主動使用

  • 調用ClassLoader類的loadClass方法加載一個類,並不是對類的主動使用,不會導致類的初始化

拓展部分

類實例化

類的生命周期除了前文提到的加載、連接、初始化之外,還有類示例化,垃圾回收和對象終結

  • 為新的對象分配內存
  • 為實例變量賦予默認值
  • 為實例變量賦予正確的初始值
  • Java編譯器為它編譯的每一個類都至少生成一個實例初始化方法,在Java的class文件中,這個實例初始化方法被稱為<init>。針對源代碼中每一個類的構造方法,Java編譯器都產生一個<init>方法

類的卸載

  • 當一個類被加載、連接和初始化后,它的生命周期就開始了。當代表該類的Class對象不再被引用,即不可觸及時,Class對象就會結束生命周期,這個類在方法區內的數據也會被卸載,從而結束自己的生命周期
  • 一個類何時結束生命周期,取決於代表它的Class對象何時結束生命周期
  • 由Java虛擬機自帶的類加載器所加載的類,在虛擬機的生命周期中,始終不會被卸載。Java虛擬機本身會始終引用這些類加載器,而這類加載器則會始終引用它們所加載的類的Class對象,因此這些Class對象始終是可觸及的;由用戶自定義的類加載器所加載的類是可以被卸載的

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益