Java接口例题解析

预备知识:抽象类
  1. 使用abstract修饰的类称为抽象类
  2. abstract final只能二选一修饰同一个类
  3. 不能创建实例,不能new一个抽象类,只能通过子类继承后new子类
  4. 可以有抽象方法(使用abstract修饰的方法,没有方法体的称为抽象方法,抽象方法不能用private final static修饰)
  5. 如果抽象类存在抽象方法,那么子类在继承后一定要@Override

接口

接口类比抽象类更上一层,在接口里面全部抽象化,字段里是静态常量。

-  从狭义的角度讲就是指java中的interface

-  从广义的角度讲对外提供规则的都是接口

接口特点

-  接口中定义的全都是抽象方法。

-  接口用关键字interface表示,即interface 接口名 { }

-  类实现接口用implements表示,即class 类名 implements 接口名 { }

-  接口不能实例化。

*  那么,接口如何实例化呢?按照多态的方式来实例化。

-  接口的子类

*  可以是抽象类,但是意义不大。

*  可以是具体类,要重写接口中所有的抽象方法。(推荐方案)

例题

本题选自《Java语言程序设计与数据结构》中文版第465页。

Question (Enable Circle comparable)

Rewrite the given Circle class extend GeometricObject and implement the Comparable interface. Override the equals method in the Object class. Two Circle objects are equal if their radii are the same. Draw the UML diagram that involves Circle, GeometricObject, and Comparable.
hint: you can use the following code to test your class.

分析:

这部分采用分析 + 框架引导,希望能有助于更方便地回忆具体内容写法。

主函数

主要就是常规的使用new关键字创造Circle类型的实例circle1和circle2,调用抽象类中的静态方法对两个Circle类型的偏序进行比较,并且对输出格式进行控制;

public class Exercise {
    // Main method
    public static void main(String[] args) {
        // Create two comparable circles
        Circle1 circle1 = new Circle1(5);
        Circle1 circle2 = new Circle1(4);
        // Display the max circle
        Circle1 circle = (Circle1) GeometricObject1.max(circle1, circle2);
        System.out.println("The max circle's radius is " + circle.getRadius());
        System.out.println(circle);
    }
}
定义几何类型的抽象类

这部分的功能是在类里对比较的接口进行实现。

首先对circle的两个属性color和filled进行定义,我们需要声明权限:

  1. public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用。
  2. private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用。
  3. protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。

因此我们为让它的子孙可以访问,在此使用protected。

然后就是常规的写法,默认构造器将颜色设为白色、filled设置为false;color和filled的getter方法和setter方法。

    protected GeometricObject1();
    protected GeometricObject1(String color, boolean filled);
 	public String getColor();
    public void setColor(String color);
    public boolean getFilled();
    public void setFilled(boolean filled);

接下来,说明有getArea和getPerimeter方法,子类应当实现;

   public abstract double getArea();
   public abstract double getPerimeter();

定义了默认的compare方式:比较面积;

这里的思想很简单,定义int型compareTo,通过getArea获取两个圆A、B的面积,A小返回-1,B小返回1,否则返回0。

max应该设置为static静态方法,方便调用,实现就是取两圆的比较结果直接返回。

    public int compareTo(GeometricObject1 o); 
    public static GeometricObject1 max(GeometricObject1 o1, GeometricObject1 o2);

该部分实现:

abstract class GeometricObject1 implements Comparable<GeometricObject1> {
    protected String color;
    protected boolean filled;

    // Default construct
    protected GeometricObject1() {
        color = "white";
        filled = false;
    }
    // Construct a geometric object
    protected GeometricObject1(String color, boolean filled) {
        this.color = color;
        this.filled = filled;
    }
    // Getter method for color
    public String getColor() {
        return color;
    }
    // Setter method for color
    public void setColor(String color) {
        this.color = color;
    }
    // Getter method for weight
    public boolean getFilled() {
        return filled;
    }
    // Setter method for weight
    public void setFilled(boolean filled) {
        this.filled = filled;
    }
    // Abstract method
    public abstract double getArea();

    // Abstract method
    public abstract double getPerimeter();
    public int compareTo(GeometricObject1 o) {
        if (getArea() < o.getArea())
            return -1;
        else if (getArea() == o.getArea())
            return 0;
        else
            return 1;
    }
    public static GeometricObject1 max(GeometricObject1 o1, GeometricObject1 o2) {
        if (o1.compareTo(o2) > 0)
            return o1;
        else
            return o2;
    }
}
继承抽象几何类

记得先写明是继承自GeometricObject!

依然是默认构造器:

	public Circle1();

需要记得把父类传下来!

    public Circle1(double radius);
    public Circle1(double radius, String color, boolean filled);

常规的getter和setter方法

    public double getRadius();
    public void setRadius(double radius);

