Java基礎教程:面向對象編程[2]
內容大綱
訪問修飾符
四種訪問修飾符
Java中,可以使用訪問控制符來保護對類、變量、方法和構造方法的訪問。Java 支持 4 種不同的訪問權限。
-
default?(即缺省,什么也不寫): 在同一包內可見,不使用任何修飾符。使用對象:類、接口、變量、方法。
-
private?: 在同一類內可見。使用對象:變量、方法。?注意:不能修飾類(外部類)
-
public?: 對所有類可見。使用對象:類、接口、變量、方法
-
protected?: 對同一包內的類和所有子類可見。使用對象:變量、方法。?注意:不能修飾類(外部類)
訪問權限?
封裝
封裝(英語:Encapsulation)是指一種將抽象性函式接口的實現細節部份包裝、隱藏起來的方法。封裝可以被認為是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問。
使用封裝我們可以對成員變量進行更精確的控制,同時隱藏信息,實現細節等。
方法:
public class Person{private String name;private int age;
?public int getAge(){return age;}
?public String getName(){return name;}
?public void setAge(int age){this.age = age;}
?public void setName(String name){this.name = name;}
}
說明:
以上實例中public方法是外部類訪問該類成員變量的入口。通常情況下,這些方法被稱為getter和setter方法。因此,任何要訪問類中私有成員變量的類都要通過這些getter和setter方法。
繼承
繼承是java面向對象編程技術的一塊基石,因為它允許創建分等級層次的類。繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。繼承符合的關系是 is-a 的關系,父類更通用,子類更具體!
方法
class 父類 {
}class 子類 extends 父類 {
}
說明:
子類擁有父類非private的屬性,方法。
子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。
子類可以用自己的方式實現父類的方法。
Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關系就是C類是B類的父類,B類是A類的父類,這是java繼承區別于C++繼承的一個特性。
提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯系)。
多態
多態是同一個行為具有多個不同表現形式或形態的能力。多態就是同一個接口,使用不同的實例而執行不同操作,如圖所示
方法:
public class Test {public static void main(String[] args) {show(new Cat()); // 以 Cat 對象調用 show 方法show(new Dog()); // 以 Dog 對象調用 show 方法Animal a = new Cat(); // 向上轉型 a.eat(); // 調用的是 Cat 的 eatCat c = (Cat)a; // 向下轉型 c.work(); // 調用的是 Cat 的 work} public static void show(Animal a) {a.eat(); // 類型判斷if (a instanceof Cat) { // 貓做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } }
}abstract class Animal { abstract void eat();
} class Cat extends Animal { public void eat() { System.out.println("吃魚"); } public void work() { System.out.println("抓老鼠"); }
} class Dog extends Animal { public void eat() { System.out.println("吃骨頭"); } public void work() { System.out.println("看家"); }
}
說明:
多態存在的三個必要條件:
- 繼承
- 重寫
- 父類引用指向子類對象
當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調用子類的同名方法。
多態的好處:可以使程序有良好的擴展,并可以對所有類的對象進行通用處理。
集合框架
體系結構
遍歷ArrayList
import java.util.*;public class Test{public static void main(String[] args) {List<String> list=new ArrayList<String>();list.add("Hello");list.add("World");list.add("HAHAHAHA");//第一種遍歷方法使用foreach遍歷Listfor (String str : list) { //也可以改寫for(int i=0;i<list.size();i++)這種形式System.out.println(str);}//第二種遍歷,把鏈表變為數組相關的內容進行遍歷String[] strArray=new String[list.size()];list.toArray(strArray);for(int i=0;i<strArray.length;i++) //這里也可以改寫為 foreach(String str:strArray)這種形式{System.out.println(strArray[i]);}//第三種遍歷 使用迭代器進行相關遍歷Iterator<String> ite=list.iterator();while(ite.hasNext())//判斷下一個元素之后有值{System.out.println(ite.next());}}
}
遍歷HashMap
import java.util.*;public class Test{public static void main(String[] args) {Map<String, String> map = new HashMap<String, String>();map.put("1", "value1");map.put("2", "value2");map.put("3", "value3");//第一種:普遍使用,二次取值System.out.println("通過Map.keySet遍歷key和value:");for (String key : map.keySet()) {System.out.println("key= "+ key + " and value= " + map.get(key));}//第二種System.out.println("通過Map.entrySet使用iterator遍歷key和value:");Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();while (it.hasNext()) {Map.Entry<String, String> entry = it.next();System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());}//第三種:推薦,尤其是容量大時System.out.println("通過Map.entrySet遍歷key和value");for (Map.Entry<String, String> entry : map.entrySet()) {System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());}//第四種System.out.println("通過Map.values()遍歷所有的value,但不能遍歷key");for (String v : map.values()) {System.out.println("value= " + v);}}
}
文件持久化
對象序列化
如果對象能夠在程序不運行的情況下仍能夠存在并保存信息,那將是非常有用的。這樣在下次時,該對象將被重建并且擁有的信息能夠在程序上次運行時它所擁有的信息相同。
Java的對象序列化能夠將那些實現了Serializable接口的對象轉換成一個字節序列,并能夠在以后將這個字節序列完全恢復為原來的對象。這一過程甚至可通過網絡進行;這意味這序列化能夠自動彌補不同操作系統之間的差異。
序列化代碼
import java.io.*;public class SerializeDemo
{public static void main(String [] args){Employee e = new Employee();e.name = "Reyan Ali";e.address = "Phokka Kuan, Ambehta Peer";e.SSN = 11122333;e.number = 101;try{FileOutputStream fileOut =new FileOutputStream("/tmp/employee.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(e);out.close();fileOut.close();System.out.printf("Serialized data is saved in /tmp/employee.ser");}catch(IOException i){i.printStackTrace();}}
}
反序列化代碼:
import java.io.*;public class DeserializeDemo
{public static void main(String [] args){Employee e = null;try{FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");ObjectInputStream in = new ObjectInputStream(fileIn);e = (Employee) in.readObject();in.close();fileIn.close();}catch(IOException i){i.printStackTrace();return;}catch(ClassNotFoundException c){System.out.println("Employee class not found");c.printStackTrace();return;}System.out.println("Deserialized Employee...");System.out.println("Name: " + e.name);System.out.println("Address: " + e.address);System.out.println("SSN: " + e.SSN);System.out.println("Number: " + e.number);}
}
文件操作
IO流
具體使用方法詳見:http://www.runoob.com/java/java-files-io.html?
?