Java的抽象类

抽象类
抽象类是指在类中,部分方法只有声明、没有实现的类,它是某一类型事物的抽象。

注意:抽象类是不能被实例化的(因为它是抽象的、不具体的类),它只能在继承中发挥作用;而抽象方法也只能在子类中被重写(实现)后才能用子类的对象调用。

例如,有一个用于描述动物的 Animal 父类,其中定义了 getInfo方法,用于获取动物的相关信息。它有三个子类,分别是描述马的子类 Horse,描述人的子类 Person 和描述鱼的子类 Fish,如图下所示。三个子类中都重写了 getInfo 方法,用于根据具体的动物类型获取相关信息。
这里写图片描述
在这种情况下,父类的 getInfo 方法实际上是没有必要确定实现细节。因为在子类中都对 getInfo 方法进行了重写。之所以声明父类的 getInfo 方法,可以理解为它只是子类的一种“规划”,说明子类必须具备这样的特性或功能。这时候,我们可以在类声明时将Animal类声明为抽象的(用abstract作为非访问修饰符),也就是说它是概括性的、不具体的类。

练习:
在 Person 类中实现其抽象父类中的抽象方法。
目的:掌握抽象类和抽象方法的使用。
分析:该程序在 Person 类中实现其抽象父类 Animal 中的抽象方法 getInfo。

//创建抽象类Animal 
abstract class Animal{
    public int age;
    public abstract String getInfo();
}
//创建子类Person 实现父类Animal的getInfo方法
class Person extends Animal{
    public String name;
    public String getInfo(){
    /*子类中重写抽象父类中的getInfo方法*/
    //...
    }
//创建测试类调用子类方法
public class TestAbstract{
    public static void main(String[] args){
    Animal a = new Animal();//报错,抽象类能被实例化
    Person p = new Person();
    p.getInfo();
    }
}

使用抽象类和抽象方法还需要注意如下几点:

⒈在一个类中,如果有一个方法是抽象的,该类就必须声明为抽象的(当然,将不含有抽象方法的类声明为抽象类也是可以的,不过很少这样用)。

⒉如果子类没有实现父类中所有的抽象方法,那么该子类也必须声明为抽象的。

⒊一个类不能同时被声明为 final 和 abstract。因为被声明为final 的类是最终类,而被声明为 abstract 的类又必须在子类化后才能使用,这是两个相反意义的修饰符。

eg:对于每个几何图形而言,都有一些共同的属性,如名字、面积,周长等,而计算不同几何图形的面积是各有不同。为了简化开发,而且告诉其子类必须要计算几何面积,可以在父类中定义一个抽象方法,子类通过实现抽象方法计算其自身的面积。

⒈编写 Shape 类,该类是一个抽象类,在该类中定义两个方法,即 getName()方法和 gatArea()方法。getName 方法用反射机制获得名称,getArea()方法是一个抽象方法。

public abstract class Shape{
    public String getName(){//获得图形的名称
    return this.getClass().getSimpleName();
    }
    public abstract double getArea();
    //获得图形的面积
}

⒉编写 Circle 类,该类继承 Shape 并实现了其抽象方法getArea()。在该类的构造方法中获了圆形的半径,以此在 getArea()中计算面积。

public class Circle extends Shape{
    private double radius;
    public Circle(double radius){
    //获得圆形的半径的构造方法
    this.radius = radius;
    }
    public double getArea(){
    //计算圆形面积
        return Math.PI*Math.pow(radius,2);
    }
}

⒊编写类 Rectangle,该类继承自 Shape 并实现了抽象方法getAtea()。在该类的构造方中,获得矩形的长度和宽度,以此在getArea 计算其面积。

public class Rectangle extends Shape{
    private double length;
    private double width;
    public Rectangle(double length,double width){
    //获得矩形的长和宽的构造方法
    this.length = length;
    this.width = width;
    }
}
public double getArea(){
//计算矩形的面积
    return length*width;
}

⒋编写 Test 类用来测试。

public class Test{
    public static void main(String[] args){
    Circle circle = new Circle(1);//创建圆的半径为1
    System.out.println("图形的名称是:"+circle.getName());
    System.outprintln("图形的面积是:"+circle.getArea());

    Rectangle rectangle = new Rectangle(1,1);//创建长方形的长和宽为1
    System.out.println("图形的名称是:"+rectangle.getName());
    System.outprintln("图形的面积是:"+rectangle.getArea());

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值