Java抽象類、繼承及多型和介面卡的實現

伊萬發表於2021-06-14

Java繼承

方法重寫是Java語言多型的特性,必須滿足以下條件

  1. 在子類中,方法名稱與父類方法名稱完全相同
  2. 方法的引數個數和型別完全相同,返回型別完全相同
  3. 方法的訪問修飾符訪問級別不低於父類同名方法的訪問級別
  4. 在方法上新增@override註釋,如果報錯說明不是重寫

方法重寫限制

  1. final修飾的父類方法在子類中不能被重寫
  2. static修飾的父類方法在子類中不能被重寫,只能覆蓋

super關鍵字

  1. super關鍵字和this類似,super修飾的是父類的物件,如super();呼叫的是父類的預設無參構造器

 

Java抽象類

抽象類特點

  1. 抽象類通常應包含抽象方法,也可以包含非抽象方法
  2. 抽象類不能使用final關鍵字修飾
  3. 抽象類自身不能夠例項化
  4. 抽象類就是用來被繼承的

 

抽象類的繼承

  1. 子類必須實現父類所有的抽象方法
  2. 如果子類已經override實現父類的抽象方法,間接子類可以不用實現該方法。

 

介面卡

  1. 定義一個介面卡,類名+Adapator。比如MamalAdapator。繼承給父類所有的方法一個空的實現。後面例項的類繼承這個介面卡,就可以選擇性的重寫實現部分父類的方法而不會報錯。
  2. 抽象類只提供一個抽象方法然後供子類去繼承和重寫override,然後特別是override的這個功能,可以做到比如Dog.eat,Cat.eat,不同的類,有不同的方法實現,但是方法名稱都相同,給開發提供了極大的靈活性,後面的程式設計師接手開發的時候,比如需要再新增Tiger.eat,只需要再寫一個Tiger類繼承父類再override他的eat方法就可以了。
/**
 * 1 使用Eclipse 工具建立一個普通Java控制檯應用程式, 自定義一個類繼承Counter 類,
 * 並根據理解定義在Counter類中定義的抽象方法對父類的抽象方法進行實現,體會普通類繼承
 * 抽象類必需做什麼? 不同子類在繼承Counter抽象類並實現抽象方法時的演算法和什麼有關.
 */

public class Test {
    public static void main(String[] args) {
        //用父類的型別去new一個子類
        Counter cou = new Add();
        //用父類的型別去呼叫子類的addition方法並實現
        System.out.println("3+9的和是"+cou.addition(3,9));
    }
}
/**
 * 1 使用Eclipse 工具建立一個普通Java控制檯應用程式,
 * 自定義一個類繼承Counter 類,並根據理解定義在Counter
 * 類中定義的抽象方法對父類的抽象方法進行實現,體會普通類
 * 繼承抽象類必需做什麼? 不同子類在繼承Counter抽象類並
 * 實現抽象方法時的演算法和什麼有關.
 */

//定義一個抽象的父類Counter
public abstract class Counter {
    //定義一個抽象方法addition
    public abstract int addition(int num1, int num2);

    public Counter(){
        System.out.println("呼叫Counter父類構造器");
    }
}
/**
 * 1 使用Eclipse 工具建立一個普通Java控制檯應用程式,
 * 自定義一個類繼承Counter 類,並根據理解定義在Counter類中
 * 定義的抽象方法對父類的抽象方法進行實現,體會普通類繼承抽象
 * 類必需做什麼? 不同子類在繼承Counter抽象類並實現抽象方法
 * 時的演算法和什麼有關.
 */

public class Add extends Counter{

    int num1 = 0;
    int num2 = 0;

    //重寫父類中的加法並實現加法
    @Override
    public int addition(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
        return num1+num2;

    }

    public Add(){
        System.out.println("呼叫Add子類構造器");
    }
}

-----------------------------------------------分割線--------------------------------------------------------------

