Logo

郎哥编程

抽象类

2019-12-19 221

用面向对象思想设计程序时,往往需要从众多的同类事物中抽取出它们的共同特征和行为封装为类,具体事物的不同特性和行为通过类的继承和多态来实现。

例如要设计一个汽车类程序,可以把汽车的共同特性和行为抽取出来封装为汽车类,轿车、卡车、巴士作为汽车类的子类。汽车类表示的是一个抽象的事物,并不代表某一具体的汽车,人们并不清楚汽车类表示的是轿车,还是卡车或巴士。

在程序设计过程中,并不需要将汽车类实例化为对象,只需要将汽车类的子类实例化为对象即可。在这种情况下,可以使用Java语言提供的抽象类,把汽车类声明为抽象类,抽象类不能实例化为对象,但可以用于继承和多态。

定义抽象类的语法如下:

public abstract class Car {
  // 抽象方法
    public abstract void showCar();
}

抽象类的定义使用“abstract”关键字,抽象类和普通类一样,也有成员变量和成员方法。如果成员方法也使用“abstract”关键字修饰,这个成员方法称为抽象方法,抽象方法只有方法声明,没有方法体,抽象方法必须在继承的子类中实现。

抽象类本身不能实例化,继承抽象类的子类可以实例化,继承的子类需要全部实现抽象类的抽象方法,也就是重写抽象类的抽象方法。

案例1:创建抽象类Car(汽车父类),在抽象类中定义Car类的成员变量和showCar()抽象方法,并创建子类Truck类(卡车类)和Bus类(巴士类)。

新建项目PCoreUnit2,在PcoreUnit2项目新建car包,在car包下新建Car类。建立抽象类时,需要在New Java Class对话框内,选上abstract检查项。如下图所示:

image.png


Car类代码如下:

package car;
 
/** 
* @ClassName: Car 
* @Description: 抽象类与接口(抽象类)案例1 
* @author 编程训练营 
* @date
* 
*/
 
public abstract class Car {
    // 成员变量,汽车制造商
    String  manufacturer;
    // 构造方法
    public Car(String manufacturer)
    {
       this.manufacturer = manufacturer;
    }
    // 抽象方法
    public abstract void showCar();
   
}
Car类是抽象类,在类内部定义了成员变量manufacturer,抽象方法showCar()和构造方法。
在car包下新建Truck类,继承Car类。代码如下:
package car;
 
/** 
* @ClassName: Truck 
* @Description: 抽象类与接口(抽象类)案例1
* @author 编程训练营 
* @date 
* 
*/
 
public class Truck extends Car {
 
    /** 
    * 创建一个新的实例 Truck. 
    * 
    * @param manufacturer 
    */ 
   
    public Truck(String manufacturer) {
       super(manufacturer);
       // TODO Auto-generated constructor stub
    }
 
    /**
    * <p>Title: showCar</p> 
    * <p>Description: </p>   
    * @see car.Car#showCar() 
    */
 
    @Override
    public void showCar() {
       // 输出汽车制造商
       System.out.println(this.manufacturer);
      
    }
 
}

使用eclipse新建继承Car类的Truck类时,eclipse会自动在Truck类添加父类的抽象方法,Truck类需要重写Car类的抽象方法。如果父类有构造方法,需要在子类添加构造方法,在构造方法内调用父类的构造方法。

在car包下新建Bus类,继承Car类。代码如下:

package car;
 
/** 
* @ClassName: Bus 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author xinch 
* @date 2019年12月19日 
* 
*/
 
public class Bus extends Car {
 
    /** 
    * 创建一个新的实例 Bus. 
    * 
    * @param manufacturer 
    */ 
   
    public Bus(String manufacturer) {
       super(manufacturer);
       // TODO Auto-generated constructor stub
    }
 
    /**
    * <p>Title: showCar</p> 
    * <p>Description: </p>   
    * @see car.Car#showCar() 
    */
 
    @Override
    public void showCar() {
       // 输出汽车制造商
       System.out.println(this.manufacturer);
    }
 
}

Bus类的代码结构和Car类的代码结构相同。

在car包下新建测试类CarTest类,测试Truck类和Car类。代码如下:

package car;
 
/** 
* @ClassName: CarTest 
* @Description:  抽象类与接口(抽象类)案例1
* @author 编程训练营 
* @date 
* 
*/
 
public class CarTest {
 
    /** 
    * @Title: main 
    * @Description: Java程序入口main方法 
    * @param @param args    参数 
   
    * @return void    返回类型 
    * @throws 
    */
 
    public static void main(String[] args) {
       // 实例化Truck对象
       Truck  truck = new Truck("重汽公司制造");
        // 调用showCar()方法
       truck.showCar();
      
       // 实例化Bus对象
       Bus  bus = new Bus("巴士汽车公司制造");
       // 调用showCar()方法
       bus.showCar();
    }
 
}

程序执行结果如下图所示:

image.png

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论