父类中提到的getArea和getPerimeter方法,运用简单数学知识即可完成,需注意圆周率可使用Math.PI,判断半径相等也一起写了

    public double getArea();
    public double getPerimeter();
    public boolean equals(Circle1 circle);

最后是重写部分。

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

在面向对象原则里,重写意味着可以重写任何现有方法。我们对toString和compareTo进行了重写,以半径作为圆的关键字

    @Override
    public String toString();
    @Override
    public int compareTo(GeometricObject1 o);

该部分实现:

class Circle1 extends GeometricObject1 {
    protected double radius;
    // Default constructor
    public Circle1() {
        this(1.0, "white", true);
    }
    // Construct circle with specified radius
    public Circle1(double radius) {
        super("white", true);
        this.radius = radius;
    }
    // Construct a circle with specified radius, weight, and color
    public Circle1(double radius, String color, boolean filled) {
        super(color, filled);
        this.radius = radius;
    }
    // Getter method for radius
    public double getRadius() {
        return radius;
    }
    // Setter method for radius
    public void setRadius(double radius) {
        this.radius = radius;
    }
    // Implement the findArea method defined in GeometricObject
    public double getArea() {
        return radius * radius * Math.PI;
    }
    // Implement the findPerimeter method defined in GeometricObject
    public double getPerimeter() {
        return 2 * radius * Math.PI;
    }
    // Override the equals() method defined in the Object class
    public boolean equals(Circle1 circle) {
        return this.radius == circle.getRadius();
    }
    @Override
    public String toString() {
        return "[Circle] radius = " + radius;
    }
    @Override
    public int compareTo(GeometricObject1 o) {
        if (getRadius() > ((Circle1) o).getRadius())
            return 1;
        else if (getRadius() < ((Circle1) o).getRadius())
            return -1;
        else
            return 0;
    }
}

完整代码(建议尝试手写):
public class Exercise13_05 {
    // Main method
    public static void main(String[] args) {
        // Create two comparable circles
        Circle1 circle1 = new Circle1(5);
        Circle1 circle2 = new Circle1(4);

        // Display the max circle
        Circle1 circle = (Circle1) GeometricObject1.max(circle1, circle2);
        System.out.println("The max circle's radius is " + circle.getRadius());
        System.out.println(circle);
    }
}
abstract class GeometricObject1 implements Comparable<GeometricObject1> {
    protected String color;
    protected boolean filled;

    // Default construct
    protected GeometricObject1() {
        color = "white";
        filled = false;
    }
    // Construct a geometric object
    protected GeometricObject1(String color, boolean filled) {
        this.color = color;
        this.filled = filled;
    }
    // Getter method for color
    public String getColor() {
        return color;
    }
    // Setter method for color
    public void setColor(String color) {
        this.color = color;
    }
    // Getter method for weight
    public boolean getFilled() {
        return filled;
    }
    // Setter method for weight
    public void setFilled(boolean filled) {
        this.filled = filled;
    }
    // Abstract method
    public abstract double getArea();

    // Abstract method
    public abstract double getPerimeter();
    public int compareTo(GeometricObject1 o) {
        if (getArea() < o.getArea())
            return -1;
        else if (getArea() == o.getArea())
            return 0;
        else
            return 1;
    }
    public static GeometricObject1 max(GeometricObject1 o1, GeometricObject1 o2) {
        if (o1.compareTo(o2) > 0)
            return o1;
        else
            return o2;
    }
}
// Circle.java: The circle class that extends GeometricObject
class Circle1 extends GeometricObject1 {
    protected double radius;
    // Default constructor
    public Circle1() {
        this(1.0, "white", true);
    }
    // Construct circle with specified radius
    public Circle1(double radius) {
        super("white", true);
        this.radius = radius;
    }
    // Construct a circle with specified radius, weight, and color
    public Circle1(double radius, String color, boolean filled) {
        super(color, filled);
        this.radius = radius;
    }
    // Getter method for radius
    public double getRadius() {
        return radius;
    }
    // Setter method for radius
    public void setRadius(double radius) {
        this.radius = radius;
    }
    // Implement the findArea method defined in GeometricObject
    public double getArea() {
        return radius * radius * Math.PI;
    }
    // Implement the findPerimeter method defined in GeometricObject
    public double getPerimeter() {
        return 2 * radius * Math.PI;
    }
    // Override the equals() method defined in the Object class
    public boolean equals(Circle1 circle) {
        return this.radius == circle.getRadius();
    }
    @Override
    public String toString() {
        return "[Circle] radius = " + radius;
    }
    @Override
    public int compareTo(GeometricObject1 o) {
        if (getRadius() > ((Circle1) o).getRadius())
            return 1;
        else if (getRadius() < ((Circle1) o).getRadius())
            return -1;
        else
            return 0;
    }
}

整理:Pepper_yzy 有错误欢迎指正!(好饿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值