java編程思想 初始化_《java編程思想》_第五章_初始化與清理

初始化和清理是涉及安全的兩個問題,java中采用了構造器,并額外提供了“垃圾回收器”,對于不再使用的內存資源,垃圾回收器能自動將其釋放。

一、用構造器確保初始化

java中,通過提供構造器,類的設計者可以確保每個對象都會得到初始化。創建對象時,如果其類具有構造器,java就會在用戶有能力操作對象之前自動調用相應的構造器,從而保證了初始化的進行。考慮到在初始化期間要自動調用構造器,所以構造器與類的名稱必須相同。public class IfElse {

public static void main(String[] args){

new Test();//在創建對象時,會為對象分配存儲空間,并調用相應的構造器。

}

}

class Test{

Test(){

System.out.println("this is test");

}

}

運行結果:this is test

不接受任何參數的構造器叫做默認構造器(無參構造器),構造器也能帶有形式參數,以便指定如何創建對象。public class IfElse {

public static void main(String[] args){

new Test(5);

}

}

class Test{

Test(int i){

System.out.println("this is test"+i);

}

}

運行結果:this is test5

從概念上講,“初始化”與“創建”是彼此獨立的,然而在java中,“初始化”與“創建”捆綁在一起,兩者不能分離。

二、方法重載

1.區分重載方法

重載的方法具有相同的名字,但是每個重載的方法都必須有一個獨一無二的參數列表,甚至參數順序的不同也足以區分兩個方法,不過一般情況下別這么做,這會使代碼難以維護。

2.涉及基本類型的重載

基本類型能從一個“較小”的類型自動提升為一個“較大”的類型,此過程一旦涉及到重載,可能會造成一些混淆。如果傳入的數據類型(實際參數類型),小于方法中聲明的形式參數類型,實際數據類型就會被提升。char型略有不同,如果無法找到剛好接受char參數的方法,就會把char直接提升至int。如果傳入的實際參數類型大于方法中聲明的參數類型,就要通過類型轉化做窄化轉換,否則編譯器會報錯。

三、默認構造器

如果寫的類中沒有構造器,則編譯器會自動幫你創建一個默認的構造器。但是如果已經定義了一個構造器(無論是否有參數),編譯器就不會幫你自動創建默認構造器。

四、this關鍵字

1.在構造器中調用構造器

可能為一個類寫了多個構造器,有時可能會想在一個構造器中調用另一個構造器,以免重復代碼,可以用this關鍵字做到。通常寫this關鍵字的時候,都是指“這個對象”或者“當前對象”,而且它本身表示對當前對象的引用。

public class Flower {

int petalCount = 0;

String s = "initial value";

Flower(int petals){

petalCount = petals;

System.out.println("int arg only,petalCount = "+petalCount);

}

Flower(String ss){

System.out.println("String arg only,s = "+s);

s = ss;

}

Flower(String s,int petals) {

this(petals);

//this(s);此處編譯器會報錯

this.s = s;

System.out.println("String & int arg");

}

Flower() {

this("hi",47);

System.out.println("no args");

}

public static void main(String args[]){

Flower x = new Flower();

}

}

運行結果:int arg only,petalCount = 47

String & int arg

no args

在有兩個參數的構造方法中,試圖調用兩次構造方法,但是編譯器報錯。這表明,盡管可以用this調用一個構造器,但卻不能調用兩個,此外,必須將構造器置于最初始處,否則編譯器會報錯。

五、清理:終結處理和垃圾回收

java有垃圾回收器負責回收無用對象占據的內存資源,但也有特殊情況:假定你的對象(并非使用new關鍵字)獲得了一塊“特殊”的內存區域,由于垃圾回收器只知道釋放那些經由new分配的內存,所以它不知道該如何釋放該對象的這塊“特殊”內存。為了應對這種情況,java允許在類中定義一個名為finalize()的方法。它的工作原理“假定”是這樣的:一旦垃圾回收器準備好釋放對象占用的存儲空間,將首先調用其finalize()方法,并且在下一次垃圾回收動作發生時,才會真正回收對象占用的內存。要記住以下三點:

(1)對象可能不被垃圾回收