/**
 *2 生活中很多東西都可以被人利用從而作為一種工具,這些工具都具備一個共同的功能那就是“用途”,
 * 同時也有很多適合某個領域的工具(如,交通工具,建築工具等 ),它們也在工具的範疇之內, 也有用
 * 途功能,同時又具備自己的一些領域功能, 人們在使用這些工具時,可以根據實際情況選擇哪種具體
 * 類別的工具實體.
 * 根據以上描述,結合本單元知識點,設計工具抽象類定義用途的抽象方法,在此類的基礎上定義在此抽
 * 象工具類範疇內的至少2種特殊工具的抽象類並繼承上述的工具類 , 再根據實際使用工具的情況定
 * 義更具體的工具類實現對2種特殊工具類其一的繼承, 分別例項化頂級工具類及特殊工具類物件,調
 * 用其中功能方法, 理解領悟抽象類之間的繼承及實現多層繼承的普通類要注意哪些問題.
 *
 * 3 繼任務2實現, 當我們在使用繼承抽象父類的時候, 我們的本意只是為使用某個抽象類的特定方法,
 * 但是受於普通類繼承抽象類的限制,必需實現所有父級抽象類中的所有方法,既使不用那些方法也必需
 * 在子類中提供抽象方法的空實現,如何解決這個問題呢, 請在任務2的基礎上程式設計實現.
 */

package tool.test;

import tool.abstracts.Construct;
import tool.abstracts.Tool;
import tool.abstracts.Traffic;
import tool.imp.Car;
import tool.imp.Hammer;

public class Test {
    public static void main(String[] args) {
        //例項化頂級工具類物件,呼叫其中功能方法
        Tool tool1 = new Traffic() {
            @Override
            public void constructTool() {

            }
        };
        tool1.trafficTool();

        Tool tool2 = new Construct() {
            @Override
            public void trafficTool() {

            }
        };
        tool2.constructTool();

        //例項化特殊工具類物件,呼叫其中功能方法
        Traffic traffic = new Car();
        traffic.trafficTool();

        Construct construct = new Hammer();
        construct.constructTool();


    }
}
/**
 *2 生活中很多東西都可以被人利用從而作為一種工具,這些工具都具備一個共同的功能那就是“用途”,
 * 同時也有很多適合某個領域的工具(如,交通工具,建築工具等 ),它們也在工具的範疇之內, 也有用
 * 途功能,同時又具備自己的一些領域功能, 人們在使用這些工具時,可以根據實際情況選擇哪種具體
 * 類別的工具實體.
 * 根據以上描述,結合本單元知識點,設計工具抽象類定義用途的抽象方法,在此類的基礎上定義在此抽
 * 象工具類範疇內的至少2種特殊工具的抽象類並繼承上述的工具類 , 再根據實際使用工具的情況定
 * 義更具體的工具類實現對2種特殊工具類其一的繼承, 分別例項化頂級工具類及特殊工具類物件,調
 * 用其中功能方法, 理解領悟抽象類之間的繼承及實現多層繼承的普通類要注意哪些問題.
 *
 * 3 繼任務2實現, 當我們在使用繼承抽象父類的時候, 我們的本意只是為使用某個抽象類的特定方法,
 * 但是受於普通類繼承抽象類的限制,必需實現所有父級抽象類中的所有方法,既使不用那些方法也必需
 * 在子類中提供抽象方法的空實現,如何解決這個問題呢, 請在任務2的基礎上程式設計實現.
 */

package tool.abstracts;

