笔者这是第三次来看这本java程序设计语言基础篇,以前看的时候没有敲过相关的代码,直到在工作室待了一年后,又重新把本书看了一遍,对里面一些精华的部分,有了更深的理解。比如抽象类,相信许多初学的小伙伴对此很不理解,接下来,我就对这部分内容做一个总结~
抽象类:
在继承的层次结构中,随着每个新的子类的出现,类会变得越来 越明确和具体。如果从一个子类追溯到父类,类就会变得更加不明确和具体。类的设计应该确保父类包含他的子类的共同特征。有时候,一个父类设计的非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类。 同样的,有些方法的实现取决于具体的对象,这样的方法也称为抽象方法。抽象类和抽象方法都需要用修饰符abstract表示~~~
抽象类和常规类很像,但是不能使用new操作符创建他的实例。抽象方法只有定义而没有实现。他的实现由子类提供。一个包含抽象方法的类必须声明为抽象类,而抽象类中可以包含非抽象方法。
抽象类的构造方法定义为protected,因为它只能被子类调用。创建一个具体的子类实例时,它的父类的构造方法被调用以初始化父类中定义的数据。
为什么要用抽象类?
以一个例子来形象的说明一下,首先创建了一个几何的抽象父类,里面包含了共有的一些属性,比如:背景的颜色,是否填充,以及创建的时间。然后用两个子类来实现她,一个圆和一个矩形,在原来父类的原有的属性中,又增加了自己的属性调。
用equalArea方法来检查他们的面积是否形同,然后调用displayGeometricObject方法来显示他们。
/**
* 抽象类的定义
* Created by 郑文华 on 2017/6/7.
*/
public abstract class GeometricObject {
//定义背景的颜色
private String color = "white";
//是否填充
private boolean filled ;
//创建的日期
private java.util.Date dateCreated;
//构造方法
protected GeometricObject(){
dateCreated = new java.util.Date();
}
//有参数的构造方法
protected GeometricObject(String color, boolean filled){
dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public boolean isFilled() {
return filled;
}
public void setFilled(boolean filled) {
this.filled = filled;
}
public Date getDateCreated() {
return dateCreated;
}
//重写toString方法
public String toString(){
return "created on " + dateCreated + "\ncolor" + color + "and filled " + filled;
}
//抽象方法获取面积
public abstract double getArea();
//抽象方法获得周长
public abstract double getPerimeter();
}
/**
* 具体的几何对象 圆
* Created by 郑文华 on 2017/6/7.
*/
public class Circle extends GeometricObject {
//定义自己的专有属性半径
private double radius;
public Circle(){
}
public Circle(double radius){
this.radius = radius;
}
public Circle(double radius, String color, boolean filled){
this.radius = radius;
setColor(color);
setFilled(filled);
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
//实现父类的抽象方法
public double getArea(){
return radius * radius * Math.PI;
}
public double getDiameter(){
return 2 * radius;
}
//实现父类的抽象方法
public double getPerimeter(){
return 2 * radius * Math.PI;
}
}
/**
* 具体的几何对象 矩形
* Created by 郑文华 on 2017/6/7.
*/
public class Rectangle extends GeometricObject {
//定义自己的专有属性 宽
private double width;
//定义自己的专有属性 高
private double height;
public Rectangle(){
}
public Rectangle(double width, double height){
this.height = height;
this.width = width;
}
public Rectangle(double width, double height, String color, boolean filled){
this.width = width;
this.height = height;
setColor(color);
setFilled(filled);
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
//实现父类的抽象方法 获得面积
public double getArea(){
return width * height;
}
//实现父类的抽象方法 获得周长
public double getPerimeter(){
return 2 * (width + height);
}
}
/**
* 测试的方法
* Created by 郑文华 on 2017/6/6.
*/
public class TestGeometricObject {
public static void main(String[] args){
GeometricObject geoObject1 = new Circle(5);
GeometricObject geoObject2 = new Rectangle(5,3);
System.out.println("The two objects have the same area ? " + equalArea(geoObject1,geoObject2));
//打印出geoObject1的信息
dispalyGeometricObject(geoObject1);
//打印出geoObject2的信息
dispalyGeometricObject(geoObject2);
}
public static boolean equalArea(GeometricObject object1, GeometricObject object2){
return object1.getArea() == object2.getArea();
}
public static void dispalyGeometricObject(GeometricObject object){
System.out.println();
System.out.println("The area is " + object.getArea());
System.out.println("The perimeter is" + object.getPerimeter());
}
}
输出的结果:
The two objects have the same area ? false
The area is 78.53981633974483
The perimeter is31.41592653589793
The area is 15.0
The perimeter is16.0
Process finished with exit code 0
如果GeometricObject里没有定义getArea方法,就不能在该程序中定义equalArea方法来计算这两个几何对象的面积是否相同。所以,现在可以看出在GeometricObject中定义抽象方法的好处。