抽象类与接口的异同
- 相同点:
- 都不可以实例化
- 都有继承机制:即抽象类可以继承类,接口可以继承接口
- 都可以拥有抽象方法(方法声明)
- 非抽象类通过 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 "Cir