//定義一個tool抽象類
public abstract class Tool {
    //定義一個交通工具抽象方法
    public abstract void trafficTool();
    //定義一個建築工具抽象方法
    public abstract void constructTool();
}
/**
 *2 生活中很多東西都可以被人利用從而作為一種工具,這些工具都具備一個共同的功能那就是“用途”,
 * 同時也有很多適合某個領域的工具(如,交通工具,建築工具等 ),它們也在工具的範疇之內, 也有用
 * 途功能,同時又具備自己的一些領域功能, 人們在使用這些工具時,可以根據實際情況選擇哪種具體
 * 類別的工具實體.
 * 根據以上描述,結合本單元知識點,設計工具抽象類定義用途的抽象方法,在此類的基礎上定義在此抽
 * 象工具類範疇內的至少2種特殊工具的抽象類並繼承上述的工具類 , 再根據實際使用工具的情況定
 * 義更具體的工具類實現對2種特殊工具類其一的繼承, 分別例項化頂級工具類及特殊工具類物件,調
 * 用其中功能方法, 理解領悟抽象類之間的繼承及實現多層繼承的普通類要注意哪些問題.
 *
 * 3 繼任務2實現, 當我們在使用繼承抽象父類的時候, 我們的本意只是為使用某個抽象類的特定方法,
 * 但是受於普通類繼承抽象類的限制,必需實現所有父級抽象類中的所有方法,既使不用那些方法也必需
 * 在子類中提供抽象方法的空實現,如何解決這個問題呢, 請在任務2的基礎上程式設計實現.
 */

package tool.abstracts;

//定義一個交通工具抽象類繼承自工具類
public abstract class Traffic extends Tool {

    public void trafficTool(){
        System.out.println("我是所有交通工具的集合");
    };
}
/**
 *2 生活中很多東西都可以被人利用從而作為一種工具,這些工具都具備一個共同的功能那就是“用途”,
 * 同時也有很多適合某個領域的工具(如,交通工具,建築工具等 ),它們也在工具的範疇之內, 也有用
 * 途功能,同時又具備自己的一些領域功能, 人們在使用這些工具時,可以根據實際情況選擇哪種具體
 * 類別的工具實體.
 * 根據以上描述,結合本單元知識點,設計工具抽象類定義用途的抽象方法,在此類的基礎上定義在此抽
 * 象工具類範疇內的至少2種特殊工具的抽象類並繼承上述的工具類 , 再根據實際使用工具的情況定
 * 義更具體的工具類實現對2種特殊工具類其一的繼承, 分別例項化頂級工具類及特殊工具類物件,調
 * 用其中功能方法, 理解領悟抽象類之間的繼承及實現多層繼承的普通類要注意哪些問題.
 *
 * 3 繼任務2實現, 當我們在使用繼承抽象父類的時候, 我們的本意只是為使用某個抽象類的特定方法,
 * 但是受於普通類繼承抽象類的限制,必需實現所有父級抽象類中的所有方法,既使不用那些方法也必需
 * 在子類中提供抽象方法的空實現,如何解決這個問題呢, 請在任務2的基礎上程式設計實現.
 */

package tool.abstracts;

//定義一個建築工具抽象類繼承自工具類
public abstract class Construct extends Tool {

    public void constructTool(){
        System.out.println("我是所有建築工具的集合");
    };
}
/**
 *2 生活中很多東西都可以被人利用從而作為一種工具,這些工具都具備一個共同的功能那就是“用途”,
 * 同時也有很多適合某個領域的工具(如,交通工具,建築工具等 ),它們也在工具的範疇之內, 也有用
 * 途功能,同時又具備自己的一些領域功能, 人們在使用這些工具時,可以根據實際情況選擇哪種具體
 * 類別的工具實體.
 * 根據以上描述,結合本單元知識點,設計工具抽象類定義用途的抽象方法,在此類的基礎上定義在此抽
 * 象工具類範疇內的至少2種特殊工具的抽象類並繼承上述的工具類 , 再根據實際使用工具的情況定
 * 義更具體的工具類實現對2種特殊工具類其一的繼承, 分別例項化頂級工具類及特殊工具類物件,調
 * 用其中功能方法, 理解領悟抽象類之間的繼承及實現多層繼承的普通類要注意哪些問題.
 *
 * 3 繼任務2實現, 當我們在使用繼承抽象父類的時候, 我們的本意只是為使用某個抽象類的特定方法,
 * 但是受於普通類繼承抽象類的限制,必需實現所有父級抽象類中的所有方法,既使不用那些方法也必需
 * 在子類中提供抽象方法的空實現,如何解決這個問題呢, 請在任務2的基礎上程式設計實現.
 */

package tool.adaptor;

import tool.abstracts.Construct;

//定義一個Construct的介面卡
public class ConstructAdaptor extends Construct {

