抽象类和具体类
抽象类和具体类的区别为:
抽象类只能作为继承·层次结构中的超类,不能创建抽象类的对象,而具体类可以用来创建对象。
抽象类是一组类的一般化描述,仅仅是指定子类的共同点。
抽象方法的声明
使用关键字abstract 声明抽象方法:
public abstract 返回类型 draw();
抽象方法仅仅是声明功能的接口——方法的头,并不提供功能的实现——即没有定义方法体。
包含抽象方法的类必须声明为抽象类,抽象类的所有具体子类都必须为超类的抽象方法提供具体实现
抽象类的声明
使用关键字abstract声明抽象类
public abstract class Shape
- 抽象类通常包含一个或者是多个抽象方法(静态方法不能为抽象方法——静态方法不能被继承实现)
- 抽象超类不能实例化
- 可以使用抽象超类来声明引用变量,用以保存抽象类所派生的任何具体类对象
例如:
类层次以抽象超类Shape_abs开始,派生出Point_abs类,由Point_abs类再派生出Circle_abs类,再由Circle_abs类再派生出Cylinder_abs类
package NO5;
//定义Shape1抽象超类
public abstract class Shape_abs extends Object{
public double getArea(){
return 0.0;
}
public double getVolume(){
return 0.0;
}
public abstract String getName();//声明getVolume抽象方法
}
package NO5;
public class Point_abs extends Shape_abs {//Point_abs类继承抽象类Shape1
protected int x;
protected int y;
public Point_abs(){
}
public Point_abs(int xValue,int yValue){
x=xValue;
y=yValue;
}
public void setX(int xValue){
x=xValue;
}
public void setY(int yValue){
y=yValue;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public String getName(){
return "Point_abs"; //具体实现Shape1类中的getName方法
}
public String toString(){
return "["+getX()+","+getY()+"]";
}
}
package NO5;
public class Circle_abs extends Point_abs{
private double radius;
public Circle_abs(){
}
public Circle_abs(int x,int y,double radiusValue){
super(x,y);
setRadius(radiusValue);
}
public void setRadius(double radiusValue){
radius=radiusValue<0.0?0.0:radiusValue;
}
public double getRadius(){
return radius;
}
public double getDiameter(){
return 2*radius;
}
public double getCircumference(){
return Math.PI*getDiameter();
}
public double getArea(){
//重写超类中的getArea方法
return Math.PI*getRadius()*getRadius();
}
public String getName(){
//重写超类中的getName方法
return "Circle_abs";
}
//重写超类中的toString()方法
public String toString(){
return "Center="+super.toString()+";Radius="+getRadius();
}
}
package NO5;
public class Cylinder_abs extends Circle_abs{
private double height;
public Cylinder_abs(){
}
public Cylinder_abs(int x,int y,double radius,double heightValue){
super(x,y,radius);
setHeight(heightValue);
}
public void setHeight(double heightValue){
height=heightValue<0.0?0.0:heightValue;
}
public double getHeight(){
return height;
}
//重写超类中的方法
public double getArea(){
//覆盖超类中的getArea方法
return 2*super.getArea()*getCircumference()*getHeight();
}
public double getVolume(){
//覆盖超类中的getArea方法
return super.getArea()*getHeight();
}
public String getName(){
//覆盖超类中的getName方法
return "Cylinder_abs";
}
public String toString(){//覆盖超类中的toString方法
return super.toString()+";height="+getHeight();
}
}
package NO5;
import java.text.DecimalFormat;
import javax.swing.JOptionPane;
public class AbstractInheritanceTest {
public static void main( String args[]){
DecimalFormat twoDigits=new DecimalFormat("0.00");
Point_abs point= new Point_abs(7,11);
Circle_abs circle=new Circle_abs(22,8,3.5);
//cylinder为Cylinder对象的引用
Cylinder cylinder=new Cylinder(20,30,3.3,10.75);
String output=point.getName() +":"+point+'\n'
+circle.getName()+":"+circle+'\n'
+cylinder.getName()+":"+cylinder+'\n';
Shape_abs arrayOfShapes_abs[]=new Shape_abs[3] ; //声明Shape类型的数组
arrayOfShapes_abs[0]=point;
arrayOfShapes_abs[1]=circle;
arrayOfShapes_abs[2]=cylinder;
for(int i=0;i< arrayOfShapes_abs.length; i++){
output+="\n\n"+arrayOfShapes_abs[i].getName() +":"+
arrayOfShapes_abs[i].toString()+"\nArea="+
twoDigits.format(arrayOfShapes_abs[i].getArea())+
"\nVolume="+twoDigits.format(arrayOfShapes_abs[i].getVolume());
}
System.out.println(output);
System.exit(0);
}
}