推薦學習:《》
人們希望構建一個無須深奧的專業訓練就可以進行程式設計的系統,並且要符合當今的標準慣例。因此,儘管人們發現C++不太適用,但在設計Java的時候還是儘可能地接近C++,以便系統更易於理解,Java剔除了C++中許多很少使用、難以理解、易混淆的特性。在目前看來,這些特性帶來的麻煩遠遠多於其帶來的好處。
的確,Java語法是C++語法的一個「純淨」版本。這裡沒有標頭檔案、指標運算(甚至指標語法)、結構、聯合、操作符過載、虛基礎類別等。然而,設計者並沒有試圖清除C++中所有不適當的特性。例如,switch語句的語法在Java中就沒有改變。如果你瞭解C++就會發現可以輕而易舉地轉換到Java語法。
Java釋出時,實際上C++並不是最常用的程式設計語言。很多開發人員都在使用VisualBasic和它的拖放式程式設計環境。這些開發人員並不覺得Java簡單。很多年之後Java開發環境才迎頭趕上。如今,Java開發環境已經遠遠超出大多數其他程式語言的開發環境。
簡單的另一個方面是小。Java的目標之一是支援開發能夠在小型機器上獨立執行的軟體。基本的直譯器以及類支援大約僅為40KB;再加上基礎的標準類庫和對執行緒的支援(基本上是一個自包含的微核心)大約需要增加175KB。
在當時,這是一個了不起的成就。當然,由於不斷的擴充套件,類庫已經相當龐大了。現在有一個獨立的具有較小類庫的Java微型版(JavaMicroEdition),這個版本適用於嵌人式裝置。
物件導向是一種新興的程式設計方法,或者是一種新的程式設計規範,其基本思想是使用物件、類、繼承、封裝、多型等基本概念來進行程式設計。從現實世界中客觀存在的事物(即物件)出發來構造軟體系統,並且在系統構造中儘可能運用人類的自然思維方式。
分散式系統對於使用者而言,他們面對的就是一個伺服器,提供使用者需要的服務而已,而實際上這些服務是通過背後的眾多伺服器組成的一個分散式系統,因此分散式系統看起來像是一個超級計算機一樣。
Web的多平臺環境對程式有特別的要求,因為程式必須在各種系統中可靠地執行。因此,在設計Java時,使其具備建立健壯程式的能力被提到了高優先順序的地位。為了獲得可靠性,Java在一些關鍵領域進行了限制,從而迫使程式設計師在程式開發中及早地發現錯誤。同時,使程式設計師不必再擔心會引起程式設計錯誤的許多最常見的問題。因為Java是強型別化的語言,它在編譯時檢查程式碼。當然不管怎樣,在執行時也檢查程式碼。許多難以跟蹤的bug,在執行時通 常難以再現,這種情況在Java中幾乎不可能產生。因為使編寫好的程式在不同的執行條件下,以可預見的方式執行是Java的關鍵特性之一。 為了更好地理解Java是多麼健壯,分析程式失敗的兩個主要原因:記憶體管理錯誤和未處理的異常(即執行時錯誤)。在傳統的程式設計環境中,記憶體管理是一件困難、乏味的工作。例如,在C/C++中,程式設計師必須手動分配和釋放所有動態記憶體。有時這會導致問題,因為程式設計師可能會忘記釋放以前分配的記憶體,或者更糟糕的是,試圖釋放程式其他部分仍然在使用的記憶體。Java通過為您管理記憶體的分配和釋放,可以從根本上消除這些問題(事實上,釋放記憶體完全是自動的,因為Java為不再使用的物件提供了垃圾回收功能)。傳統環境中的異常情況通常是由「除0」或「沒有找到檔案」這類錯誤引起的,並且必須使用既笨拙又難以理解的結構對它們進行管理。Java通過提供物件導向的例外處理功能在這個領域提供幫助。在編寫良好的Java程式中,所有執行時錯誤都能夠並且應當由程式進行管理。
Java取消了強大但又危險的指標,而代之以參照。由於指標可進行移動運算,指標可隨便指向一個記憶體區域,而不管這個區域是否可用,這樣做是危險的,因為原來這個記憶體地址可能儲存著重要資料或者是其他程式執行所佔用的,並且使用指標也容易陣列越界。
垃圾回收機制:不需要程式設計師直接控制記憶體回收,由垃圾回收器在後臺自動回收不再使用的記憶體。避免程式忘記及時回收,導致記憶體洩露。避免程式錯誤回收程式核心類庫的記憶體,導致系統崩潰。
例外處理機制:Java異常機制主要依賴於try、catch、finally、throw、throws五個關鍵字。
強制型別轉換:只有在滿足強制轉換規則的情況下才能強轉成功。
Java在位元組碼的傳輸過程中使用了公開金鑰加密機制(PKC)。
在執行環境提供了四級安全性保障機制:位元組碼校驗器 -類裝載器 -執行時記憶體佈局 -檔案存取限制。
編譯器生成一個體繫結構中立的目標檔案格式,這是一種編譯過的程式碼,只要有Java執行時系統,就可以在許多處理器上執行。Java編譯器通過生成與特定的電腦架構無關的位元組碼指令來實現這一特性。精心設計的位元組碼不僅可以很容易地在任何機器上解釋執行,而且還可以迅速地翻譯成本地機器的程式碼。
位元組碼實現了結構中立,與計算機結構無關。
Java語言之中最大的特點在於其可移植性的支援,所謂的可移植性指的是同一個程式可以在不同的作業系統之間任意的進行部署,這樣就減少了開發的難度,在Java裡面如果要想實現可移植性的控制,那麼主要依靠的是JVM(Java 虛擬機器器)。Java虛擬機器器是一個由軟體和硬體模擬出來的計算機,所有的程式只要有Java虛擬機器器的支援,那麼就可以實現程式的執行,並且不同的作業系統上會有不同版本的JVM存在,這樣就可以實現移植性。
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
有人說Java是編譯型的。因為所有的Java程式碼都是要編譯的,.java不經過編譯就無法執行。 也有人說Java是解釋型的。因為java程式碼編譯後不能直接執行,它是解釋執行在JVM上的,所以它是解釋型的。
即時編譯器可以監控經常執行哪些程式碼並優化這些程式碼以提高速度。更為複雜的優化是消除函數呼叫(即內聯)。即時編譯器知道哪些類已經被載入。基於當前載入的類集,如果特定的函數不會被覆蓋,就可以使用內聯。必要時,還可以復原優化。
指的是這個程式(一個程序)執行時產生了不止一個執行緒。
Java本質為靜態語言,而不是動態語言。動態語言顯著的特點是在程式執行時,可以改變程式結構或變數型別,典型的動態語言有Python、ruby、javascript等。Java不是動態語言,但Java具有一定的動態性,表現在以下幾個方面:
物件是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個物件由一組屬性和對這組屬性進行操作的一組服務組成。
類的範例化可生成物件,一個物件的生命週期包括三個階段:生成、使用、消除。
當不存在對一個物件的參照時,該物件成為一個無用物件。Java的垃圾收集器自動掃描物件的動態記憶體區,把沒有參照的物件作為垃圾收集起來並釋放。當系統記憶體用盡或呼叫System.gc( )要求垃圾回收時,垃圾回收執行緒與系統同步執行。
類是具有相同屬性和方法的一組物件的集合,它為屬於該類的所有物件提供了統一的抽象描述,其內部包括屬性和方法兩個主要部分。在物件導向的程式語言中,類是一個獨立的程式單位,它應該有一個類名幷包括屬性和方法兩個主要部分。
Java中的類實現包括兩個部分:類宣告和類體。
[public][abstract|final] class className [extends superclassName] [implements interfaceNameList]{……}
其中,修飾符public,abstract,final 說明了類的屬性,className為類名,superclassName為類的父類別的名字,interfaceNameList為類所實現的介面列表。
class className{ [public | protected | private ] [static] [final] [transient] [volatile] type variableName;//成員變數 [public | protected | private ] [static] [final | abstract] [native] [synchronized] returnType methodName([paramList]) [throws exceptionList]{ statements }//成員方法 }
成員變數限定詞的含義:
方法的實現也包括兩部分內容:方法宣告和方法體。
方法宣告包括方法名、返回型別和外部引數。其中引數的型別可以是簡單資料型別,也可以是複合資料型別(又稱參照資料型別)。
對於簡單資料型別來說,java實現的是值傳遞,方法接收引數的值,但不能改變這些引數的值。如果要改變引數的值,則用參照資料型別,因為參照資料型別傳遞給方法的是資料在記憶體中的地址,方法中對資料的操作可以改變資料的值。
方法體是對方法的實現,它包括區域性變數的宣告以及所有合法的Java指令。方法體中宣告的區域性變數的作用域在該方法內部。若區域性變數與類的成員變數同名,則類的成員變數被隱藏。
為了區別引數和類的成員變數,我們必須使用this。this用在一個方法中參照當前物件,它的值是呼叫該方法的物件。返回值須與返回型別一致,或者完全相同,或是其子類。當返回型別是介面時,返回值必須實現該介面。
Java中的註釋就是解釋說明你的程式碼的,Java註釋不會被執行,因此可以隨意新增註釋。
(1)顯式引數就是方法名括號中間的引數。
(2)隱式引數是在類的方法中呼叫了類的範例域。這個被呼叫的範例域就是隱式引數。
(3)程式碼範例
package com.nezha.javase; public class Test1107 { private int score; /** * x為顯式引數 * score為隱式引數 * @param x */ public void addScore(int x){ int temp = this.score + x; score += temp; } }
如果在隱式引數的前面加上this,隱式引數就更清晰。
推薦在隱式引數的前面加上this操作符,this操作符代表的是本類。
在jdk5之前,每個java方法都有固定數量的引數,然而,現在的版本提供了可以用可變引數的方式。
以大家最長用到的sout為例。
System.out.println("獲獎編號:"+i);
println內部呼叫的都是
public PrintStream printf(String format, Object ... args) { return format(format, args); }
Object…引數型別和Object[]完全一樣,也就是說可以採用…這種宣告方式去接收同型別陣列,只是沒有固定陣列的大小,因為這是可變參。
這裡的省略號...是Java程式碼的一部分,它表明這個方法可以接收任意數量的物件。
實際上printf方法接收兩個引數,一個時格式字串,一個時Object[]陣列,其中儲存著所有的引數(如果引數是基本型別,自動裝箱會將其轉換為物件)。
編譯器需要對printf的每次呼叫進行轉換,以便將引數繫結到陣列上,並在必要的時候進行自動裝箱。
封裝性就是儘可能的隱藏物件內部細節,對外形成一道邊界,只保留有限的介面和方法與外界進行互動。封裝的原則是使物件以外的部分不能隨意的存取和操作物件的內部屬性,從而避免了外界對物件內部屬性的破壞。
(1)可以通過對類的成員設定一定的存取許可權,實現類中成員的資訊隱藏。
(2)封裝的優點
(3)程式碼範例
package com.nezha.javase; public class Student { //將 id、name 和 age 屬性設定為私有的,只能本類才能存取,其他類都存取不了,如此就對資訊進行了隱藏。 private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
子類的物件擁有父類別的全部屬性與方法,稱作子類對父類別的繼承。
Java中通過super來實現對父類別成員的存取,super用來參照當前物件的父類別。super 的使用有三種情況:
物件的多型性是指在父類別中定義的屬性或方法被子類繼承之後,可以具有不同的資料型別或表現出不同的行為。這使得同一個屬性或方法在父類別及其各個子類中具有不同的語意。
Java的多型性體現在兩個方面:由方法過載實現的靜態多型性(編譯時多型)和方法重寫實現的動態多型性(執行時多型)。
依賴關係表示一個類依賴於另一個類的定義。例如,一個人(Person)可以買車(car)和房子(House),Person類依賴於Car類和House類的定義,因為Person類參照了Car和House。與關聯不同的是,Person類裡並沒有Car和House型別的屬性,Car和House的範例是以參量的方式傳入到buy()方法中去的。一般而言,依賴關係在Java語言中體現為局域變數、方法的形參,或者對靜態方法的呼叫。
關聯(Association)關係是類與類之間的聯接,它使一個類知道另一個類的屬性和方法。關聯可以是雙向的,也可以是單向的。在Java語言中,關聯關係一般使用成員變數來實現。
聚合(Aggregation) 關係是關聯關係的一種,是強的關聯關係。聚合是整體和個體之間的關係。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關係便整體和個體的關係。與關聯關係一樣,聚合關係也是通過範例變數實現的。但是關聯關係所涉及的兩個類是處在同一層次上的,而在聚合關係中,兩個類是處在不平等層次上的,一個代表整體,另一個代表部分。
組合(Composition) 關係是關聯關係的一種,是比聚合關係強的關係。它要求普通的聚合關係中代表整體的物件負責代表部分物件的生命週期,組合關係是不能共用的。代表整體的物件需要負責保持部分物件和存活,在一些情況下將負責代表部分的物件湮滅掉。代表整體的物件可以將代表部分的物件傳遞給另一個物件,由後者負責此物件的生命週期。換言之,代表部分的物件在每一個時刻只能與一個物件發生組合關係,由後者排他地負責生命週期。部分和整體的生命週期一樣。
推薦學習:《》
以上就是簡單聊聊java物件導向的詳細內容,更多請關注TW511.COM其它相關文章!