    //對交通工具方法進行一個重寫和空實現
    @Override
    public void trafficTool() {

    }
    //對建築工具方法進行一個重寫和空實現
    @Override
    public void constructTool() {

    }
}
/**
 *2 生活中很多東西都可以被人利用從而作為一種工具,這些工具都具備一個共同的功能那就是“用途”,
 * 同時也有很多適合某個領域的工具(如,交通工具,建築工具等 ),它們也在工具的範疇之內, 也有用
 * 途功能,同時又具備自己的一些領域功能, 人們在使用這些工具時,可以根據實際情況選擇哪種具體
 * 類別的工具實體.
 * 根據以上描述,結合本單元知識點,設計工具抽象類定義用途的抽象方法,在此類的基礎上定義在此抽
 * 象工具類範疇內的至少2種特殊工具的抽象類並繼承上述的工具類 , 再根據實際使用工具的情況定
 * 義更具體的工具類實現對2種特殊工具類其一的繼承, 分別例項化頂級工具類及特殊工具類物件,調
 * 用其中功能方法, 理解領悟抽象類之間的繼承及實現多層繼承的普通類要注意哪些問題.
 *
 * 3 繼任務2實現, 當我們在使用繼承抽象父類的時候, 我們的本意只是為使用某個抽象類的特定方法,
 * 但是受於普通類繼承抽象類的限制,必需實現所有父級抽象類中的所有方法,既使不用那些方法也必需
 * 在子類中提供抽象方法的空實現,如何解決這個問題呢, 請在任務2的基礎上程式設計實現.
 */

package tool.adaptor;

import tool.abstracts.Traffic;

//定義一個Traffic的介面卡
public class TrafficAdaptor extends Traffic {

    //對交通工具方法進行一個重寫和空實現
    @Override
    public void trafficTool() {
        System.out.println("我是所有交通工具的集合");
    }
    //對建築工具方法進行一個重寫和空實現
    @Override
    public void constructTool() {

    }
}
/**
 *2 生活中很多東西都可以被人利用從而作為一種工具,這些工具都具備一個共同的功能那就是“用途”,
 * 同時也有很多適合某個領域的工具(如,交通工具,建築工具等 ),它們也在工具的範疇之內, 也有用
 * 途功能,同時又具備自己的一些領域功能, 人們在使用這些工具時,可以根據實際情況選擇哪種具體
 * 類別的工具實體.
 * 根據以上描述,結合本單元知識點,設計工具抽象類定義用途的抽象方法,在此類的基礎上定義在此抽
 * 象工具類範疇內的至少2種特殊工具的抽象類並繼承上述的工具類 , 再根據實際使用工具的情況定
 * 義更具體的工具類實現對2種特殊工具類其一的繼承, 分別例項化頂級工具類及特殊工具類物件,調
 * 用其中功能方法, 理解領悟抽象類之間的繼承及實現多層繼承的普通類要注意哪些問題.
 *
 * 3 繼任務2實現, 當我們在使用繼承抽象父類的時候, 我們的本意只是為使用某個抽象類的特定方法,
 * 但是受於普通類繼承抽象類的限制,必需實現所有父級抽象類中的所有方法,既使不用那些方法也必需
 * 在子類中提供抽象方法的空實現,如何解決這個問題呢, 請在任務2的基礎上程式設計實現.
 */

package tool.imp;

import tool.adaptor.TrafficAdaptor;

