程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java實驗3 類的多態性和接口

Java實驗3 類的多態性和接口

編輯:JAVA綜合教程

Java實驗3 類的多態性和接口


一、實驗目的

理解面向對象的多態性。理解接口和實現接口的類的關系,掌握一個類實現多個接口的聲明和使用方法。

二、實驗內容

1.程序理解:

接口的應用

//接口的應用
//定義一個PCI接口:
interface PCI {
    void start(); // 定義抽象方法start()

    void stop(); // 定義抽象方法stop()
}

// 定義 NetworkCard類實現PCI接口
class NetworkCard implements PCI {
    // 實現start()方法
    public void start() {
        System.out.println("send...");
    }

    // 實現stop()方法
    public void stop() {
        System.out.println("Network stop.");
    }
}

// 定義 SoundCard類實現PCI接口
class SoundCard implements PCI {
    // 實現start()方法
    public void start() {
        System.out.println("Du Du...");
    }

    // 實現stop()方法
    public void stop() {
        System.out.println("Sound stop.");
    }
}

// 定義MainBoard類
// 將子類對象作為PCI參數傳進來:
class MainBoard {
    // 在這裡傳了一個接口參數p
    // 定義一個userPCICard()方法,接收PCI類型的參數
    public void userPCICard(PCI p) {
        // 正是因為實現了PCI接口裡面的方法,才能將對象傳給這個引用變量
        p.start(); // 調用傳入對象的start()方法
        p.stop(); // 調用傳入對象的stop()方法
    }
}

// 使用接口實現的子類對象
public class Example3 {
    public static void main(String[] args) {
        MainBoard mb = new MainBoard(); // 創建MainBoard類的實例對象
        NetworkCard nc = new NetworkCard(); // 創建NetworkCard類的實例對象nc
        mb.userPCICard(nc); // 調用MainBoard對象的userPCICard()的方法,將nc作為參數傳入
        SoundCard sc = new SoundCard(); // 創建NetworkCard類的實例對象sc
        mb.userPCICard(sc); // 調用MainBoard對象的userPCICard()的方法,將sc作為參數傳入
    }
}

2.編程題:

(1)聲明復數類Complex,成員變量包括double類型的實部real和double類型的虛部im,成員方法包括三個重載的構造方法:實部和虛部構造方法Complex(double real, double im);無參構造方法 Complex(),該無參構造方法內部用this(0,0)調用前一個構造方法;只有實數部分的構造方法Complex(double real),該構造方法內部用this(real,0)調用兩個參數的構造方法。此外,該復數類的成員方法還包括復數加法、復數減法、字符串描述(重寫Object的toString方法,輸出a+bi的形式)、相等比較(判斷兩個復數是否相等,需要重寫Object的equals方法)等方法。定義測試類,在main方法中進行相應的測試。(程序1)


(2)定義兩個接口Area(聲明getArea方法求面積)和Volume(聲明getVolume方法求體積),聲明球類Globe,實現Area和Volume接口,計算球的表面積和體積。設計測試類,在main方法中進行相應的測試。(程序2)


(3)完成如下所示接口的繼承和實現結構,定義測試類,在main方法中進行測試。(接口和類名字可以更改)(程序3)


(4)選做題: 設計一個程序,該程序通過使用父類類型變量引用不同的子類對象,從而實現類型的多態。

三、實驗結果和分析

說明:請截圖給出各個程序的運行結果,並做必要的分析。
(1)程序1運行結果

這裡寫圖片描述

(2)程序2運行結果

這裡寫圖片描述

(3)程序3運行結果

這裡寫圖片描述

(4)程序4運行結果(如選做)<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/160423/042T51D9-3.png" title="\" />

四、實驗源代碼

說明:請將各程序的源代碼復制粘貼到這裡。
(1)程序1源代碼

 import java.util.Scanner;
//定義復數類Complex
class Complex1 {
    double real;
    double im;

    // 定義實部和虛部構造方法
    Complex1(double real, double im) {
        this.real = real;
        this.im = im;
    }

    // 無參構造方法
    Complex1() {
        this(0, 0);
    }

    // 有實數部分的構造方法
    Complex1(double real) {
        this(real, 0);
    }

    // 定義復數加法的方法
    public Complex1 add(Complex1 c) {
        return new Complex1(this.real + c.real, this.im + c.im);
    }

    // 復數減法
    public Complex1 minus(Complex1 c) {
        return new Complex1(this.real - c.real, this.im - c.im);
    }

    // 字符串描述(重寫Object的toString方法,輸出a+bi的形式)
    public String toString() {
        if (im < 0)
            return real + "" + im + "i";
        else
            return real + "+" + im + "i";

    }

    // 相等比較(判斷兩個復數是否相等,需要重寫Object的equals方法)
    public boolean equals(Object obj) {

        Complex1 c = (Complex1) obj;
        if (real == c.real && im == c.im) {
            return true;
        }
        return false;
    }

}

// 定義測試類
public class Example1 {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("請輸入第一個復數的實部和虛部:");
        double a=sc.nextDouble();
        double b=sc.nextDouble();

        Complex1 c1 = new Complex1(a, b);// 創建Complex對象

        System.out.println("請輸入第二個復數的實部和虛部:");
        double c=sc.nextDouble();
        double d=sc.nextDouble();
        /*
        double result;
        double d1 = 1.0;
        double d2 = 1.0;
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        result = bd1.add(bd2).doubleValue(); // 加
        result = bd1.subtract(bd2).doubleValue(); // 減
        result = bd1.multiply(bd2).doubleValue(); // 乘
        result = bd1.divide(bd2, 10, BigDecimal.ROUND_HALF_UP).doubleValue(); // 除,除不盡時保留10位後四捨五入
        */
        Complex1 c2 = new Complex1(c, d);// 創建Complex對象