(2)垃圾回收不等于“析構”

(3)垃圾回收只與內存有關

1.垃圾回收器如何工作

在java虛擬機中,堆的實現像是一個傳送帶,每分配一個新對象,它就往前移動一格。這意味著對象存儲空間分配的速度非常快,java的“堆指針"只是簡單地移動到尚未分配的區域。但實際情況未必像傳送帶那樣,因此,高效率的垃圾回收依賴于垃圾回收器的介入。當它工作時,將一面回收空間,一面使堆中的對象緊湊排列,這樣,”堆指針“就可以很容易地移動到更靠近傳送帶的開始處。通過垃圾回收器對對象的重新排列,實現了一種高速的,有無限空間可以分配的堆模型。

垃圾回收機制了解:

(1)引用記數:簡單,但速度很慢。每個對象都含有一個引用計數器,當有引用連接至對象時,引用記數加1,當引用離開作用域或被置于null時,引用記數減1。這個方法有個缺陷,如果對象之間循環引用,可能會出現”對象應該被回收,但引用記數卻不為0“的情況。對于垃圾回收器而言,定位這樣的交互自引用的對象組所需工作量極大。引用記數常用來說明垃圾收集的工作方式,但似乎從未被應用于任何一種虛擬機。

(2)自適應:java虛擬機采用自適應的垃圾回收技術,停止-復制:先暫停程序,將所有存活的對象復制到另一個堆中,沒有被復制的即為垃圾;標記-清掃:遍歷所有引用,進而找出所有存活的對象,當沒有引用時,變給對象標記,這個過程中不會有任何清理操作。在java虛擬機運行過程中,根據堆空間的對象情況,在以上兩種狀態切換,以達到垃圾回收。

六、成員初始化

java盡力保證,所有的變量在使用前都能得到恰當的初始化,對于方法的局部變量,java以編譯時錯誤的形式來貫徹這種保證。void f(){

int i;

i++;

}

以上代碼編譯期會報錯變量沒有初始化。但是對于類的數據成員,情況有所不同,類的每個基本數據成員保證都會有一個初始值。即使代碼沒有給出,編譯器也會自動賦初值。

七、構造器初始化

1.初始化順序

在類的內部,變量定義的先后順序決定了初始化的順序。即使變量定義散布于方法定義之間,它們仍然會在任何方法(包括構造器)被調用之前得到初始化。class Window{

Window(int marker) {

System.out.println("window("+marker+")");

}

}

class House{

Window w1 = new Window(1);

House(){

System.out.println("House()");

w3 = new Window(33);

}

Window w2 = new Window(2);

void f(){

System.out.println("f()");

}

Window w3 = new Window(3);

}

public class OrderOfInitialization {

public static void main(String[] args){

House h = new House();

h.f();

}

}

運行結果:window(1)

window(2)

window(3)

House()

window(33)

f()

在House類中,故意把幾個window對象散布在各處,以證明它們全都會在調用構造器或其他方法之前得到初始化。

2.靜態數據的初始化

無論創建多少個對象,靜態數據都只占一份存儲區域。static關鍵字不能應用于局部變量,因此它只能作用于域。 初始化的順序是先靜態對象(如果之前并未被初始化),而后是非靜態對象。

對象的創建過程,假設有個名為Dog的類:

(1)當首次創建類型為Dog的對象時,java解釋器查找類路徑,定位Dog.class文件

(2)載入Dog.class,有關靜態初始化的所有動作都會被執行。因此,靜態初始化只在Class對象首次加載的時候進行一次。

(3)當用new Dog()創建對象時,首先將在堆上為Dog對象分配足夠的存儲空間。

(4)這塊存儲空間會被清零,這就自動地將Dog對象中的所有基本類型數據都設置成了默認值,而引用則被置為null。

(5)執行所有出現于字段定義處的初始化動作。

(6)執行構造器。

八、數組初始化

數組只是相同類型的,用一個標識符名稱封裝到一起的一個對象序列或者基本類型數據序列。

