java 抽象类和接口

一、抽象类

在继承的层次结构中,每个新子类都使类变得越来越明确和具体。如果从一个子类追溯到父类,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类(abstract class)。

例如,我们可以定义一个Geometry抽象类型代表几何图形。

abstract class Geometry {
     
	private String color = "white";
	
	protected Geometry() {
     
	}
	
	protected Geometry(String color) {
     
		this.color = color;
	}
	
	public void setColor(String color) {
     
		this.color = color;
	}
	
	public String getColor() {
     
		return this.color;
	}
	
	public abstract double getArea();
}

其中,抽象类型用abstract修饰,类名和抽象方法。子类需要重写抽象方法,才能使其有效。
而抽象类的构造方法则使用protected修饰的。
接下里我们写一个Circle类和一个Rectangle类来继承这个抽象类。

class Circle extends Geometry{
     
	private double radius = 1;
	
	public Circle() {
     
	}
	
	public Circle(double radius) {
     
		this.radius = radius;
	}
	
	public double getRadius() {
     
		return this.radius;
	}
	
	public void setRadius(double radius) {
     
		this.radius = radius;
	}
	
	public double getArea() {
     	
		return this.radius * this.radius * Math.PI;
	}
	
}

class Rectangle extends Geometry{
     
	private double width = 1;
	private double height = 1;
	
	public Rectangle() {
     
	}
	
	public Rectangle(double width, double height) {
     
		this.width = width;
		this.height = height;
	}
	
	public double getWidth() {
     
		return this.width;
	}
	
	public double getHeight() {
     
		return this.height;
	}
	
	public void setWidth(double width) {
     
		this.width = width;
	}
	
	public void setHeight(double height) {
     
		this.height = height;
	}
	
	public double getArea() {
     	
		return this.width * this.height;
	}
	
}

然后我们来使用这个抽象类来比较他们的面积。

public class Main {
     

	public static void main(String[] args) {
     
		Geometry g1 = new Circle(3);
		Geometry g2 = new Rectangle(1, 2);
		
		System.out.println(g1.getArea());
		
		System.out.println(g2.getArea());
		
		System.out.println(areaEqual(g1, g2));
	}
	
	public static boolean areaEqual(Geometry g1, Geometry g2) {
     
		return g1.getArea() == g2.getArea();
	}

}
28.274333882308138
2.0
false

使用抽象类能让其实现子类更加明确的方法,让其结构层次更加清晰。

二、接口

接口在许多方面都与抽象类很相似,但是它的目的是指明相关或者不相关类的多个对象的共同行为。例如,我们给出一个Type接口,让上述抽象类对象实现输出自己类型的方法。

public class Main {
     

	public static void main(String[] args) {
     
		Geometry g1 = new Circle(3);
		Geometry g2 = new Rectangle(1, 2);
		
		System.out.println(g1.getArea());
		
		System.out.println(g2.getArea());
		
		System.out.println(areaEqual(g1, g2));
		
		System.out.println(((Type)g1).myType());
		System.out.println(((Type)g2).myType());
	}
	
	public static boolean areaEqual(Geometry g1, Geometry g2) {
     
		return g1.getArea() == g2.getArea();
	}

}

interface Type {
     
	public abstract String myType();
}

abstract class Geometry {
     
	private String color = "white";
	
	protected Geometry() {
     
	}
	
	protected Geometry(String color) {
     
		this.color = color;
	}
	
	public void setColor(String color) {
     
		this.color = color;
	}
	
	public String getColor() {
     
		return this.color;
	}
	
	public abstract double getArea();
}

class Circle extends Geometry implements Type {
     
	private double radius = 1;
	
	public Circle() {
     
	}
	
	public Circle(double radius) {
     
		this.radius = radius;
	}
	
	public double getRadius() {
     
		return this.radius;
	}
	
	public void setRadius(double radius) {
     
		this.radius = radius;
	}
	
	public double getArea() {
     	
		return this.radius * this.radius * Math.PI;
	}
	
	public String myType() {
     
		return "Circle";
	}
	
}

class Rectangle extends Geometry implements Type{
     
	private double width = 1;
	private double height = 1;
	
	public Rectangle() {
     
	}
	
	public Rectangle(double width, double height) {
     
		this.width = width;
		this.height = height;
	}
	
	public double getWidth() {
     
		return this.width;
	}
	
	public double getHeight() {
     
		return this.height;
	}
	
	public void setWidth(double width) {
     
		this.width = width;
	}
	
	public void setHeight(double height) {
     
		this.height = height;
	}
	
	public double getArea() {
     	
		return this.width * this.height;
	}
	
	public String myType() {
     
		return "Rectangle";
	}
	
}
28.274333882308138
2.0
false
Circle
Rectangle

在 Java 中,接口被看作是一种特殊的类。就像常规类一样,每个接口都被编译为独立的字节码文件。使用接口或多或少有点像使用抽象类。例如,可以使用接口作为引用变量的数据类型或类型转换的结果等。与抽象类相似,不能使用 new 操作符创建接口的实例。

抽象类和接口的大致区别如下。
java 抽象类和接口_第1张图片

你可能感兴趣的:(Java,作业)