        System.out.println("("+c1.toString()+")+("+c2.toString()+")=" + (c1.add(c2)));// 調用add方法並打印
        System.out.println("("+c1.toString()+")-("+c2.toString()+")=" + c1.minus(c2));// 調用minus方法並打印

        if(c1.equals(c2))//調用toString方法
            System.out.println(c1.toString()+"="+c2.toString());
        else
            System.out.println(c1.toString()+"≠"+c2.toString());
    }

}

(2)程序2源代碼

import java.util.Scanner;
import java.text.DecimalFormat;

//定義了Area接口
interface Area {
    double getArea(); // 定義抽象方法getArea()
}

// 定義了Volume接口
interface Volume {
    double getVolume(); // 定義抽象方法getVolume()
}

// 聲明球類Globe,實現,計算球的表面積和體積
// Globe類實現了Area和Volume接口
class Globe implements Area, Volume {
    double r;

    public Globe(double r) {
        this.r = r;
    }

    // 實現getArea()方法
    public double getArea() {
        return 4 * Math.PI * r * r;
    }

    // 實現getVolume()方法
    public double getVolume() {
        return 0.75 * Math.PI * r * r * r;
    }
}

// 定義測試類
public class Example4 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        DecimalFormat df = new DecimalFormat("0.00");
        System.out.println("請輸入球的半徑:(單位:cm)");
        double rad = sc.nextDouble();
        Globe globe = new Globe(rad);// 創建Globe類對象實例
        System.out.println("此球的表面積為" + df.format(globe.getArea())+"cm2");// 調用Dog類的getArea()方法
        System.out.println("此球的體積為" + df.format(globe.getVolume())+"cm3");// 調用Dog類的getVolume()方法
    }

}

(3)程序3源代碼

import java.util.Scanner;
import java.text.DecimalFormat;

//定義了平面圖形PlaneGraphics接口
interface PlaneGraphics {
    double area(); // 定義求面積的抽象方法area()

    double perimeter(); // 定義求周長的抽象方法perimeter()
}

// 定義了立體圖形SolidGraphics接口
interface SolidGraphics {
    double volume(); // 定義求體積的抽象方法volume()
}

// 定義長方形Rectangle類實現平面圖形PlaneGraphics接口
class Rectangle implements PlaneGraphics {
    double a, b;

    // 定義了兩個參數的構造函數
    public Rectangle(double a, double b) {
        this.a = a;
        this.b = b;
    }

    // 實現求面積的抽象方法area()
    public double area() {
        return a * b;
    }

    // 實現求周長的抽象方法perimeter()
    public double perimeter() {
        return 2 * (a + b);
    }
}

// 定義長方體Cuboid類繼承長方形Rectangle類的同時實現立體圖形SolidGraphics接口
class Cuboid extends Rectangle implements SolidGraphics {
    double c;

    // 定義了三個參數的構造函數
    public Cuboid(double a, double b, double c) {
        super(a, b);
        this.c = c;
    }

    // 實現求表面積的抽象方法area()
    public double area() {
        return 2 * (a * b + b * c + a * c);
    }

    // 實現求體積的抽象方法volume()
    public double volume() {
        return a * b * c;
    }
}

// 定義測試類
public class Example6 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        DecimalFormat df = new DecimalFormat("0.00");

        System.out.println("請輸入長方形的長和寬:(單位:cm)");
        double recLength = sc.nextDouble();
        double recWidth = sc.nextDouble();
        // 創建Rectangle類對象
        Rectangle rectangle = new Rectangle(recLength, recWidth);

        System.out.println("此長方形的面積為:" + df.format(rectangle.area())+"cm2");
        System.out.println("此長方形的周長為:" + df.format(rectangle.perimeter())+"cm");

        System.out.println("請輸入長方體的長、寬、高:(單位:cm)");
        double cubLength = sc.nextDouble();
        double cubWidth = sc.nextDouble();
        double cubHeight = sc.nextDouble();
        // 創建Cuboid類對象
        Cuboid cuboid = new Cuboid(cubLength, cubWidth, cubHeight);

        System.out.println("此長方體的表面積為:" + df.format(cuboid.area())+"cm2");
        System.out.println("此長方體的體積為:" + df.format(cuboid.volume())+"cm3");

    }
}

(4)程序4源代碼(如選做)

//定義接口Plan
interface Plan {
    void eat(); // 定義抽象eat()方法

    void play(); // 定義抽象play()方法
}

// 定義Saturday類實現Plan接口
class Saturday implements Plan {

    // 實現抽象eat()方法
    public void eat() {
        System.out.println("            吃甜品");
    }

    // 定義抽象play()方法
    public void play() {
        System.out.println("            騎自行車");
    }
}

// 定義Sunday類實現Plan接口
class Sunday implements Plan {

    // 實現抽象eat()方法
    public void eat() {
        System.out.println("            吃壽司");
    }

    // 定義抽象play()方法
    public void play() {
        System.out.println("            爬山");
    }
}

// 定義測試類
public class Example9 {
    public static void main(String[] args) {
        weekend(new Saturday());
        weekend(new Sunday());
    }

    // 定義靜態的weekend()方法,接收一個Plan類型的參數
    public static void weekend(Plan p) {
        // 判斷所屬類型進而使用其特有方法
        if (p instanceof Saturday) {
            System.out.println("星期六:");
        } else {
            System.out.println("星期天:");
        }
        p.eat();
        p.play();

    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved