java-类的多态性-抽象类和抽象方法

抽象类和具体类
抽象类和具体类的区别为:
抽象类只能作为继承·层次结构中的超类,不能创建抽象类的对象,而具体类可以用来创建对象。
抽象类是一组类的一般化描述,仅仅是指定子类的共同点。

抽象方法的声明
使用关键字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);
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值