抽象类和接口

抽象类

  1. 抽象类不能实例化,但可以声明抽象类的引用。可以创建构造方法给子类调用。
  2. 有抽象方法的类一定是抽象类,抽象类中可以有非抽象方法。
  3. 抽象方法不含方法体,必须显示定义为abstract。
  4. 抽象类的子类必须重写父类的所有抽象方法,否则必须定义为抽象类。

接口

  1. 接口不能实例化,但可以声明引用。接口中不能写构造方法。
  2. 接口中只有静态常量和抽象方法。常量默认为public static final的,方法默为public abstract的,并且可以不显示的写出。
  3. 接口的实现类必须重写接口中所有的方法
  4. 接口不能继承类,但是可以继承1个或多个接口
  5. 一个类可以实现一个或多个接口

JDK8.0之后接口可以修饰静态常量、抽象方法、静态方法、默认方法

abstarct关键字不能与final同时使用。

修饰类:被abstract修饰的类需要被继承,否则无意义,而被final修饰的类不能被继承。

修饰方法:被abstract修饰的方法需要被重写,而被final修饰的方法不能被重写

抽象类与接口的异同

异:

  1. 抽象类中可以有变量、常量,而接口中只能有静态常量
  2. 抽象类中可以有非抽象方法而接口不能
  3. 抽象类可以继承类、实现接口,而接口只能够继承接口
  4. 抽象类中的抽象方法必须显示的定义,而接口不需要

同:

  1. 抽象类和接口中都可以拥有抽象方法
  2. 抽象类和接口的实现类都必须重写所有的方法
  3. 抽象类和接口都不能实例化,但是可以声明引用

 

练习题

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());
		
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值