那些年陪咱們一塊兒走過的面嚮對象語言,如今天天早上起來,依然陪在咱們身邊。在你尚未清醒的時候,你是否聽見它在你耳邊反覆絮叨:封裝、繼承、多態..........嘿嘿,也許你會說:No。不要緊,我會在這裏絮叨一番的.........
java
面向對象特性一:封裝。對象的狀態信息隱藏在對象內部,不容許外部程序直接訪問,而是經過類提供的方法來實現對內部信息的操做和訪問。要實現封裝就須要依賴訪問控制符:pubilc、private、缺省和protected。它們分別表明四個訪問控制權限。控制級別從大到小的順序爲:public--->protected--->default--->private。ide
一、private:用它修飾的成員,只能在列內部被訪問,因此用它來修飾屬性最合適。能夠把屬性隱藏在類內部。工具
二、缺省:又稱包訪問權限。當類成員或類不使用任何訪問控制符修飾的時候,咱們認爲它是默認訪問控制權限,只能被同一包下的其餘類訪問。學習
三、protected:子類訪問權限。能夠被同包的類訪問,也能夠被不一樣包下的子類訪問。測試
四、public:公共訪問權限。能夠被全部類訪問。this
面向對象特性2、繼承。簡單一點說,就是一種父子關係。子類使用extends關鍵字實現繼承關係。經過繼承,子類能夠繼承除私有成員外的全部方法和屬性,同時子類能夠有本身的方法和屬性。程序演示:spa
父類:對象
public class Father { private int a=1; protected int b=2; public int c=3; int d=4; }
子類:繼承
public class Son extends Father{ public static void main(String[] args) { Son s=new Son(); s.b=1; s.c=2; s.d=4; //s.a=0;a 受private修飾,不可訪問。程序在這出錯 } }
注意父類屬性的訪問控制,以及extends關鍵字。get
在繼承的學習中要注意,java是單繼承的。若是一個類沒有指定繼承其餘父類,則它的父類是Object。下面介紹兩個重要的關鍵字,this/super。this是當前對象的引用。super表明父類對象的引用。對於子類它能夠重寫父類的方法,那麼,在訪問父類方法時候,就可使用super。程序演示:
public class Father { public void say(){ System.out.println("爸爸說了,不能和陌生人說話!"); } }
子類:
public class Son extends Father{ public void say(){ System.out.println("嗯嗯,爸爸說得對!"); } public void print(){ super.say();//訪問父類方法 this.say();//訪問子類 } public static void main(String[] args) { Son s=new Son(); s.print(); } }
程序註釋,已經標明。運行一下,看到結果就會明白了。
面向對象特性3、多態。一個對象,多種狀態。父類引用能夠指向父類對象也能夠指向子類的對象。以多態的形式來傳遞參數,加強靈活性。
多態兩點基本定理:
1. 發生多態時,只能調用父類的方法,不能調用子類的方法。
2. 發生多態時,若是子類中重寫了父類的方法,再調用這個方法,調用的是子類重寫以後的方法。
public class Father { public void say(){ System.out.println("爸爸說了,不能和陌生人說話!"); } }
子類:
public class Son extends Father{ public void say(){ System.out.println("嗯嗯,爸爸說得對!"); } public static void main(String[] args) { Father f=new Son(); f.say(); } }
運行程序能夠發現,運行了子類方法,輸出的結果爲——嗯嗯,爸爸說的對!
程序舉例:
父類:
public class Emp { private String name; private int id; private int sal; public Emp() { super(); // TODO Auto-generated constructor stub } public Emp(String name, int id, int sal) { super(); this.name = name; this.id = id; this.sal = sal; } protected String getName() { return name; } /*setter、getter方法*/ public double getYearSal(){ return 0; } }
子類:
public class XZEmp extends Emp{ private String team; private int comm; public XZEmp() { super(); } public XZEmp(String name, int id, int sal,String team, int comm) { super(name, id, sal); this.team = team; this.comm = comm; } protected String getTeam() { return team; } protected void setTeam(String team) { this.team = team; } protected int getComm() { return comm; } protected void setComm(int comm) { this.comm = comm; } public double getYearSal(){ return 12*this.getSal()+this.comm; } }
Emp工具類:
public class EmpUtils { public void del(Emp emp){ System.out.println(emp.getName()+"被刪除了!"); } public double getMoney(Emp emp){ return emp.getYearSal(); } }
測試類:
public class TestEmp { public static void main(String[] args) { Emp emp=new XZEmp("dd",121,5000,"java",12000); EmpUtils u=new EmpUtils(); u.del(emp); System.out.println(u.getMoney(emp)); } }