天天看點

JAVA 入坑教程 | 章節一 基礎概念JAVA 章節一 基礎概念一、OOP思想二、JAVA 三大特性(圖)三、JAVA 其它的基礎概念

學JAVA,首先得知道JAVA是什麼,JAVA能做什麼事,JAVA有哪些概念和特性,首先我們從JAVA是什麼開始入手帶大家入坑:

OOP:Object Oriented Programming , 面向對象的程式設計

JAVA  三大特性

JAVA  其它的基礎概念

首先我們來回顧下曆史,OOP的許多原始思想都來之于Simula語言,并在Smalltalk語言的完善和标準化過程中得到更多的擴充和對以前的思想的重新注解。可以說OO思想和OOPL幾乎是同步發展互相促進的。與函數式程式設計(functional-programming)和邏輯式程式設計(logic-programming)所代表的接近于機器的實際計算模型所不同的是,OOP幾乎沒有引入精确的數學描叙,而是傾向于建立一個對象模型,它能夠近似的反映應用領域内的實體之間的關系,其本質是更接近于一種人類認知事物所采用的哲學觀的計算模型。由此,導緻了一個自然的話題,那就是OOP到底是什麼?[D&T 1988][B.S 1991] .。在OOP中,對象作為計算主體,擁有自己的名稱,狀态以及接受外界消息的接口。在對象模型中,産生新對象,舊對象銷毀,發送消息,響應消息就構成OOP計算模型的根本。 

對象的産生有兩種基本方式:一種是以原型(prototype)對象為基礎産生新的對象。一種是以類(class)為基礎産生新對象。原型的概念已經在認知心理學中被用來解釋概念學習的遞增特性,原型模型本身就是企圖通過提供一個有代表性的對象為基礎來産生各種新的對象,并由此繼續産生更符合實際應用的對象。而原型-委托也是OOP中的對象抽象,代碼共享機制中的一種。一個類提供了一個或者多個對象的通用性描叙。從形式化的觀點看,類與類型有關,是以一個類相當于是從該類中産生的執行個體的集合。而這樣的觀點也會帶來一些沖突,比較典型的就是在繼承體系下,子集(子類)對象和父集(父類)對象之間的行為相融性可能很難達到,這也就是OOP中常被引用的---子類型(subtype)不等于子類(subclass) [Budd 2002]。而在一種所有皆對象的世界觀背景下,在類模型基礎上還誕生出了一種擁有元類(metaclass)的新對象模型。即類本身也是一種其他類的對象。以上三種根本不同的觀點各自定義了三種基于類(class-based),基于原型(prototype-based)和基于元類(metaclass-based)的對象模型。而這三種對象模型也就導緻了許多不同的程式設計語言(如果我們暫時把靜态與動态的差别放在一邊)。是的,我們經常接觸的C++,Java都是使用基于類的對象模型,但除此之外還有很多我們所沒有接觸的OOPL采用了完全不一樣的對象模型,他們是在用另外一種觀點诠釋OOP的内涵。 

什麼是oop的基本思想呢?把元件的實作和接口分開,并且讓元件具有多态性。不過,兩者還是有根本的不同。oop強調在程式構造中語言要素的文法。你必須得繼承,使用類,使用對象,對象傳遞消息。gp不關心你繼承或是不繼承,它的開端是分析産品的分類,有些什麼種類,他們的行為如何。就是說,兩件東西相等意味着什麼?怎樣正确地定義相等操作?不單單是相等操作那麼簡單,你往深處分析就會發現“相等”這個一般觀念意味着兩個對象部分,或者至少基本部分是相等的,據此我們就可以有一個通用的相等操作。再說對象的種類。假設存在一個順序序列和一組對于順序序列的操作。那麼這些操作的語義是什麼?從複雜度權衡的角度看,我們應該向使用者提供什麼樣的順序序列?該種序列上存在那些操作?那種排序是我們需要的?隻有對這些元件的概念型分類搞清楚了,我們才能提到實作的問題:使用模闆、繼承還是宏?使用什麼語言和技術?gp的基本觀點是把抽象的軟體元件和它們的行為用标準的分類學分類,出發點就是要建造真實的、高效的和不取決于語言的算法和資料結構。當然最終的載體還是語言,沒有語言沒法程式設計。stl 使用c++,你也可以用ada來實作,用其他的語言來實作也行,結果會有所不同,但基本的東西是一樣的。到處都要用到二分查找和排序,而這就是人們正在做的。對于容器的語義,不同的語言會帶來輕微的不同。但是基本的差別很清楚是gp所依存的語義,以及語義分解。例如,我們決定需要一個元件swap,然後指出這個元件在不同的語言中如果工作。顯然重點是語義以及語義分類。而oop所強調的(我認為是過分強調的)是清楚的定義類之間的層次關系。oop告訴了你如何建立層次關系,卻沒有告訴你這些關系的實質。 

(這段不太好了解,有一些術語可能要過一段時間才會有合适的中文翻譯——譯者) 

面向對象的程式設計方法OOP是九十年代才流行的一種軟體程式設計方法。它強調對象的“抽象”、“封裝”、“繼承”、“多态”。我們講程式設計是由“資料結構”+“算法”組成的。從宏觀的角度講,OOP下的對象是以程式設計為中心的,是面向程式的對象。

JAVA 入坑教程 | 章節一 基礎概念JAVA 章節一 基礎概念一、OOP思想二、JAVA 三大特性(圖)三、JAVA 其它的基礎概念

上面是三大特性的概念與對比圖,我們來分析一下:

Java的文法比C++的相對簡單,另一個方面就是Java能使軟體在很小的機器上運作,基礎解釋其和類庫的支援的大小約為40kb,增加基本的标準庫和線程支援的記憶體需要增加125kb。

OO:面向對象設計是把重點放在對象及對象的接口上的一個程式設計技術。

1.抽象: 

抽象就是忽略一個主題中與目前目标無關的那些方面,以便更充分地注意與目前目标有關的方面。

抽象并不打算了解全部問題,而隻是選擇其中的一部分,暫時不用部分細節。

抽象包括兩個方面,一是過程抽象,二是資料抽象。 

2.繼承: 

繼承是一種聯結類的層次模型,并且允許和鼓勵類的重用,它提供了一種明确表述共性的方法。

對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。

新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。

派生類可以從它的基類那裡繼承方法和執行個體變量,并且類可以修改或增加新的方法使之更适合特殊的需要。 

3.封裝: 

封裝是把過程和資料包圍起來,對資料的通路隻能通過已定義的界面。

面向對象計算始于這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口通路其他對象。 

4. 多态性: 

  多态性是指允許不同類的對象對同一消息作出響應。

多态性包括參數化多态性和包含多态性。

多态性語言具有靈活、抽象、行為共享、代碼共享的優勢,很好的解決了應用程式函數同名問題。 

總結:動态綁定裡有一個非常重要的特性:就是無需對現存的代碼進行修改,就可以對程式進行擴充。是以要記住,多态是開放封閉原則的基礎。 

String 和StringBuffer的差別 

JAVA平台提供了兩個類:String和StringBuffer,它們可以儲存和操作字元串,即包含多個字元的字元資料。這個String類提供了數值不可改變的字元串。而這個StringBuffer類提供的字元串進行修改。當你知道字元資料要改變的時候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers來動态構造字元資料。    

int 和 Integer 有什麼差別 

Java 提供兩種不同的類型:引用類型和原始類型(或内置類型)。Int是java的原始資料類型,Integer是java為int提供的封裝類。Java為每個原始類型提供了封裝類。  原始類型 -->> 封裝類  boolean -->> Boolean  char -->> Character  byte -->> Byte  short -->> Short  int -->> Integer  long -->> Long  float -->> Float  double -->> Double  引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的資料結構存儲,當引用類型和原始類型用作某個類的執行個體資料時所指定的預設值。對象引用執行個體變量的預設值為 null,而原始類型執行個體變量的預設值與它們的類型有關。 

String是最基本的資料類型嗎

基本資料類型包括byte、int、char、long、float、double、boolean和short。 
java.lang.String類是final類型的,是以不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer類 

final類:為防止他人從你的類上派生新類,此類是不可擴充的。

Java中的每一個類都是從Object類擴充而來的。 

抽象類:規定一個或多個抽象方法的類本身必須定義為abstract。例: public abstract string getDescripition

重載:當多個方法具有相同的名字而含有不同的參數時,便發生重載.編譯器必須挑選出調用哪個方法。

繼承:通過擴充一個類來獲得一個新類叫繼承(inheritance),而所有的類都是由Object根超類擴充而得,根超類下文會做介紹。

JAVA 對象的3個主要特性 

1.ehavior---說明這個對象能做什麼。 2.tate---當對象施加方法時對象的反映。  3.dentity---與其他相似行為對象的區分标志。 每個對象有唯一的indentity 而這3者之間互相影響。

JAVA 類之間的關系:

use-a :依賴關系 has-a :聚合關系 is-a :繼承關系--例:A類繼承了B類,此時A類不僅有了B類的方法,還有其自己的方法.(個性存在于共性中)

構造對象使用構造器:構造器的提出,構造器是一種特殊的方法,構造對象并對其初始化。

例:Data類的構造器叫Data New Data()---構造一個新對象,且初始化目前時間。 Data dujinyang=new Data()---把一個對象指派給一個變量dujinyang,進而使該對象能夠多次使用,此處要聲明的使變量與對象變量二者是不同的 .new 傳回的值是一個引用。 構造器特點:

構造器可以有0個,一個或多個參數

構造器和類有相同的名字

一個類可以有多個構造器

構造器沒有傳回值

構造器總是和new運算符一起使用

接口(Interface)說明類該做什麼而不指定如何去做,一個類可以實作一個或多個interface

接口不是一個類,而是對符合接口要求的類的一套規範。

若實作一個接口需要2個步驟: 1)聲明類需要實作的指定接口。 2)提供接口中的所有方法的定義。 ---- 聲明一個類實作一個接口需要使用implements 關鍵字,接口不是類,不能用new執行個體化一個接口。

什麼是超類(基類)?什麼是派生類?

一個類隻有一個超類(基類),但一個類能實作多個接口。(記:Java中的一個重要接口:Cloneable.) 什麼是基類?其實就是父類,繼承裡的兩個類,一個子類一個父類,基類等于父類,派生類等于子類。 基類、超類、父類都是一個意思,不同說法而已。  比如:  class BaBa{}  class A extends BaBa{}  這就可以說BaBa是A的基類,BaBa是A的超類,BaBa是A的父類;反過來,A就是BaBa的子類,或者叫派生類。

内部類:一個内部類的定義是定義在另一個内部的類。

原因是: 1)一個内部類的對象能夠通路建立它的對象的實作,包括私有資料。 2)對于同一個包中的其他類來說,内部類能夠隐藏起來。 3)匿名内部類可以很友善的定義回調。 4)使用内部類可以非常友善的編寫事件驅動程式。