對象:一切皆對象,對象是由靜態的屬性和動態的方法(行爲)組成。
類:一組具有相同屬性和行爲對象的抽象事物。
消息:對某個對象發送請求,比如,手機收到來電。
方法:對象收到請求的相應,比如,手機收到來電請求後會響鈴或震動提示。
抽象:從一個具體的對象中提取一組數據,去除非本質和特徵的屬性,保留本質的共性的。
比如學生,有很多的屬性(學號,姓名,性別,身高,血型,專業,班級,成績),如果我們要做的是一個學生成績管理系統,我們應該關注的是,除了學生的基本信息(姓名,性別),還要關注和學習相關的屬性(學號,專業,班級,成績)。不用關注學生的血型,身高,體重,而如果是一個學生健康管理系統,那麼除了基本屬性,身高,血型,體重,就是學生的本質屬性。
封裝:給對象一個邊界,內部的信息儘量的隱藏,只留對外的操作接口。
2 類與對象
2.1 類和對象的定義與使用
類的定義:
Class類名{
數據成員-靜態屬性(私有)
成員函數-動態行爲)(公有)
}
對象的定義:
類名 對象名
與int a的含義差不多
類定義的“{}”就是類的“外殼”,提供了封裝,private聲明的成員外面是不能訪問的,而public可以。
引用:一個儲存了某個對象地址的變量,它儲存的不是對象本身,而是對象的地址。
Point point = new Point();的含義是,首先實例化一個對象(new point()),然後定義一個引用point指向這個實例。
point = point1含義:不是將實例point1賦值給point,而只是改變了引用的關係,即point也指向了point1指向的實例。
2.2 構造函數和垃圾回收
爲什麼需要構造函數?
構造函數是完成對象的初始化,這個當然可以定義一個成員方法予以實現。但是這個方法必須顯示調用,否則就可能因未初始化出現錯誤。
我們希望這樣的函數能夠被自動調用,能被自動調用,那麼它的名字一定是獨一無二的,什麼樣的名字纔是獨一無二的呢?--以類名作爲方法名。這就是構造函數。
構造函數,是在對象實例化時自動被系統調用,該函數名必須是獨一無二的。對於一個類來說,是將了,類名作爲函數名。
構造函數不需要程序員去定義返回值,它是系統自動決定的,void也不行。
構造函數無法指定返回值,也無需指定,而是自動被調用。
函數的重載
多個函數使用同一個函數名,系統根據參數自動調用相應的函數。
函數重載解決了標識符同一的問題。
拷貝構造函數
用一個已經存在的本類的對象去複製新的對象。
什麼時候用構造函數?
構造函數是完成初始化的,構造函數並不是必須的。
但是如果不是構造函數,而是使用一個普通的初始化方法,就可能存在因疏忽忘了調用而導致的錯誤。
如果這個函數能夠被“自動”調用,那麼問題自然而然就迎刃而解
方案就是構造函數——即用類名作爲方法名。
構造函數是在實例化對象的時候被自動調用的,它的價值就是“自動”。
垃圾回收:所謂的“垃圾”是指,之前系統分配的內存單元,但是現在沒用了,在具體點講,就是沒有引用指向它了。對於“垃圾”來講,程序員不需要自己去回收,而是系統提供的垃圾回收機制自動回收,當程序員覺得有必要時,也可以強制讓系統進行回收。
2.3 訪問權限控制和封裝
四種訪問權
封裝的要領,是站在用戶的角度去思考,怎麼描述一個類,它應該有什麼屬性和行爲,而不是去考慮如何去實現。
2.4 靜態
靜態成員修飾的成員與一般的成員有何區別呢?
一般的成員是每個對象有一份數據,而靜態成員是屬於類的,即所有對象共享。
一般成員的訪問方式:對象名.成員名,而靜態成員的訪問方式:類名.成員名。
This是“這個”、“當前”的意思,每一個成員方法都隱含有一個參數(this)
public void print(){
System.out.println("學號:"+sno);
System.out.println("姓名:"+name);
System.out.println("性別:"+(sex==MALE?"男":"女"));
System.out.println("學歷:"+(level==UNDERGRADUATION?"本科":"專科"));
}
中的
System.out.println("學號:"+sno);
嚴格來講應該寫成:
System.out.println("學號:"+this.no);
靜態常量,靜態成員變量,靜態成員方法,靜態代碼塊。
靜態方法沒有this
靜態方法只能訪問靜態成員
一般的成員都是通過構造函數去完成初始化(實例化對象時),而靜態成員則是在加載類的時候(也就是實例化之前)初始化。
2.5 內部類
內部類是指在一個類的內部定義的類
內部類可以自由訪問外部類的成員
內部類可以作爲成員類(在外部類中定義,和成員方法平行)和方法內部類(定義在外部類方法裏面)
內部類的實例化
Computer.Cpu cpu = new Computer().new Cpu();
在什麼情況下使用內部類:當一個類離開了另一個類而無法單獨存在或者說沒有意義的情況下,使用內部類是合適的,比如CPU類離開了計算機類,單獨存在就沒有意義了。
類應該怎樣去定義?
- 類的設計:考慮應該由哪些屬性去描述這個類,這個類應該提供什麼方法?
- 方法(函數)設計:函數名、參數和返回值的類型
如果需要返回多個結果,函數返回值如何設計?
- 可以將多個返回值融在一個結果中,用特定的值表示其中的一個結果,比如查找函數需要返回是否找到以及找到的話下標是多少,兩個結果。可以將這兩個結果並在一個整型返回值中,用-1表示沒找到,找到的話就返回下標。這樣設計的理由是下標不可能爲-1,所以-1可以表示特定的含義。
- 將多個返回值封裝成一個類對象
- 可以考慮使用輸出型參數,在java中就只能使用引用類型了、
折回問題代碼如下:
rear = (rear+1)%capacity;
/* rear++;
if (rear>=capacity){
rear = 0;
}*/