型面向對象那點兒事——封裝、繼承、多態

那些年陪咱們一塊兒走過的面嚮對象語言,如今天天早上起來,依然陪在咱們身邊。在你尚未清醒的時候,你是否聽見它在你耳邊反覆絮叨:封裝、繼承、多態..........嘿嘿,也許你會說: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));
}
}
相關文章
相關標籤/搜索