面向對象的基本特性包括三點:封裝  繼承  多態。

      1封裝性

      封裝性是一種信息隱蔽技術,它體現于類的說明,是對象重要的特性。封裝使數據和操作該數據的方法(函數)封裝為一個整體,形成獨立性很強的模塊,使得用戶只能看到對象的外部特性(對象可以接受哪些信息,可以進行何種處理),而對象的內部特性(內部private的屬性和實現處理能力的算法)用戶是看不到的。簡言之就是封裝使對象的設計者和對象的使用者分開,使用者只要知道對象可以做什么,無需知道是怎么做出來的。借助封裝有助于提高類和系統的安全性。

      看一下下面的例子:

沒有封裝的程序:

class Person{

String name;

int age;

public void say(){

System.out.println(“NAME:***”+name+”   AGE:***”+age);

}

}

public class Demo01{

public static void main(String arg[]){

Person p=new Person();

p.name=“Michael”;

p.age  = –26;

p.say();

}

}

  運行結果:

Demo02  

  未封裝時程序可以通過編譯運行也沒有問題,但是年齡是不可以為負值的。這就是屬性直接對外可見造成的笑話。

 

 

封裝后的程序:

class Person{

private String name;

private int age;

public void say(){

System.out.println(“NAME:***”+name+”   AGE:***”+age);

}

}

public class Demo02{

public static void main(String arg[]){

Person p=new Person();

p.name=“Michael”;

p.age=-26;

p.say();

}

}

  運行結果:

Demo01

  由于進行了封裝,屬性對外不可見,所以編譯時提示上圖灰色區域中的內容。

  對于封裝的屬性的設置和取得應該通過setter和getter方法,通過Setter和Getter方法設置封裝的屬性并對年齡值進行檢查的程序如下:

class Person{

    private String name;

    private int age;

    public void setName(String n){

    name=n;

    }

    public String getName(){

    return name;

    }

    public void setAge(int a){ //Setter是入口,Getter是出口,在setter方法處檢查年齡是否在允許的范圍內。

    if(a>=0&&a<120){

    age=a;

    }else{

    age = -1;
    System.out.println("年齡非法");//提示年齡非法;

    }

    }

    public int getAge(){

    return age;

    }

    public void say(){

    System.out.println("NAME:***"+name+"   AGE:***"+age);

    }

    }

    public class Demo04{

    public static void main(String arg[])

    {

    Person p=new Person();

    p.setName("Michael");

    p.setAge(-26);

    p.say();

    }

    }

  此時運行后提示年齡非法:

Demo03

  2繼承性

  繼承是一種由已有類創建新類的機制,利用繼承,可以先創建一個共有屬性的一般類,根據這個一般類再創建具有特殊屬性的新類。新類繼承一般類的方法并根據需要增加它自己的新方法。有繼承而得到的類稱為子類,被繼承的類稱為父類(超類),當然子類也可以成為父類。如下圖,由下向上看,雙炸飛機類和殲擊機類都繼承了戰斗機類的特點但又分別具有自己新的功能,同樣,戰斗機類和民用機類都具有飛機類所有的特點也都擴展了屬于自己的新功能。也就是說雙炸飛機和殲擊機既具有飛機的全部特點又擁有戰斗機的全部特點。

p2

用程序說明一下:

class Person{
    String name;
    int age;
    public String getInfo()
    {
        return "姓名:---"+this.name+"\n"+"年齡:---"+this.age;

    }
}

 

//Student類繼承Person類


class Student extends Person

{
      String school;//Student類中擴展的屬性
}

 

public class Demo01 {
        public static void main(String args[])
        {
            Student s = new Student();

    //在 Person  類中為屬性賦值       

  s.name = "Michael";
            s.age = 25;

    //在 Student  類中為屬性賦值
            s.school = "Camoridge University " ;
            System.out.println(s.getInfo()+"\n"+"學校:---"+s.school);

            }
        }

運行結果如下

p1

  3多態性

  同一個信息被不同的對象接收到時可能產生完全不同行為,這就是多態性。通過繼承過程中的方法重寫就可以實現多態。多態可以改善程序的組織構架,提高程序的可讀性,也是程序更容易擴充。

用下面的程序說明一下:

class A   
{
        public void fun1()
        {
                System.out.println("使用父類方法!");
        }
}
class B extends A
{
        // 此方法重寫父類中的fun1()方法
        public void fun1()
        {
                System.out.println("父類方法已被子類方法重寫!"+"\n"+"使用子類方法");
        }
}
public class Overrid
{
        public static void main(String args[])
        {
                A a = new A();
                B b = new B();
                a.fun1();
                b.fun1();
        }
}

運行結果如下:

p3

同樣使用了fun1()方法,在父類和子類中產生了完全不同的結果。

  在此簡單說明一下重寫和重載的區別。重寫(Override)是發生在子類和父類之間,為滿足需要,子類對從父類中繼承來的方法進行重寫,方法的名稱和參數類型或個數相同但是子類方法的訪問權限不可以比父類更嚴格。而重載(Overloading)只發生在同一個類中,方法的名稱相同,但是參數的個數或者類型不同。