面向對象----信息的封裝和隱藏
阿新 • • 發佈:2017-07-22
sys align radi 什麽 -- 方式 ima tag 修改
隱藏一個類的實現細節;
使用者只能通過事先定制好的方法來訪問數據,可以方便地加入控制邏輯,限制對屬性的不合理操作;
便於修改,增強代碼的可維護性;(version2)
信息的封裝和隱藏
信息封裝和隱藏的必要性
使用者對類內部定義的屬性(對象的成員變量)的直接操作會導致數據的錯誤、混亂或安全性問題。(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 publicclass 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) { 5System.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 }
面向對象----信息的封裝和隱藏