抽象类
- 抽象类不能实例化,但可以声明抽象类的引用。可以创建构造方法给子类调用。
- 有抽象方法的类一定是抽象类,抽象类中可以有非抽象方法。
- 抽象方法不含方法体,必须显示定义为abstract。
- 抽象类的子类必须重写父类的所有抽象方法,否则必须定义为抽象类。
接口
- 接口不能实例化,但可以声明引用。接口中不能写构造方法。
- 接口中只有静态常量和抽象方法。常量默认为public static final的,方法默为public abstract的,并且可以不显示的写出。
- 接口的实现类必须重写接口中所有的方法
- 接口不能继承类,但是可以继承1个或多个接口
- 一个类可以实现一个或多个接口
JDK8.0之后接口可以修饰静态常量、抽象方法、静态方法、默认方法
abstarct关键字不能与final同时使用。
修饰类:被abstract修饰的类需要被继承,否则无意义,而被final修饰的类不能被继承。
修饰方法:被abstract修饰的方法需要被重写,而被final修饰的方法不能被重写
抽象类与接口的异同
异:
- 抽象类中可以有变量、常量,而接口中只能有静态常量
- 抽象类中可以有非抽象方法而接口不能
- 抽象类可以继承类、实现接口,而接口只能够继承接口
- 抽象类中的抽象方法必须显示的定义,而接口不需要
同:
- 抽象类和接口中都可以拥有抽象方法
- 抽象类和接口的实现类都必须重写所有的方法
- 抽象类和接口都不能实例化,但是可以声明引用
练习题
Comparable接口
package com.hjx;
public interface Comparable {
public abstract int compareTo(Graph a);
}
图形类 Graph
package com.hjx;
public abstract class Graph implements Comparable {
String brush;
boolean fill;
/**
* @param brush 填充色
* @param fill 有无填充
*/
public Graph(String brush,boolean fill){
this.brush = brush;
this.fill = fill;
}
public abstract double getPerimeter();
public abstract double getArea();
public int compareTo(Graph other) {
if(this.getArea()>other.getArea()) {
return 1;
}else if(this.getArea()<other.getArea()) {
return -1;
}else {
return 0;
}
}
}
图形类的三个实现类:
圆形类
package com.hjx;
public class Circle extends Graph {
private double radius;
public Circle(String brush, boolean fill, double radius) {
super(brush, fill);
this.radius = radius;
}
@Override
public double getPerimeter() {
double perimeter = 2 * Math.PI * radius;
return perimeter;
}
@Override
public double getArea() {
double area = radius * radius * Math.PI;
return area;
}
@Override
public String toString() {
String fill = "";
fill = this.fill ? "有填充" : "无填充";
return "圆形:" + brush + "、" + fill + "、半径为" + radius + "、周长为" + getPerimeter() + "、面积为" + getArea();
}
}
长方形类
package com.hjx;
public class Rectangle extends Graph{
private double width;
private double height;
public Rectangle(String brush, boolean fill,double width,double height) {
super(brush, fill);
this.width = width;
this.height = height;
}
@Override
public double getPerimeter() {
double perimeter = width*2+height*2;
return perimeter;
}
@Override
public double getArea() {
double area = width*height;
return area;
}
@Override
public String toString() {
String fill = "";
fill = this.fill?"有填充":"无填充";
return "矩形:"+brush+"、"+fill+"、宽和高分别为"+width+"和"+height+"、周长为"+getPerimeter()+"、面积为"+getArea();
}
}
正方形类
package com.hjx;
public class Square extends Graph {
private double width;
public Square(String brush, boolean fill, double width) {
super(brush, fill);
this.width = width;
}
@Override
public double getPerimeter() {
double perimeter = width * 4;
return perimeter;
}
@Override
public double getArea() {
double area = width * width;
return area;
}
@Override
public String toString() {
String fill = "";
fill = this.fill ? "有填充" : "无填充";
return "正方形:" + brush + "、" + fill + "、边长为" + width + "、周长为" + getPerimeter() + "、面积为" + getArea();
}
}
测试类
package com.hjx;
public class Test {
public static void main(String[] args) {
Graph[] graph = {new Circle("红色",true,5),
new Square("白色",false,5),
new Rectangle("黑色",true,10,5)
};
//打印信息
for(Graph temp:graph) {
System.out.println(temp);
}
//找出最大的面积
Graph maxArea = graph[0];
for(Graph g:graph) {
if(maxArea.compareTo(g)==-1) {
maxArea = g;
}
}
System.out.println("最大的面积为"+maxArea.getArea());
}
}