zoukankan      html  css  js  c++  java
  • 抽象类

    类定义前面如果加上abstract,则表示该类为抽象类,没有具体对对象。

    例如:我们定义猫类Cat,含有成员变量体重weight;定义狗类Dog,含有成员变量weight;定义猪类Pig,含有成员变量weight。程序如下:

    class Cat{

    int weight;

    }

    class Dog{

    int weight;

    }

    class Pig{

    int weight;

    }

    由于这三个类都有体重weight这个成员变量,我们可以考虑把这三个类中的共同属性抽出来,单独放到同一个类中,这个类就叫抽象类。

    抽象类相当于一个概念或者一个框架,已经不能作为具体事例对象的类,也就是说没有具体的对象。

    动物类就是猪类,狗类,猫类的抽象类,动物类不属于任何一种具体物种的动物,他代表了所有动物的共同属性,而任何一种具体的动物都代表了特殊化的动物。

    猫类,狗类,猪类都是从动物类继承而来的,所以这三种动物不需要再定义成员变量weight体重了。

    例如:abstract class Animal{

    int weight;

    }

    class Cat extends Animal{

    }

    class Dog extends Animal{

    }

    class Pig extends Animal{

    }

    从上述代码中可以看出,抽象类只能做父类来派生子类,不能用new运算符创建抽象类的实例。java中定义了一些专用的抽象类,如java.lang.Number类就是抽象类,不能创建具体的实例,它只是代表了数字的抽象概念。

    定义抽象类的作用是将一类对象的共同特点抽像出来,成为该类共同特征的抽像概念。其后在处理具体的某个对象时,只需要添加与其他子类不同之处即可,不需要再重复抽像类的共同特征。

    如果在方法名之前加上abstract就表示为抽像方法。抽像方法包含在抽象类中,只有方法头(包含修饰符,返回类型,方法名,参数列表)没有方法体和功能实现,类似于c语言中的函数声明。抽像方法的具体功能实现由子类完成。

    由于抽像方法在抽象类中,具体的实现在各种抽象类的子类中,各种子类就形成了方法声明完全相同,只有实现的语句不一样。类外看起来名字相同,是一个统一的接口,这个统一的接口的多种实现方法就是多态的体现。

    抽象类的用法:

    //定义一个抽象类图形,派生出三个类,三角形类,矩形类,圆形类
    public class chouxianglei {
    public static void main(String []args){
    //TShape shape=new TShape();错误,抽象类没有具体实例
    Rectx rect=new Rectx(4,5);
    rect.area();
    Angle angle=new Angle(4,5);
    angle.area();
    Circle cir=new Circle(4);
    cir.area();

    }
    }
    abstract class TShape{
    int a;
    int b;
    TShape(int a,int b){
    this.a=a;
    this.b=b;
    }
    abstract void area();//抽象类
    }
    class Rectx extends TShape{
    Rectx(int a,int b){
    super(a,b);
    }
    void area(){
    double s;
    s=a*b;
    System.out.println("矩形面积为:"+s);
    }
    }
    class Angle extends TShape{
    Angle(int a,int b){
    super(a,b);
    }
    void area(){
    double s;
    s=0.5*a*b;
    System.out.println("三角形面积为:"+s);
    }
    }
    class Circle extends TShape{
    final double PI=3.1415;
    Circle (int r){
    super(r,r);
    }
    void area(){
    double s;
    s=PI*a*a;
    System.out.println("圆的面积为:"+s);
    }
    }

    ps:在该程序中,图形类TShape类为抽像类,里面含有一个抽像方法area(),定义了该抽像类的三个子类:圆形类,矩形类,三角形类。在三个子类中,分别定义了抽像方法area()的具体实现,这是area方法不能加abstract。在主程序中,分别定义三个子类的对象,调用area()方法输出各个图形面积的值。TShape shape=new TShape();这个语句是错误的,这个因为抽像类没有具体实例,不能用new来创建对象。但是可以引用对象,我们可以仅仅创建抽象类TSHape的对象,然后把他的子类的对象赋值给她抽像类的对象,这时候抽象类的对象可以认为是子类的具体对象,通过抽象类的对象调用方法就相当于通过了子类的对象调用方法。

    主类可以改为一下格式:

    public class chouxianglei {
    public static void main(String []args){

    TShape shape;

    Rectx rect=new Rects(4,5);

    shape=rect;

    shape.area();

    Angle angle=new Angle(4,5);

    shape.angle;

    shape.area();

    Circle cir=new Circle(4);

    shape=cir;

    shape.area();

    }

    }

    ps:需要注意的是抽像类必须在抽像方法中,抽象类不仅包括抽像方法,还包括其他成员方法和成员变量,但是抽像类中的非抽像方法必须实现。

    还有构造方法不能为抽像方法,静态方法不能为抽像方法,private方法不能为抽像方法。

  • 相关阅读:
    MYSQL数据类型——字符串类型
    MYSQL——记录长度
    MYSQL数据类型——时间日期类型
    MYSQL数据类型——数值类型
    为什么在 IDEA jsp 中直接使用 out.println 会出错
    花指令行为大赏
    EasyCpp 题解
    [SUCTF2019] hardcpp 题解
    洛谷 P1650 田忌赛马题解
    Dict 协议是什么
  • 原文地址:https://www.cnblogs.com/Angella/p/6019053.html
Copyright © 2011-2022 走看看