1. 程式人生 > >面向對象----信息的封裝和隱藏

面向對象----信息的封裝和隱藏

sys align radi 什麽 -- 方式 ima tag 修改

信息的封裝和隱藏

信息封裝和隱藏的必要性


使用者對類內部定義的屬性(對象的成員變量)的直接操作會導致數據的錯誤、混亂或安全性問題。(version1)

 1 public class Animal {
 2     public int legs;    
 3     public void eat(){
 4         System.out.println(“Eating.”);
 5     }
 6     public void move(){
 7         System.out.println(“Moving.”);
 8     }
 9 }
10 
11 public
class Zoo{ 12 public static void main(String args[]){ 13 Animal xb=new Animal(); 14 xb.legs=4; 15 System.out.println(xb.legs); 16 xb.eat();xb.move(); 17 } 18 }

應該將legs屬性保護起來,防止亂用。
保護的方式:信息隱藏


Java中通過將數據聲明為私有的(private),再提供公開的(public)方法:getXXX和setXXX實現對該屬性的操作,以實現下述目的:


  隱藏一個類的實現細節;
  使用者只能通過事先定制好的方法來訪問數據,可以方便地加入控制邏輯,限制對屬性的不合理操作;
  便於修改,增強代碼的可維護性;(version2)

 1 public class Animal {
 2     private int legs;    //將屬性legs定義為private,只能被Animal類內部訪問
 3     public void setLegs(int i) { //在這裏定義方法 eat() 和 move() 
 4         if (i != 0 && i != 2 && i != 4) {
 5
System.out.println("Wrong number of legs!"); 6 return; 7 } 8 legs=i; 9 } 10 public int getLegs() { 11 return legs; 12 } 13 } 14 public class Zoo { 15 public static void main(String args[]) { 16 Animal xb=new Animal(); 17 xb.setLegs(4); //xb.setLegs(-1000); 18 xb.legs=-1000; //非法 19 System.out.println(xb.getLegs()); 20 } 21 }



練習
1、創建程序,在其中定義兩個類,Person和TestPerson類的定義如下。用setAge()設置人的合法年齡(0~130),用getAge()返回人的年齡。在Test類中實例化Person類的對象b,調用setAge()和getAge()方法,體會Java的封裝性。

 1 public class  Person{
 2     public static void main(String[] args) {
 3         private int age;
 4 
 5         public int getAge(){
 6             return age;
 7         }
 8         //為屬性賦值的 set 方法
 9         public void setAge(int age) {
10             if(age >130 & age<0){
11                 System.out.println("age 賦值不合法: " + age);
12                 return;
13             }
14             this.age = age;
15         }
16     }
17 }

public class TextPerson{
    public static void main(String[] args) {
        Person p = new Person;
        p.setAge(22);
        p.getAge();
        System.out.println("年齡為:" + getAge);
    }
}

2、求圓的面積

 1 /**
 2  * 什麽是信息的封裝和隱藏?
 3  * 
 4  * 1. 把屬性隱藏起來: 使用 private 關鍵字來修飾
 5  * 2. 提供 public 的 set, get 方法來訪問屬性.  7  */
 8 public class Circle {
 9     
10     //構造器於類同名, 且沒有返回值(連 void 都沒有). 
11     //JVM 會為每一個類提供一個默認的無參數的構造器: public Circle(){}
12     //構造器的作用: 對類的屬性進行初始化. 
13     public Circle(){
14         radius = 10;
15     }
16     
17     //半徑
18     //private 關鍵字: 可以修飾類的成員, 一經使用 private 修飾, 該屬性將不能在外部被直接訪問. 
19     //可以提供 public 方法來操作屬性: getXxx() 返回屬性值, setXxx() 為屬性賦值。 
20     private int radius;
21     
22     //讀取屬性值的方法
23     public int getRedius(){
24         return radius;
25     }
26     
27     //為屬性賦值的 set 方法
28     public void setRedius(int r) {
29         if(r <= 0){
30             System.out.println("redius 賦值不合法: " + r + ", " +
31                     "redius 取默認的初始值 0");
32             return;
33         }
34         
35         radius = r;
36     }
37     
38     //返回圓的面積
39     public double findArea(){
40         return 3.14 * radius * radius;
41     }
42 }

 1 public class TestCircle {
 2     public static void main(String[] args) {
 3         
 4         //創建對象一定是調用了類的某一個構造器. 
 5         //如果在類中沒有顯式的定義構造器, 則將調用默認的那個構造器. 
 6         Circle c = new Circle();
 7         
 8         //c.redius = -2;
 9         //通過方法為 Circle 對象的 redius 屬性賦值
10 //        c.setRedius(3);
11         
12         System.out.println(c.findArea()); 
13         System.out.println("redius: " + c.getRedius()); 
14     }
15 }

面向對象----信息的封裝和隱藏