Java——對象和類

又出現了一個令大家頭疼的難題,即對象;首先在介紹面向對象之前先介紹一下面向過程與面向對象的區別。

一、面向過程與面向對象的區別

1、面向過程

面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。

2、面向對象

面向對象是把構成問題事務分解成各個對象,建立對象的目的不是爲了完成一個步驟,而是爲了描敘某個事物在整個解決問題的步驟中的行爲。

 例如:

拿生活中的實例來理解面向過程與面向對象,例如五子棋,面向過程的設計思路就是首先分析問題的步驟:1、開始遊戲,2、黑子先走,3、繪製畫面,4、判斷輸贏,5、輪到白子,6、繪製畫面,7、判斷輸贏,8、返回步驟2,9、輸出最後結果。把上面每個步驟用不同的方法來實現。

如果是面向對象的設計思想來解決問題。面向對象的設計則是從另外的思路來解決問題。整個五子棋可以分爲1、黑白雙方,這兩方的行爲是一模一樣的,2、棋盤系統,負責繪製畫面,3、規則系統,負責判定諸如犯規、輸贏等。第一類對象(玩家對象)負責接受用戶輸入,並告知第二類對象(棋盤對象)棋子佈局的變化,棋盤對象接收到了棋子的變化就要負責在屏幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。

可以明顯地看出,面向對象是以功能來劃分問題,而不是步驟。同樣是繪製棋局,這樣的行爲在面向過程的設計中分散在了多個步驟中,很可能出現不同的繪製版本,因爲通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向對象的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一。

總而言之——面向過程是執行者;面向對象是指揮者。

3、面向對象的特點 

在瞭解其特點之前,咱們先談談對象,對象就是現實世界存在的任何事務都可以稱之爲對象,有着自己獨特的個性

圖例:

屬性用來描述具體某個對象的特徵。比如小志身高180M,體重70KG,這裏身高、體重都是屬性。

面向對象的思想就是把一切都看成對象,而對象一般都由屬性+方法組成!

屬性屬於對象靜態的一面,用來形容對象的一些特性,方法屬於對象動態的一面,咱們舉一個例子,小明會跑,會說話,跑、說話這些行爲就是對象的方法!所以爲動態的一面, 我們把屬性和方法稱爲這個對象的成員!

類:具有同種屬性的對象稱爲類,是個抽象的概念。比如“人”就是一類,期中有一些人名,比如小明、小紅、小玲等等這些都是對象,類就相當於一個模具,他定義了它所包含的全體對象的公共特徵和功能,對象就是類的一個實例化,小明就是人的一個實例化!我們在做程序的時候,經常要將一個變量實例化,就是這個原理!我們一般在做程序的時候一般都不用類名的,比如我們在叫小明的時候,不會喊“人,你幹嘛呢!”而是說的是“小明,你在幹嘛呢!”

面向對象有三大特性,分別是封裝性、繼承性和多態性,這裏不給予太多的解釋!

4、 面相過程與面向對象的優缺點

面向過程

優點:性能比面向對象高,如單片機、嵌入式開發、Linux/Unix等一般採用面向過程開發,性能是最重要的因素;

缺點:難以應對複雜系統,難以複用

適用場合:適用於簡單系統,容易理解

面向對象

優點:易維護、易複用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更靈活、更易於維護;

缺點:比較抽象,性能比面向過程低

適用場合:適用於大型複雜系統,方便複用

在軟件開發過程中,宏觀上,用面向對象來把握事物間複雜的關係,分析系統。
微觀上,仍然使用面向過程。

二、類 

重要提示:1、類爲對象定義屬性和行爲;2、類是對象的定義,對象從類中創建。

1、創建一個類 例:

/*
創建類的過程中格式是:
class 類名{
    成員變量;
    成員函數;
}
 */
class Point{
    /*
    下面定義的x和y爲成員變量
     */
    double x;
    double y;
    /*
    成員函數
     */
    public double getDiance(Point str){
        return Math.abs(x-str.x);
    }
}

/*
主函數
*/
class Test01{
    /*
    主函數,程序運行的入口
     */
    public static void main(String[] args){
        /*
        P1和P2就是創建對象
        首先是對P1、P2進行實例化
         */
        Point p1=new Point();
        Point p2=new Point();
        /*
        接下來就是對該實例化後的對象中的屬性和方法的一些操作
        注意:這裏面的被調用的方法實在類中已經實現,並在類中實現這個被稱之爲面向過程
         */
        p1.x=1;
        p2.x=2;
        /*
        對方法的調用
         */
        System.out.println(p1.getDiance(p2));
    }
}

 不知道大家有沒有發現一個問題的所在,在創建類的完成,以及實例化,並對類中的變量進行修改,及訪問的過程中,如果在類中我所定義的變量是年齡age,並且還要符合實際需求,雖然我在類裏面定義age並給初始化值是大於0且小於一定數的一個值,但是對於外界是否知道,我通過實例化並修改該值,給該值賦一個負數,這樣問題是不是就來了,那我們如何解決這一問題,年齡不可能爲負數。因此我們就引入一個形如public權限的一個名稱private(私有的)protected(被保護的);例:

class Point{
    /*
    下面定義的x和y爲成員變量
     */
    private double x;
    private double y;
    /*
    成員函數
     */
    public double getDiance(Point str){
        return Math.abs(x-str.x);
    }
}

如果在Point類中的成員變量前面加一個private,因此在主函數中就不能被訪問,運行結果將在編譯的時候不能通過,將會出現以下運行錯誤:

Test01.java:16: 錯誤: x可以在Point中訪問private
        p1.x=1;
          ^
Test01.java:17: 錯誤: x可以在Point中訪問private
        p2.x=2;
          ^
2 個錯誤

爲了避免這一種錯誤的出現,則我們又在Point類中引入方法setter,格式形如:setXxx——set+成員變量名(切記首字母大寫)。

class Point{
    /*
    下面定義的x和y爲成員變量
     */
    private double x;
    private double y;
    /*
    可以改變成員變量的方法setter
     */
    public void setX(double x){
        this.x=x;
    }
    public void setY(double y){
        this.y=y;
    }
    /*
    成員函數
     */
    public double getDiance(Point str){
        return Math.abs(x-str.x);
    }
}

class Test01{
    /*
    主函數,程序運行的入口
     */
    public static void main(String[] args){
        /*
        P1和P2就是創建對象
        首先是對P1、P2進行實例化
         */
        Point p1=new Point();
        Point p2=new Point();
        /*
        接下來就是對該實例化後的對象中的屬性和方法的一些操作
        注意:這裏面的被調用的方法實在類中已經實現,並在類中實現這個被稱之爲面向過程
         */
        p1.setX(1);
        p2.setY(2);
        /*
        對方法的調用
         */
        System.out.println(p1.getDiance(p2));
    }
}

 雖然這樣改了沒有什麼問題,但是如果打印即(訪問)p1.x是否可以通過呢?是不行的,既然有修改,豈不是還得有輸出,就相當於輸入和輸出一樣;因此引入getter。

/*
可以輸出成員變量的方法getter
*/
public double getX(){
    return this.x;
}
public double getY(){
    return this.y;
}

/*
主函數
*/
System.out.println(p1.getX());

2、構造方法 

構造方法——首先構造方法在類中該方法的名字(即函數名)和類名相同;每當在主函數中創建一個對象,相對應的就是在該類中調用了一個無參的構造方法。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章