標籤:
物件導向編程 Object Oriented Programming OOP
第一、什麼是類和對象
在具體說明類和對象之前,先說說別的。
眼睛在人類身體上最為有用的器官。如果一個沒有了眼睛,這個人與世界的聯絡會大大減小。因為人腦主要是通過眼睛來擷取資料的;當然也有其它器官擷取的哦資料協助我們更加準確的描述我們所看到的現象。眼睛通過光線作用,把客觀物理世界投影到人腦。人腦是由億萬多腦細胞組成。腦細胞神經元有反饋機制,當級聯的腦腦細胞神經元多起來後,通過反覆的實驗和檢測,使得大腦得到對客觀世界有更準確的描述和解釋(人腦能理解的)。
學過機器學人工神經網路理論的人都知道ALVINN系統。ALVINN系統是一個三層網路,有一個巨大的輸入層(960個輸入神經元). ANN的輸入是一個30x32像素的圖象,輸出是車輛行進的方向。ALVINN系統使用反向傳播演算法來學習駕駛汽車(),它的最高時速達到每小時70英裡。神經網路顯示在圖的左邊,輸入的攝像機映像在它的下邊.左圖顯示了來自車前攝像機的映像是如何被映射到960個神經網路輸入的,這些輸入又前饋到4個隱藏單元,再串連到30個輸出單元。網路輸出編碼了推薦的駕駛方向。右圖顯示了網路中一個隱藏單元的權值。進入這個隱藏單元的30´32個權值顯示在大的矩陣中,白色的方框表示正權值而黑色的方框表示負權值。從這個隱藏單元到30個輸出單元的權值被畫在這個大矩陣上方的較小矩形中。從這些輸出權值可以看出,啟用這個隱藏單元會促進向左轉。 下面是三個圖。
人工神經網路(Artificial Neural Networks——ANNs)受到生物學的啟發,生物的學習系統是由相互串連的生物神經元組成的異常複雜的網路。 •人腦的構成,大約有1011個神經元,平均每一個與其他104個相連 •神經元的活性通常被通向其他神經元的串連啟用或抑制 •最快的神經元轉換時間比電腦慢很多,然而人腦能夠以驚人的速度做出極其複雜的決策 •很多人推測,生物神經系統的資訊處理能力一定得益於對分布在大量神經元上的資訊表示的高度平行處理 所以,我們翻過來說明人腦的學習方式更進階與ANNs。 回到類和對象,我通過舉人工神經網路例子是為了誰明什嗎?對象就是我們的感官感知到的資料,是客觀存在的。而類則是我們人腦對這個客觀存在對象的描述。這個描述行為、描述過程是個學習的過程,是不斷的實驗和檢驗過程。描述的越準確,我們對客觀世界的影響力越大。有點扯遠了,總之,一個程式設計語言註定從一開始的單一資料型別,例如int、float、array、structure,到進階的描述形式--類。 實現複雜的功能、描述複雜的現象,我們需要更好的、更強有力的描述工具。在科學界,數學就是描述工具。這是題外話。
第二、如何定義JAVA中的類
分三步走:1)首先定義一個類,要求類名,首字母為大寫;具體方法是先建一個工作空間>工程.>包>類
2)在定義該類都什麼屬性,即成員變數
3)方法(JAVA中的“方法”,其實與C語言中的“函數”相同),說明該類都有什麼功能
例如:
public class Telphone(){
String name="世界盃";
static String className="JAVA開發一班";//靜態變數的聲明和賦值。
//屬性(成員變數)有什麼
float screen;
float cpu;
float mem;
//方法 幹什麼
void call{
System.out.println("Telphone 有打電話的功能!");
}
void sendMessage{
System.out.println(“screen”+screen+"cpu"+cpu+"mem"+mem+"Telphone 有發簡訊的功能!");
}
//無參的構造方法
public Telphone(){
System.out.println("無參構造的構造方法!");
}
//有參的構造方法
public Telphone(float newScreen,float newCpu,float newMem){
screen=newScreen;
cpu=newCpu;
mem=newMem;
System.out.println("無參構造的構造方法!");
}
public static void main(String[] args){
System.out.println(Telphone.className);
//下面的方法是不可以用的。
System.out.println();
}
}
第三、如何使用JAVA中的對象
使用對象的步驟:
1#建立對象
類名 對象名 = new 類名();---假如有Telphone類,則建立對象:
Telphone phone = new Telphone();
這個建立過程是執行個體化的。對象是儲存在記憶體當中的。
2#使用對象
引用對象的屬性:對象名.屬性
phone.screen = 5;//給screen屬性賦值5
引用對象的方法(函數):對象名.方法();
phone.sendMessage();//調用sendMessage()方法
C語言中(《C Primer Plus》Chapter14.Sructure and Other Doata Forms)中提到 ,將聲明結構體視為Template(模板),然後用這個結構體定義個結構體變數,然後對這個變數進行初始化和應用。Java中的“類”的聲明和使用方法,我認為與C的結構體使用法相似的,也是先定義個類,然後用這個類新定義一個新類,對這個類,進行操作。
模板類,起到模範、原型的作用。如上面手機類的定義和使用,假如我有兩個不同配置的手機,那麼,我們新定義的兩個手機類其變數值和方法功能可能不盡相同的。
第四、JAVA中的成員變數和局部變數1)JAVA中的成員變數和局部變數
1、成員變數
在類中定義,用來描述對象將要有什麼。
預設時候,其值為零。float 類型變數賦值時,後面加 f。
2、局部變數
在類的方法中定義,在方法中臨時儲存資料。
2)成員變數和局部變數的區別
a、範圍不同
局部變數的範圍僅限於定義它的方法。
成員變數的範圍在整個類內部都可見的。
通俗講,範圍就是跟動物領地的概念。非洲獅子群可以襲擊斑馬、角馬等,但反過來斑馬、角馬一般不會主動惹非洲獅子群。
b、初始值不同
定義成員變數的時候有預設初始值;
定義局部變數的時候沒有預設初始值。
c、同一個方法中,不允許有同名局部變數,
不同方法中,可以有相同名局部變數。
d、兩類變數同名時,局部變數有具有更高的優先順序----就近原則
第五、JAVA中的構造方法
1、構造方法:
a、使用new+構造方法 創造一個新的對象,從而執行個體化
b、構造方法是定義在Java類中的一個用來初始化對象的方法
為什麼要用構造方法來初始化對象?
類中定義的變數和方法太多,以致一個個拷貝和賦值變數和方法變得繁瑣且容易出錯。
如果我們把這個繁瑣且容易出錯的初始化過程,讓電腦自動完成,節省了程式員的腦力,提高編寫程式的準確性和快速實現能力。
c、因此,目前為止,一個類包括有:變數、構造方法、方法、
構造方法,從名稱就可以看出是一種方法,是特殊的方法,專門用來實現初始化類用的。
2、構造方法與類同名且沒有傳回值
構造方法要在類中包含。
3、無參構造方法
4、有參構造方法
有參和無參構造方法可以並存的。
5、但沒有指定構造方法時,系統會自動添加無參的構造方法。
這個特徵也是為了,節約成本,自動化”生產線“。
6、當有指定構造方法時,無論是有參、無參的構造方法,都不會自動添加無參的構造方法
7、構造方法的重載:方法名相同,當參數不同的多個方法,調用時會自動根據不同的參數選擇相應的方法
其實一個類同時有無參的構造方法和有參的構造方法,其實就是方法的重載。
問題:方法的重載,有什麼作用?
提供多種選擇,
8、構造方法不但可以給對象的屬性賦值,還可以保證給對象的屬性賦一個合理的值
如何?呢?有參構造方法內,加入條件判斷,從而解決傳值不正確的問題。
第六、JAVA中的static 使用之靜態變數
“大家都知道,我們可以基於一個類建立多個該類的對象,每個對象都擁有自己的成員,互相獨立。然而在某些時候,我們更希望該類所有的對象共用 同一個成員。此時就是 static 大顯身手的時候了!!
Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬於整個類所有,而不是某個對象所有,即被類的所有對象所共用。靜態成員可以使用直接
訪問,也可以使用對象名進行訪問。當然,鑒於他作用的特殊性更推薦用類名訪問~~
使用 static 可以修飾變數、方法和代碼塊。”
1、靜態變數及使用方法
公有靜態變數的使用方法:public static String className="JAVA開發一班";
私人靜態變數的使用方法:private static String className="JAVA開發一班";
推薦類名訪問,所以,利用上面的程式碼片段的定義,可以這樣調用靜態變數:System.out.println(Telphone.className);
2、靜態方法、靜態類
與靜態變數一樣,我們也可以使用 static 修飾方法,稱為靜態方法或類方法。其實之前我們一直寫的 main 方法就是靜態方法。
a、 靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。如果希望在靜態方法中調用非靜態變數,可以通過建立類的對象,然後
通過對象來訪問非靜態變數.如下:
pbulic class HelloWorld{
String name="世界盃";
static String hobby="worldcup";
}
public static void print(){
//建立類的對象
HelloWorld hello=new HelloWorld();
//通過推向來實現在靜態方法中 調用 非靜態變數
System.out.println("喜歡"+hello.name+"!");//非靜態
System.out.println("I love "+hobby+" !");//靜態
}
b、 在普通成員方法中,則可以直接存取同類的非靜態變數和靜態變數。
public void show(){
System.out.println("喜歡"+name+"!");//非靜態
System.out.println("I love "+hobby+" !");//靜態
}
c、 靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。
public void show(){
System.out.println(我愛世界盃!");
}
public static void print(){
System.out.println(2016世界盃!");
}
public static void main(String[] args){
//普通成員方法必須通過對象來調用
HelloWorld hello=new HelloWorl();
hello.show();
//可以直接調用靜態方法
print();
}
第七、靜態初始化塊
JAVA入門第二季 第一章 類和對象