學習部落格之Java繼承多型介面

whlzb發表於2017-11-18

這一篇部落格主要是對軟工前一階段學習的總結,主要是對Java的學習總結,包括三部分:Java的繼承、多型和介面

Java的繼承

繼承是物件導向的三大特性之一,能夠實現軟體的複用。
Java子類繼承父類的語法格式如下

class SubClass extends SuperClass
{
        //類定義部分
}

Java繼承的特點:

  • Java只有單繼承,即每個子類都只有一個直接父類。
  • 子類繼承父類,可以獲得父類全部成員變數和方法
  • 子類不能獲得父類的構造器

子類重寫父類的方法

  • 子類和父類的方法名形參列一樣
  • 方法的重寫遵循“兩小一大”的原則,即子類返回值型別應比父類返回值型別更小或相等;子類方法宣告丟擲的異常應比父類方法宣告丟擲的異常更小或相等;子類方法的訪問許可權應比父類方法的訪問許可權更大或相等
  • 當子類覆蓋了父類方法後,子類的物件無法訪問父類中被覆蓋的方法,但可以在子類方法中呼叫父類中被覆蓋的方法,使用super.方法名(被覆蓋的如果是類方法, 則用父類類名)

呼叫父類構造器

  • 子類構造器呼叫父類構造器用super呼叫來完成,且必須出現在子類構造器執行體中的第一行
  • 父類構造器總是在子類構造器之前執行

下面是一個Java繼承的簡單例子,該例子中包含,類的繼承、子類重寫父類方法、super的使用


package example;

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void setName(String name) {
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        this.age=age;
    }
    public int getAge() {
        return age;
    }
    
    public void sayHello() {
        System.out.println("Hello,I am "+name);
    }
}

class Student extends Person{
    private int number;
    private String school;
    public void SetNumber(int number) {
        this.number=number;
    }
    public int getNumber() {
        return number;
    }
    public void setSchool(String school) {
        this.school=school;
    }
    public String getSchool() {
        return school;
    }
    public  Student(String name,int age,int number,String school) {
        super(name,age);
        this.number=number;
        this.school=school;
    }
    public void sayHello() {
        System.out.println("I am a student of "+school+"and my name is "+getName());
    }

}
public class ExampleOfExtend {
    public static void main(String[] args) {
        Student stu=new Student("Xiao wang", 19, 123, "Fzu");
        System.out.println(stu.getName());
        System.out.println(stu.getAge());
        System.out.println(stu.getNumber());
        System.out.println(stu.getSchool());
        stu.sayHello();
    }
}

以上是我在學習Java繼承中總結出來的一些知識點,還包括了自己寫的一個例子。

Java的多型

Java允許把一個子類物件直接賦給父類引用變數,無需任何型別轉換。如果子類物件賦給父類的引用變數,當執行呼叫該引用變數的方法時,其方法行為總是表現出子類方法的行為特徵,而不是父類方法的特徵,這就可能出現:相同型別的變數、呼叫同一個方法時呈現出不同的行為特徵,這就是多型。

下面將結合一個例子來講解多型

class BaseClass
{
    public int book = 6;
    public void base()
    {
        System.out.println("父類的普通方法");
    }
    public void test()
    {
        System.out.println("父類的被覆蓋的方法");
    }
}
class SubClass extends BaseClass
{
    public String book = "Java";
    public void sub()
    {
        System.out.println("子類的普通方法");
    }
    public void test()
    {
        System.out.println("子類的覆蓋父類的方法");
    }
    
    
}

public class ExampleOfPolymorphism {
    public static void main(String[] args)
    {
        BaseClass pl= new SubClass();  //將子類物件賦給父類變數,可能發生多型
        System.out.println(pl.book);  //訪問的是父類物件的例項變數
        pl.base();  //將執行從父類繼承到的base()方法
        pl.test();  //將執行從子類的test()方法
        // pl.sub();這一行程式碼編譯時將會出現錯誤,因為pl的編譯型別是BaseClass,BaseClass類沒有提供sub方法
    }
}

上面程式定義了一個BaseClass類,有一個變數book,兩個方法:base和test;一個子類SubClass,有一個同名變數book,兩個方法:sub、改寫父類方法的test。在主函式中宣告瞭BaseClass型別的po,但實際賦給這個變數的是SubClass型別。通過pl.book呼叫的是父類的變數,表明物件的例項變數不具有多型性。其他執行時所呼叫的方法已經寫在程式碼註釋上,不再贅述。

還有一點要提的是引用型別的轉換。子類的物件可以直接賦給父類的引用變數,無需經過任何轉型(向上轉型)。如果要將一個父類物件轉換成子類型別,則這個物件必須實際上是子類例項才行。

以上就是我在學習Java多型時的總結和自己寫的一個例子。

java介面

介面裡不能包含普通方法,介面裡的所有方法都是抽象方法,介面是從多個相似類中抽象出來的規範。Java8對介面進行了改進,允許在介面中定義預設方法,預設方法可以提供方法實現。
Java中介面的定義

[修飾符] interface 介面名 extends 父介面1,父介面2...{
    零到多個常量定義...
    零到多個抽象方法定義...
    零到多個內部類、介面、枚定義...
    零到多個預設方法或類方法定義...//Only in java8
}

對比類定義,介面定義少了初始化塊和構造器,且介面成員變數只能是靜態常量(成員變數總是是public static final來修飾,可以省略),介面方法只能是抽象方法、類方法或預設方法(方法總是用public abstract來修飾,可以省略)。介面裡的變數都必須指定初始值,介面裡普通方法不能有方法體實現,類方法和預設方法必須有方法體實現。一個Java檔案最多隻能有一個public修飾的介面,如果定義了一個public介面,需與主檔名一致。

下面是一個簡單的介面定義和繼承的例子

interface interfaceA{
    int a=5;
    void testA();
}
interface interfaceB extends interfaceA{ //interfaceB繼承了interfaceA
    int b=6;
    void testB();
}

public class ExampleOfPolymorphism {
    public static void main(String[] args)
    {
        System.out.println(interfaceB.a);
        System.out.println(interfaceB.b);
    }
}

以上是我學習Java介面中的一些總結和一個簡單的例子。

總結

通過《軟工》,自己在以前的基礎上學習了Java,但是還是隻停留在一個很淺的水平上,像Java的AWT程式設計和Swing程式設計還沒學習,希望在接下去的半學期,自己能多多少少再學一些。

相關文章