可變參數:String[] args的寫法可以寫為String...args。有了可變參數,就不用顯示地編寫數組語法了,當指定參數時,編譯器會去填充數組,但是如果傳遞的本來就是數組,編譯器就不會再執行任何轉換。因此,如果你有一組事物,可以把它們當作列表傳遞,而如果你已經有了一個數組,該方法可以把它們當作可變參數列表來接受。將0個參數傳遞給可變參數列表依舊是可行的。

九、枚舉類型

java SE5中添加了一個看似很小的特性,即enum關鍵字,它使得我們在需要群組并使用枚舉類型集時,可以很方便地處理。enum Simple {

NOT,MILD,MEDIUM,HOT

}

public class SimpleEnumUse{

public static void main(String[] args){

Simple howHot = Simple.MEDIUM;

System.out.println(howHot);

}

}

運行結果:MEDIUM

enum有一個特別實用的特性,即它可以在switch語句內使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272768.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272768.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OkHttp 上手

OkHttp 上手 優點 快、節省帶寬。支持 HTTP/2 和 SPDY。HTTP/2 和 SPDY 允許對同一個主機的所有請求,使用一個 socket。如果不支持 SPDY 的話,可以用連接池減少請求等待時間。GZIP 縮小傳輸大小。緩存響應(response ca…

關于Net開發中一些SQLServer性能優化的建議

一、 ExecuteNonQuery和ExecuteScalar 對數據的更新不需要返回結果集,建議使用ExecuteNonQuery。由于不返回結果集可省掉網絡數據傳輸。它僅僅返回受影響的行數。如果只需更新數據用ExecuteNonQuery性能的開銷比較小。 ExecuteScalar它只返回結果集中第一行的第一列…

jstl mysql_java – jsp jstl sql與mysql中的奇怪行為

在mysql中我有一個存儲過程,其中包含一個sql:select firstname as i_firstname , lastname as i_lastname from roleuserwhere user_id uid ;我使用jstl代碼來獲取值: –call sp_select_username(?);${rows.i_firstname} ${rows.i_lastname}但是這個代…

C# 哈希表(Hashtable)用法筆記

一、什么是Hashtable?Hashtable 類代表了一系列基于鍵的哈希代碼組織起來的鍵/值對。它使用鍵來訪問集合中的元素。當您使用鍵訪問元素時,則使用哈希表,而且您可以識別一個有用的鍵值。哈希表中的每一項都有一個鍵/值對。鍵用于訪問集合中的項…

轉: Div與table的區別

1&#xff1a;速度和加載方式方面的區別 div 和 table 的差異不是速度&#xff0c;而是加載方式&#xff0c;速度只能是指網絡速度&#xff0c;如果速度足夠快&#xff0c;是沒有差異的&#xff1a; div 的加載方式是即讀即加載&#xff0c;遇到 <div> 沒有遇到 </div…

你的工作是為了你自己!

1、無論為誰打工&#xff0c;要為自己學東西&#xff0c;客觀為公司創造價值。我自己當年&#xff0c;無論我在方正給國內企業工作&#xff0c;還是我在雅虎給外國人工作&#xff0c;我都跟別人最大的不一樣&#xff0c;我從來不覺得我在給他們打工&#xff0c;我真的可能是很有…

java 無法注入service_SpringBoot集成shiro,MyRealm中無法@Autowired注入Service的問題

網上說了很多諸如是Spring加載順序&#xff0c;shiroFilter在Spring自動裝配bean之前的問題&#xff0c;其實也有可能忽略如下低級錯誤。在ShiroConfiguration中要使用Bean在ApplicationContext注入MyRealm&#xff0c;不能直接new對象。道理和Controller中調用Service一樣&…

python之函數用法startswith()

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函數用法startswith() #http://www.runoob.com/python/att-string-startswith.html#startswith() #說明&#xff1a;返回布爾值,用于檢查字符串是否是以指定子字符串開頭&#xff0c;如果是則返回 True&#xff0c;否則…

別去取悅,心里沒你的人

鞋子不合適不必硬塞&#xff0c;否則磨了自己的腳&#xff1b;不必討好心里沒你的人&#xff0c;不在乎你的人&#xff0c;你付出再多&#xff0c;也打動不了他。討好心里沒你的人&#xff0c;會讓自己很累很累&#xff1b;總是遷就他&#xff0c;總是圍著他轉&#xff0c;最后…

tensorflow java 加速_Tensorflow使用GPU加速

測試faster-rcnn時&#xff0c;cpu計算速度較慢&#xff0c;調整代碼改為gpu加速運算將 with tf.Session() as sess: 替換為1 gpu_options tf.GPUOptions(per_process_gpu_memory_fraction0.9)2 with tf.Session(configtf.ConfigProto(gpu_optionsgpu_options,log_device_plac…

Install OpenStack Kilo Dashboard wiht Nginx + uWSGI On RHEL7.1

一、安裝Horizon、Nginx、uWSGI yum install -y uwsgi-plugin-python openstack-dashboard uwsgi nginx 二、配置uWSGI cat >/etc/uwsgi.ini <<EOF [uwsgi] plugins python master true processes 10 threads 2 chmod-socket 666socket 127.0.0.1:9000 pidfile …

C#枚舉類型的筆記

一、枚舉類型的概念枚舉類型聲明為一組相關的符號常數定義了一個類型名稱。枚舉用于"多項選擇"場合&#xff0c;就是程序運行時從編譯時已經設定的固定數目的“選擇”中做出決定。枚舉類型&#xff08;也稱為枚舉&#xff09;為定義一組可以賦給變量的命名整數常量提…

java動態打印_JFreeChart學習(三)——動態打印java內存使用情況

JFreeChart動態打印java內存使用情況import java.awt.BasicStroke;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt…

WPF中StringToImage和BoolToImage簡單用法

在WPF的綁定控件操作中&#xff0c;經常會通過bool值或者某些特定的string值做出相應動作。但UI層控件的很多屬性對應的都不是Bool值或者對應的只是固定的String值。 這個時候有兩方法解決該問題。 1.是在后臺cs中做出比較判斷&#xff0c;然后根據相應結果傳達UI層做出相應動作…

【必備】jQuery性能優化的38個建議

一、注意定義jQuery變量的時候添加var關鍵字這個不僅僅是jQuery&#xff0c;所有javascript開發過程中&#xff0c;都需要注意&#xff0c;請一定不要定義成如下&#xff1a;$loading $(#loading); //這個是全局定義&#xff0c;不知道哪里位置倒霉引用了相同的變量名&#xf…

java中策略設計模式_Java中的設計模式(五):策略模式

策略設計模式是行為設計模式之一。當我們為特定任務使用多個算法時&#xff0c;使用策略模式&#xff0c;客戶端決定在運行時使用的實際實現。策略模式的最佳示例之一是Collections.sort()采用Comparator參數的方法。基于Comparator接口的不同實現&#xff0c;對象將以不同的方…

isset函數

isset (PHP 4, PHP 5) isset — 檢測變量是否設置 檢測變量是否設置&#xff0c;并且不是 NULL。 如果 var 存在并且值不是 NULL 則返回 TRUE&#xff0c;否則返回 FALSE。 $a "test"; $b "anothertest";var_dump(isset($a)); // TRUE var_dump(i…

SQLl中的left join、right join、inner join詳解

left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄inner join(等值連接) 只返回兩個表中聯結字段相等的行舉例如下&#xff1a;--------------------------------------------表A記…

afudos備份bios不動_bios刷壞后的兩種解決方法

通常主板新的BIOS可以修正舊版中BIOS的一些BUG&#xff0c;糾正對某些硬件和軟件的兼容問題&#xff0c;添加新硬件的支持等等&#xff0c;所以有時我們需要刷新BIOS。但刷新主板BIOS實際上是存在一定風險的&#xff0c;雖然現在各主板廠商都推出了在Windows下刷新BIOS的軟件&a…

光學基礎知識:白光、顏色混合、RGB、色彩空間

1665年&#xff0c;牛頓(Isaac Newton)進行了太陽光實驗&#xff0c;讓太陽光通過窗板的小圓孔照射在玻璃三角棱鏡上&#xff0c;光束在棱鏡中折射后&#xff0c;擴散為一個連續的彩虹顏色帶&#xff0c;牛頓稱之為光譜&#xff0c;表示連續的可見光譜。而可見光譜只是所有電磁…