//定義一個普通類並具體實現交通工具方法
public class Car extends TrafficAdaptor {
    @Override
    public void trafficTool() {
        System.out.println("我是交通工具汽車");
    }
}
/**
 *2 生活中很多東西都可以被人利用從而作為一種工具,這些工具都具備一個共同的功能那就是“用途”,
 * 同時也有很多適合某個領域的工具(如,交通工具,建築工具等 ),它們也在工具的範疇之內, 也有用
 * 途功能,同時又具備自己的一些領域功能, 人們在使用這些工具時,可以根據實際情況選擇哪種具體
 * 類別的工具實體.
 * 根據以上描述,結合本單元知識點,設計工具抽象類定義用途的抽象方法,在此類的基礎上定義在此抽
 * 象工具類範疇內的至少2種特殊工具的抽象類並繼承上述的工具類 , 再根據實際使用工具的情況定
 * 義更具體的工具類實現對2種特殊工具類其一的繼承, 分別例項化頂級工具類及特殊工具類物件,調
 * 用其中功能方法, 理解領悟抽象類之間的繼承及實現多層繼承的普通類要注意哪些問題.
 *
 * 3 繼任務2實現, 當我們在使用繼承抽象父類的時候, 我們的本意只是為使用某個抽象類的特定方法,
 * 但是受於普通類繼承抽象類的限制,必需實現所有父級抽象類中的所有方法,既使不用那些方法也必需
 * 在子類中提供抽象方法的空實現,如何解決這個問題呢, 請在任務2的基礎上程式設計實現.
 */

package tool.imp;

import tool.adaptor.ConstructAdaptor;

//定義一個普通類並具體實現建築工具方法
public class Hammer extends ConstructAdaptor {
    @Override
    public void constructTool(){
        System.out.println("我是建築工具錘子");
    }
}

-----------------------------------分割線-----------------------------------

/**
 * 4 在生活中,人們都會根據實際情況為完成某項任務而選擇利用不同的工具.
 * 如我要旅行,會用到汽車或者飛機,我在列印檔案時會用到印表機,我要學習
 * java會用到膝上型電腦, 如何設計一個應用程式定義一個人類並在人類中
 * 定義一個使用工具的方法, 能夠讓在真正使用工具時, 用什麼工具則這個
 * 工具就能夠出現在使用工具的過程中,請根據java語言繼承及多型的特點
 * 完成此程式設計任務.
 */

package test;

import abstracts.Tool;
import imp.*;

//定義一個主類Test
public class Test {
    public static void main(String[] args) {
        //例項化Person類
        Person per = new Person();
        //通過多型的方式,以父類的型別例項化各個子類
        Tool car = new Car();
        Tool plane = new Plane();
        Tool print = new Printer();
        Tool laptop = new Laptop();

        //呼叫對應的子類去具體實現抽象方法
        per.useTool(car);
        per.useTool(plane);
        per.useTool(print);
        per.useTool(laptop);
    }
}
/**
 * 4 在生活中,人們都會根據實際情況為完成某項任務而選擇利用不同的工具.
 * 如我要旅行,會用到汽車或者飛機,我在列印檔案時會用到印表機,我要學習
 * java會用到膝上型電腦, 如何設計一個應用程式定義一個人類並在人類中
 * 定義一個使用工具的方法, 能夠讓在真正使用工具時, 用什麼工具則這個
 * 工具就能夠出現在使用工具的過程中,請根據java語言繼承及多型的特點
 * 完成此程式設計任務.
 */

package abstracts;

//定義一個抽象的工具類作為父類
public abstract class Tool {
    //定義一個旅行的抽象方法
    public abstract void travel();

    //定義一個列印的抽象方法
    public abstract void print();

    //定義一個學習的抽象方法
    public abstract void study();
}
/**
 * 4 在生活中,人們都會根據實際情況為完成某項任務而選擇利用不同的工具.
 * 如我要旅行,會用到汽車或者飛機,我在列印檔案時會用到印表機,我要學習
 * java會用到膝上型電腦, 如何設計一個應用程式定義一個人類並在人類中
 * 定義一個使用工具的方法, 能夠讓在真正使用工具時, 用什麼工具則這個
 * 工具就能夠出現在使用工具的過程中,請根據java語言繼承及多型的特點
 * 完成此程式設計任務.
 */
package adaptor;

import abstracts.Tool;

//定義一個介面卡,繼承工具類並提供3個方法的空實現
public class ToolAdaptor extends Tool {
    @Override
    public void travel() {

    }

    @Override
    public void print() {

    }

