Java入門教程九(封裝繼承多態)

封裝

封裝就是將對象的屬性和方法相結合,經過方法將對象的屬性和實現細節保護起來,實現對象的屬性隱藏。作法就是:修改屬性的可見性來限制對屬性的訪問,併爲每一個屬性建立一對取值(getter)方法和賦值(setter)方法,用於對這些屬性的訪問。java

public class Person
{
    private String name;     //姓名
    private int age;         //年齡
    private String phone;    //聯繫電話
    private String address;  //家庭住址
    
    public String getName()
    {
        return name;
    }
    
    public void setName(String name)
    {
        this.name=name;
    }
    
    public int getAge()
    {
        return age;
    }
    
    public void setAge(int age)//封裝的經常使用表現,在內部進行業務邏輯的控制,外部只調用便可
    {
        if(age<18||age>40)//對年齡進行限制
        {
            System.out.println("年齡必須在18到40之間!");
            this.age=20;    //默認年齡
        }
        else
        {
            this.age=age;
        }
    }
    
    public String getPhone()
    {
        return phone;
    }
    
    public void setPhone(String phone)
    {
        this.phone=phone;
    }
    
    public String getAddress()
    {
        return address;
    }
    
    public void setAddress(String address)
    {
        this.address=address;
    }
}

繼承

繼承是代碼複用的一種形式,即在具備包含關係的類中,從屬類繼承主類的所有屬性和方法,從而減小了代碼冗餘,提升了程序運行效率。例如,一個矩形(Rectangle類)屬於四邊形(Quadrilateral),正方形、平行四邊形和梯形一樣都屬於四邊形。從類的角度來解釋,能夠說成 Rectangle 類是從 Quadrilateral 類繼承而來的,其中 Quadrilateral 類是基類,Rectangle 類是派生類。編程

繼承是經過擴展其餘類而造成新類來實現的,原來的類稱爲父類(super class)或基類,新類稱爲原來類的子類或派生類。在子類中,不只包含父類的屬性和方法,還能夠增長新的屬性和方法,使得父類的基本特徵可被全部子類的對象共享。類的繼承並不改變類成員的訪問權限。也就是說,若是父類的成員是公有的、被保護的或默認的,它的子類仍具備相應的這些特性。this

class class_name extends extend_class
{
    //類的主體
}
public class Person
{
    public String name;   //姓名
    public int age;       //年齡
    public String sex;    //性別
}
public class Student extends Person
{
    private String stuNo;         //學號
    private String department;    //所學專業
}
//學生繼承了人類,同時具備了,姓名、年齡、性別屬性

多態

多態性是面向對象編程的又一個重要特徵,它是指在父類中定義的屬性和方法被子類繼承以後,能夠具備不一樣的數據類型或表現出不一樣的行爲,這使得同一個屬性或方法在父類及其各個子類中具備不一樣的含義。code

對面向對象來講,多態分爲編譯時多態和運行時多態。其中編譯時多態是靜態的,主要是指方法的重載,它是根據參數列表的不一樣來區分不一樣的方法。經過編譯以後會變成兩個不一樣的方法,在運行時談不上多態。而運行時多態是動態的,它是經過動態綁定來實現的,也就是你們一般所說的多態性。對象

public class Figure
{
    double dim1;
    double dim2;
    Figure(double d1,double d2)//有參的構造方法
    {
        this.dim1=d1;
        this.dim2=d2;
    }
    double area()//用於計算對象的面積
    {
        System.out.println("經過多態,在子類中重寫。");
        return 0;
    }
}
public class Rectangle extends Figure
{
    Rectangle(double d1,double d2)
    {
        super(d1,d2);
    }
    double area()
    {
        System.out.println("長方形的面積:");
        return super.dim1*super.dim2;
    }
}
public class Triangle extends Figure
{
    Triangle(double d1,double d2)
    {
        super(d1,d2);
    }
    double area()
    {
        System.out.println("三角形的面積:");
        return super.dim1*super.dim2/2;
    }
}
public static void main(String[] args)
{
    Figure figure;                     //聲明Figure類的變量
    figure=new Rectangle(9,9);
    System.out.println(figure.area()); //輸出:長方形的面積:81。
    figure=new Triangle(6,8);
    System.out.println(figure.area()); //輸出:三角形的面積:24。
}

重載

重載是 Java 多態性的表現。在 Java 語言中,同一個類中的兩個或多個方法能夠共享同一個名稱,只要它們的參數聲明不一樣便可,這種狀況被稱爲方法重載blog

在 JDK 的 java.io.PrintStream 中定義了十多個同名的 println() 方法繼承

public void printin(int i){…}
public void println(double d){…}
public void println(String s){…}
System.out.println(102);       //調用println(int i)方法
System.out.println(102.25);    //調用println(double d)方法
System.out.println("價格爲 102.25");    //調用println(String s)方法

方法重載時必需要注意如下兩點:get

重載方法的參數列表必須和被重載的方法不一樣,而且這種不一樣必須足以清楚地肯定要調用哪個方法。io

重載方法的返回值類型能夠和被重載的方法相同,也能夠不一樣,可是隻有返回值類型不一樣不能表示爲重載。編譯

pubic class Person{
    private String name;
    //方法一
    public Person(){
    }
    //重載方法,可直接設置姓名
    public Person(String _name){
        this.name = _name;
    }
}

重寫

子類中若是建立了一個與父類中相同名稱、相同返回值類型、相同參數列表的方法,只是方法體中的實現不一樣,以實現不一樣於父類的功能,這種方式被稱爲方法重寫,又稱爲方法覆蓋。
在重寫方法時,須要遵循下面的規則:
參數列表必須徹底與被重寫的方法參數列表相同,不然不能稱其爲重寫。
返回的類型必須與被重寫的方法的返回類型相同,不然不能稱其爲重寫。
訪問修飾符的限制必定要大於被重寫方法的訪問修飾符(public>protected>default>private)。
重寫方法必定不能拋出新的檢査異常或者比被重寫方法聲明更加寬泛的檢査型異常。例女口,父類的一個方法聲明瞭一個檢査異常 IOException,在重寫這個方法時就不能拋出 Exception,只能拋出 IOException 的子類異常,能夠拋出非檢査異常。

public class Person
{
    public String name;    //名字
    public int age;        //年齡
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public String getInfo()
    {
        return "我叫"+name+",今年"+age+"歲";
    }
}
public class Student extends Person
{
    private String hobby;
    public Student(String name,int age,String hobby)
    {
        super(name,age);
        this.hobby=hobby;
    }
    public String getInfo()
    {
        return"我叫"+this.name+",我今年"+this.age+"歲,我愛吃"+hobby+"。";
    }
}
public static void main(String[] args)
{
    Person person=new Student("小明",20,"雞");
    System.out.println(animal.getInfo());  //輸出:我叫小明,我今年20歲,我愛吃雞。
}
相關文章
相關標籤/搜索