Java基础教程:面向对象编程[2]
Java基礎(chǔ)教程:面向?qū)ο缶幊蘙2]
內(nèi)容大綱
訪問修飾符
四種訪問修飾符
Java中,可以使用訪問控制符來保護對類、變量、方法和構(gòu)造方法的訪問。Java 支持 4 種不同的訪問權(quán)限。
-
default?(即缺省,什么也不寫): 在同一包內(nèi)可見,不使用任何修飾符。使用對象:類、接口、變量、方法。
-
private?: 在同一類內(nèi)可見。使用對象:變量、方法。?注意:不能修飾類(外部類)
-
public?: 對所有類可見。使用對象:類、接口、變量、方法
-
protected?: 對同一包內(nèi)的類和所有子類可見。使用對象:變量、方法。?注意:不能修飾類(外部類)
訪問權(quán)限?
封裝
封裝(英語:Encapsulation)是指一種將抽象性函式接口的實現(xiàn)細節(jié)部份包裝、隱藏起來的方法。封裝可以被認為是一個保護屏障,防止該類的代碼和數(shù)據(jù)被外部類定義的代碼隨機訪問。
使用封裝我們可以對成員變量進行更精確的控制,同時隱藏信息,實現(xiàn)細節(jié)等。
方法:
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面向?qū)ο缶幊碳夹g(shù)的一塊基石,因為它允許創(chuàng)建分等級層次的類。繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。繼承符合的關(guān)系是 is-a 的關(guān)系,父類更通用,子類更具體!
方法
class 父類 { }class 子類 extends 父類 { }說明:
-
子類擁有父類非private的屬性,方法。
-
子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。
-
子類可以用自己的方式實現(xiàn)父類的方法。
-
Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關(guān)系就是C類是B類的父類,B類是A類的父類,這是java繼承區(qū)別于C++繼承的一個特性。
-
提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯(lián)系)。
多態(tài)
多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。多態(tài)就是同一個接口,使用不同的實例而執(zhí)行不同操作,如圖所示
方法:
public class Test {public static void main(String[] args) {show(new Cat()); // 以 Cat 對象調(diào)用 show 方法show(new Dog()); // 以 Dog 對象調(diào)用 show 方法Animal a = new Cat(); // 向上轉(zhuǎn)型 a.eat(); // 調(diào)用的是 Cat 的 eatCat c = (Cat)a; // 向下轉(zhuǎn)型 c.work(); // 調(diào)用的是 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("看家"); } }說明:
多態(tài)存在的三個必要條件:
- 繼承
- 重寫
- 父類引用指向子類對象
當(dāng)使用多態(tài)方式調(diào)用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調(diào)用子類的同名方法。
多態(tài)的好處:可以使程序有良好的擴展,并可以對所有類的對象進行通用處理。
集合框架
體系結(jié)構(gòu)
遍歷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);}//第二種遍歷,把鏈表變?yōu)閿?shù)組相關(guān)的內(nèi)容進行遍歷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]);}//第三種遍歷 使用迭代器進行相關(guān)遍歷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的對象序列化能夠?qū)⒛切崿F(xiàn)了Serializable接口的對象轉(zhuǎn)換成一個字節(jié)序列,并能夠在以后將這個字節(jié)序列完全恢復(fù)為原來的對象。這一過程甚至可通過網(wǎng)絡(luò)進行;這意味這序列化能夠自動彌補不同操作系統(tǒng)之間的差異。
序列化代碼
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?
?
轉(zhuǎn)載于:https://www.cnblogs.com/MrSaver/p/8824882.html
總結(jié)
以上是生活随笔為你收集整理的Java基础教程:面向对象编程[2]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 知名财经博主教人开车 紧急时刻应点刹!引
- 下一篇: 孕妇每天1杯奶茶喝成“奶茶血” 血浆变成