    @Override
    public void study() {

    }
}
/**
 * 4 在生活中,人們都會根據實際情況為完成某項任務而選擇利用不同的工具.
 * 如我要旅行,會用到汽車或者飛機,我在列印檔案時會用到印表機,我要學習
 * java會用到膝上型電腦, 如何設計一個應用程式定義一個人類並在人類中
 * 定義一個使用工具的方法, 能夠讓在真正使用工具時, 用什麼工具則這個
 * 工具就能夠出現在使用工具的過程中,請根據java語言繼承及多型的特點
 * 完成此程式設計任務.
 */
package imp;

import adaptor.ToolAdaptor;

//定義一個汽車類繼承父類的介面卡,重寫並具體實現旅行的這個抽象方法
public class Car extends ToolAdaptor {
    @Override
    public void travel() {
        System.out.println("使用汽車旅行");
    }
}
/**
 * 4 在生活中,人們都會根據實際情況為完成某項任務而選擇利用不同的工具.
 * 如我要旅行,會用到汽車或者飛機,我在列印檔案時會用到印表機,我要學習
 * java會用到膝上型電腦, 如何設計一個應用程式定義一個人類並在人類中
 * 定義一個使用工具的方法, 能夠讓在真正使用工具時, 用什麼工具則這個
 * 工具就能夠出現在使用工具的過程中,請根據java語言繼承及多型的特點
 * 完成此程式設計任務.
 */
package imp;

import adaptor.ToolAdaptor;

//定義一個飛機類繼承父類的介面卡,重寫並具體實現旅行的這個抽象方法
public class Plane extends ToolAdaptor {
    @Override
    public void travel(){
        System.out.println("使用飛機旅行");
    }
}
/**
 * 4 在生活中,人們都會根據實際情況為完成某項任務而選擇利用不同的工具.
 * 如我要旅行,會用到汽車或者飛機,我在列印檔案時會用到印表機,我要學習
 * java會用到膝上型電腦, 如何設計一個應用程式定義一個人類並在人類中
 * 定義一個使用工具的方法, 能夠讓在真正使用工具時, 用什麼工具則這個
 * 工具就能夠出現在使用工具的過程中,請根據java語言繼承及多型的特點
 * 完成此程式設計任務.
 */
package imp;

import adaptor.ToolAdaptor;

//定義一個膝上型電腦類繼承父類的介面卡,重寫並具體實現學習的這個抽象方法
public class Laptop extends ToolAdaptor {
    @Override
    public void study(){
        System.out.println("使用膝上型電腦學習Java");
    }
}
/**
 * 4 在生活中,人們都會根據實際情況為完成某項任務而選擇利用不同的工具.
 * 如我要旅行,會用到汽車或者飛機,我在列印檔案時會用到印表機,我要學習
 * java會用到膝上型電腦, 如何設計一個應用程式定義一個人類並在人類中
 * 定義一個使用工具的方法, 能夠讓在真正使用工具時, 用什麼工具則這個
 * 工具就能夠出現在使用工具的過程中,請根據java語言繼承及多型的特點
 * 完成此程式設計任務.
 */
package imp;

import adaptor.ToolAdaptor;

//定義一個印表機類繼承父類的介面卡,重寫並具體實現列印的這個抽象方法
public class Printer extends ToolAdaptor {
    @Override
    public void print() {
        System.out.println("使用印表機列印檔案");
    }


}
/**
 * 4 在生活中,人們都會根據實際情況為完成某項任務而選擇利用不同的工具.
 * 如我要旅行,會用到汽車或者飛機,我在列印檔案時會用到印表機,我要學習
 * java會用到膝上型電腦, 如何設計一個應用程式定義一個人類並在人類中
 * 定義一個使用工具的方法, 能夠讓在真正使用工具時, 用什麼工具則這個
 * 工具就能夠出現在使用工具的過程中,請根據java語言繼承及多型的特點
 * 完成此程式設計任務.
 */

package imp;

import abstracts.Tool;

//定義一個Person類
public class Person {
    //定義一個使用工具的方法,接收tool抽象類的型別,並呼叫tool抽象類的三個抽象方法
    public void useTool(Tool tool){
        tool.travel();
        tool.print();
        tool.study();
    }
}

 

相關文章