抽象类和接口的程序题练习

本文探讨了抽象类与接口在Java中的异同,并提供了编程练习。首先介绍了抽象类与接口的共同特点,如无法实例化、支持继承等,接着分析了它们的区别,如抽象类可实现方法而接口不能、抽象类可有成员变量而接口只有常量等。随后,给出了一个抽象类编程题,涉及图形类的继承和方法实现,包括圆形、正方形和长方形的面积和周长计算。最后,设计了一个Comparable接口,用于比较图形的面积,并在测试类中找出面积最大的图形。

抽象类与接口的异同

  • 相同点:
    • 都不可以实例化
    • 都有继承机制:即抽象类可以继承类,接口可以继承接口
    • 都可以拥有抽象方法(方法声明)
    • 非抽象类通过 extends 或 implements 使用两者时都需要重写它们的抽象方法。
    • 都可以实现多态性
  • 不同点:
    • 抽象类可以实现方法 ;接口不能实现方法,只能声明。
    • 抽象类可以有成员变量,接口只能拥有静态的成员常量。
    • 抽象类的方法可以不是抽象方法,接口的方法只能为抽象方法(java 8 之后接口新增默认方法和静态方法)。
    • 默认修饰符不同:抽象类中,抽象方法默认的访问修饰符为 protected ;接口中,方法的修饰符默认且强制为 public abstract ,属性的修饰符默认且强制为 public static final 。
    • 使用或实现的方式不同:抽象类通过 extends 继承来实现并重写抽象方法;接口通过 implements 实现来重写抽象方法。
    • 可同时使用的数量不同:一个类最多只可以继承一个抽象类;一个类可以同时实现多个接口。
    • 可同时继承的数量不同:抽象类最多只可以继承一个父类;接口可以同时继承多个接口。

抽象类的程序题

  • 题目

1、在画图软件中,可以画出不同大小或颜色的圆形、矩形等几何图形。几何图形之间有许多共同的特征,如它们可以是用某种颜色画出来的,可以是填充的或者不填充的。此外还有些不同的特征,比如,圆形都有半径,可以根据半径计算圆形的面积和周长,矩形都有宽和高,可以根据宽高来计算矩形的面积和周长。
1、编写Java程序。
(1)使用继承机制,分别设计实现抽象基类图形类,派生类圆形类、正方形类、长方形类,要求:
①抽象图形类中有属性画笔颜色、图形是否填充,有方法获取图形面积、获取图形周长等;
②使用构造方法为其成员属性赋初值;
③在每个派生类中都重写toString()方法,返回所有属性的信息;
④根据文字描述合理设计类的其他成员属性和方法。
(2)设计实现画板类,要求:
①画一个红色、无填充、长和宽分别为10.0与5.0的长方形;
②画一个绿色、有填充、半径为3.0的圆形;
③画一个黄色、无填充、边长为4.0的正方形;
④分别求三个对象的面积和周长,并将每个对象的所有属性信息打印到控制台。

  • 程序代码

Figure.java

package com.exercise1;

/**
 * <p>Description: 图形类</p>
 * @author HiTMT
 * @date 2019年9月25日下午2:38:50
 */
public abstract class Figure {
	protected String penColor;		//画笔颜色
	protected boolean isFill;		//是否填充

	public Figure(String penColor, boolean isFill) {
		this.penColor = penColor;
		this.isFill = isFill;
	}
	public abstract double getArea();		//获取面积
	public abstract double getPerimeter();		//获取周长
	public abstract String toString();
	public String getPenColor() {
		return penColor;
	}
	public void setPenColor(String penColor) {
		this.penColor = penColor;
	}
	public boolean isFill() {
		return isFill;
	}
	public void setFill(boolean isFill) {
		this.isFill = isFill;
	}
}

Circle.java

package com.exercise1;
/**
 * <p>Description: 圆形类</p>
 * @author HiTMT
 * @date 2019年9月25日下午2:39:01
 */
public class Circle extends Figure {
	private double radius;		//半径

	public Circle(String penColor, boolean isFill, double radius) {
		super(penColor, isFill);
		this.radius=radius;
	}

	public double getArea() {
		return Math.PI*radius*radius;
	}

	public double getPerimeter() {
		return 2*Math.PI*radius;
	}

	public String toString() {
		return "Circle [radius=" + radius + ", penColor=" + penColor + ", isFill=" + isFill + "]";
	}

	public double getRadius() {
		return radius;
	}

	public void setRadius(double radius) {
		this.radius = radius;
	}

}

Square.java

package com.exercise1;
/**
 * <p>Description: 正方形类</p>
 * @author HiTMT
 * @date 2019年9月25日下午2:39:19
 */
public class Square extends Figure {
	private double side;		//边长

	public Square(String penColor, boolean isFill, double side) {
		super(penColor, isFill);
		this.side=side;
	}

	public double getArea() {
		return side*side;
	}

	public double getPerimeter() {
		return 4*side;
	}

	public String toString() {
		return "Square [side=" + side + ", penColor=" + penColor + ", isFill=" + isFill + "]";
	}
	
	public double getSide() {
		return side;
	}

	public void setSide(double side) {
		this.side = side;
	}


}

Rectangle.java

package com.exercise1;
/**
 * <p>Description: 长方形</p>
 * @author HiTMT
 * @date 2019年9月25日下午9:59:27
 */
public class Rectangle extends Figure {
	private double side1;		//边长1
	private double side2;		//边长2

