面向對象概述

面向對象基本概念

對象:一切皆對象,對象是由靜態的屬性和動態的方法(行爲)組成。

類:一組具有相同屬性和行爲對象的抽象事物。

消息:對某個對象發送請求,比如,手機收到來電。

方法:對象收到請求的相應,比如,手機收到來電請求後會響鈴或震動提示。

面向對象的基本特徵

抽象:從一個具體的對象中提取一組數據,去除非本質和特徵的屬性,保留本質的共性的。

比如學生,有很多的屬性(學號,姓名,性別,身高,血型,專業,班級,成績),如果我們要做的是一個學生成績管理系統,我們應該關注的是,除了學生的基本信息(姓名,性別),還要關注和學習相關的屬性(學號,專業,班級,成績)。不用關注學生的血型,身高,體重,而如果是一個學生健康管理系統,那麼除了基本屬性,身高,血型,體重,就是學生的本質屬性。

封裝:給對象一個邊界,內部的信息儘量的隱藏,只留對外的操作接口。

 

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. 類的設計:考慮應該由哪些屬性去描述這個類,這個類應該提供什麼方法?
  2. 方法(函數)設計:函數名、參數和返回值的類型

如果需要返回多個結果,函數返回值如何設計?

  1. 可以將多個返回值融在一個結果中,用特定的值表示其中的一個結果,比如查找函數需要返回是否找到以及找到的話下標是多少,兩個結果。可以將這兩個結果並在一個整型返回值中,用-1表示沒找到,找到的話就返回下標。這樣設計的理由是下標不可能爲-1,所以-1可以表示特定的含義。
  2. 將多個返回值封裝成一個類對象
  3. 可以考慮使用輸出型參數,在java中就只能使用引用類型了、

折回問題代碼如下:

rear = (rear+1)%capacity;
/* rear++;
 if (rear>=capacity){
     rear = 0;
 }*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章