1. 程式人生 > >java 入門(6)--面向對象初探

java 入門(6)--面向對象初探

普通 不同的 pre 還需要 設定 隱藏 code [] 內部數據

類與對象

面向對象的想法是模擬現實世界。

把某樣東西的狀態數據和它的行為封裝起來,從而達到易用、重用、隱藏內部狀態的目的。

一般的變量,如: int a, double b 等,

我們定義它之後,它就是一個被動的數據,等特著其它代碼來操作它。

而對象,不僅含有數據,還有在數據上操作的方法,這樣,數據本身就可能隱藏起來了。

外界只需要調用對象的方法來達到操控對象的目的。

這對外界而言,增加了易用性,因為這些專門針對該對象的方法,進行了精心設計,可以避免復雜度,避免一些誤用。

對對象而言,因為不直接操作它的數據,就達到了保護內部數據的目的,增加了安全性。

這樣看來,相比於普通的變量,對象就好比是更智能化的數據。

對象是一種復合類型,或說復雜類型。

因為對象中,可能會包含多個數據,以刻畫對象當前所處的狀態,又包含多個方法,描述對象可以做出的行為。

定義一個普通的數據, int a = 100; 就好了,這個類型很簡單。

如果還需要第 2 個, int b = ... 也就搞定。

但如果直接定義一個對象,無論怎麽設計語法,要給出多個數據,多個方法,都肯定會冗長。

剛寫好,然後老板又要再定義 10 個這樣的對象,那就要悲劇了。

為避免重復與冗長,一個很自然的想法,是先定義一自己的新“類型”,地位相當於 int,

在這個類型中,把對象應該包含的數據、方法一次性描述清楚。

然後用這個新的類型再去定義對象,不就很清晰自然了嗎?

這個新類型,就是我們所說的----

如下代碼定義了平面上的"點",它包含 x, y 坐標,還有方法,比如:到原點的距離, distance。

 1 class MyPoint
 2 {
 3     private double x;
 4     private double y;
 5     
 6     public double distance(){
 7         return Math.sqrt(x * x + y * y);
 8     }
 9     public void set(double x1, double y1){
10         x = x1;
11 y = y1; 12 } 13 public double getx(){ 14 return x; 15 } 16 public double gety(){ 17 return y; 18 } 19 }

這段代碼中對 MyPoint 的描述比較簡陋,只有 2 個數據,3 個方法。

數據前邊以 private修飾,表示外界不能直接存取這些數據,達到保護的目的。

但這樣一來,總得給外界提供某種能夠訪問 x, y 的方式,否則這些數據就沒什麽價值了。

所以才有下面的 set, getx, gety 方法,它們負責對 x y 設定新值,以及讀取 x y 的值。

下面看看怎樣使用 MyPoint 這個新類型。

 1 public class A0411
 2 {    
 3     public static void main(String[] args){
 4         MyPoint p1 = new MyPoint();
 5         p1.set(10,20);
 6         System.out.println(p1.distance());
 7         System.out.println(p1.getx());
 8         System.out.println(p1.gety());
 9     }
10 }

你可能會覺得,這麽繞著彎去操作 x, y 到底有什麽好處呢,看起來還不如直接定義 x, y 更舒服呢。

的確,面向對象在效率上確實有些隕失,但換來了安全性。當軟件變大,變復雜後,安全性、隔離性就很重要了。

對這麽個簡單情況,當然看不出什麽優勢來。

如果一定要看優勢,這樣想吧,比如我們需要對 x y 的值進行限幅操作,x y 的值被限定在 -1000 到 1000 之間,

超出的,取範圍內與設定最接近的值。

此時,我們只需要對 set 方法進行修改就可以了,不需要更動其它代碼,尤其是不需要驚動使用 MyPoint 的代碼,這是個很大的優勢,

因為在大型項目中,MyPoint 和使用 MyPoint 的代碼很可能是兩個不同的人,甚至是兩個不同的團隊寫出來的。

    public void set(double x1, double y1){
        if(x1 < -1000) x1 = -1000;
        if(x1 >  1000) x1 = 1000;
        if(y1 < -1000) y1 = -1000;
        if(y1 >  1000) y1 = 1000;
        x = x1;
        y = y1;
    }

這也正是“封裝”的含義。

外界只能調用方法,提供必要的參數,而無權幹涉對象內部如何處理。

更理論化地說,外界只能向對象發出請求,至於對象如何響應這個請求,外界無法左右。

外界: 求求你,快把你的坐標改為 1200,900 吧。

對象: 才不呢! 1200超範圍了,我就設為 1000,900 吧,愛咋地咋地。

java 入門(6)--面向對象初探