	public Rectangle(String penColor, boolean isFill, double side1, double side2) {
		super(penColor, isFill);
		this.side1=side1;
		this.side2=side2;
	}
	public double getArea() {
		return side1*side2;
	}
	public double getPerimeter() {
		return (side1+side2)*2;
	}
	public String toString() {
		return "Rectangle [side1=" + side1 + ", side2=" + side2 + ", penColor=" + penColor + ", isFill=" + isFill + "]";
	}
}

DrawingBoard.java

package com.exercise1;
/**
 * <p>Description: 画板类</p>
 * @author HiTMT
 * @date 2019年9月25日下午9:59:43
 */
public class DrawingBoard {
	public static void main(String[] args) {
		Rectangle rectangle=new Rectangle("red", false, 10, 5);
		Circle circle=new Circle("grean", true, 3);
		Square square=new Square("yellow", false, 4);
		System.out.println("长方形:面积="+rectangle.getArea()+";周长="+rectangle.getPerimeter()+";"+rectangle);
		System.out.println("圆形:面积="+circle.getArea()+";周长="+circle.getPerimeter()+";"+circle);
		System.out.println("正方形:面积="+square.getArea()+";周长="+square.getPerimeter()+";"+square);
	}
}

接口的程序题

  • 题目

2、基于上题背景,设计实现以下程序:
(1)设计Comparable接口,接口中设计compareTo()方法,用来比较对象。此方法的返回值类型设计为int类型。此方法接收一个参数,参数类型为图形类。
(2)在图形类中实现compareTo()方法,用来比较两个图形的面积大小。
(3)在测试类中,创建图形类的数组,数组中存放多个圆形、正方形、长方形对象,使用compareTo()方法找出数组中面积最大的图形。
提示:比较对象时,可以将compareTo()方法的返回值设置为1、0、-1,来代表比较结果,当前对象大、两者相等或者当前对象小。再次提醒,此题涉及的代码全部展示在此题的题号下,与上一题相独立。

  • 程序代码

补充修改后的 Figure.java

package com.exercise1;

import com.exercise2.Comparable;

/**
 * <p>Description: 图形类</p>
 * @author HiTMT
 * @date 2019年9月25日下午2:38:50
 */
public abstract class Figure implements Comparable {
	protected String penColor;		//画笔颜色
	protected boolean isFill;		//是否填充

	public Figure(String penColor, boolean isFill) {
		this.penColor = penColor;
		this.isFill = isFill;
	}
	public abstract double getArea();		//获取面积
	public abstract double getPerimeter();		//获取周长
	public abstract String toString();
	public String getPenColor() {
		return penColor;
	}
	public void setPenColor(String penColor) {
		this.penColor = penColor;
	}
	public boolean isFill() {
		return isFill;
	}
	public void setFill(boolean isFill) {
		this.isFill = isFill;
	}
	
	public int compareTo(Figure fig) {
		double d=getArea()-fig.getArea();
		if(d>0) {
			return 1;
		}else if(d==0) {
			return 0;
		}else {
			return -1;
		}
	}
	
}

Comparable.java

package com.exercise2;

import com.exercise1.Figure;

/**
 * 
 * <p>Description: 比较大小</p>
 * @author HiTMT
 * @date 2019年9月25日下午3:09:46
 */
public interface Comparable {
	/**
	 * 比较图形面积大小
	 * @param fig		待比较图形对象
	 * @return 1:调用者的面积比 fig 大;0:面积相同;-1调用者的面积比 fig 小
	 */
	int compareTo(Figure fig);
}

Tester.java

package com.exercise2;

import com.exercise1.Circle;
import com.exercise1.Figure;
import com.exercise1.Rectangle;
import com.exercise1.Square;

/**
 * <p>Description: 测试Comparable</p>
 * @author HiTMT
 * @date 2019年9月25日下午3:09:46
 */
public class Tester {
	/**
	 * 获取图形数组中面积最大的图形对象
	 * @param figArr	图形对象数组
	 * @return 面积最大的图形对象
	 */
	public static Figure getMax(Figure[] figArr) {
		Figure maxF=figArr[0];
		for(int i=1;i<figArr.length;i++) {
			if(figArr[i].compareTo(maxF)>0) {
				maxF=figArr[i];
			}
		}
		return maxF;
	}
	/**
	 * 生成随机的图形数组用于测试
	 * @param size 图形数组的大小
	 * @return 图形数组
	 */
	public static Figure[] createTestDate(int size) {
		Figure[] figArr=new Figure[size];
		for(int i=0;i<size;i++) {
			int typeNum=(int)(Math.random()*3);
			String ts="00000"+Integer.toHexString((int)(Math.random()*Math.pow(16, 6)));
			String color="#"+ts.substring(ts.length()-6);
			boolean isFill=Math.random()>=0.5?true:false;
			double d1=Math.random()*size;
			double d2=Math.random()*size;
			switch(typeNum) {
				case 0:
					figArr[i]=new Circle(color, isFill, d1);
					break;
				case 1:
					figArr[i]=new Rectangle(color, isFill, d1, d2);
					break;
				case 2:
					figArr[i]=new Square(color, isFill, d1);
					break;
				default:
					break;
			}
		}
		return figArr;
	}
	
	public static void main(String[] agrs) {
		Figure[] figArr=createTestDate(100);
		System.out.println(getMax(figArr));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值