java中抽象类(abstract class)

抽象类(abstract class)

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

用abstract关键字来修饰一个类时,这个类叫做抽象类;

用abstract来修饰一个方法时,该方法叫做抽象方法。

抽象方法:只有方法的声明,没有方法的实现。以分号结束。

abstract int abstractMethod1( int a );

含有抽象方法的类必须被声明为抽象类。

抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。

不能用abstract修饰私有方法,构造方法,静态方法。

抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。

以下依旧通过代码来说明abstract关键字的用法
父类:

package cn.com.Classwork190123;

public abstract class Gun {
    private long length;
    public void shoot(String shootType){
        System.out.println("枪的射击的方法\n");
    }
    /*
    抽象方法,使用关键字abstract
        不能有方法体,但是方法的返回类型需要表明
     */
    public abstract void sound();
    public abstract boolean shift();

}

子类1:

package cn.com.Classwork190123;

public class SignalGun extends Gun {
    public void shoot(){
        System.out.println("朝天发射");
    }
    @Override
    public void sound() {

    }

    @Override
    public boolean shift() {
        return false;
    }

}

子类2:

package cn.com.Classwork190123;

public class M4 extends Gun {
    /*
    如果一个类继承自抽象类,则必须实现这个抽象类的所有的抽象方法

    实现  类似于重写,如果父类中没有对应的方法体,子类来完成这个方法就叫实现

    能不能重写?  也可以重写
     */
    @Override
    public void sound() {
        System.out.println("嘚嘚嘚");
    }

    @Override
    public boolean shift() {
        System.out.println("40");
        return true;
    }
}

子类3:

package cn.com.Classwork190123;

public class M249 extends Gun {
    @Override
    public void sound() {
        System.out.println("哒哒哒");
    }

    @Override
    public boolean shift() {
        System.out.println("100");
        return true;
    }
}

下面是一个案例
在这里插入图片描述
父类:

package cn.com.Classwork190123;

public abstract class Employee {
    public abstract void computePay();
}

程序员类:

package cn.com.Classwork190123;

public class Programmer extends Employee {
    @Override
    public void computePay() {
        System.out.println("计算薪水按项目奖金");
    }
}

会计类;

package cn.com.Classwork190123;

public class Accountant extends Employee {
    @Override
    public void computePay() {
        System.out.println("计算薪水按月份");
    }
}

销售类:

package cn.com.Classwork190123;

public class SalesPerson extends Employee{
    @Override
    public void computePay() {
        System.out.println("按提成计算薪水");
    }
}

案例:
在这里插入图片描述
在航运公司系统中,Vehicle类需要定义两个方法分别计算运输工具的燃料效率和行驶距离。

问题:卡车(Truck)和驳船(RiverBarge)的燃料效率和行驶距离的计算方法完全不同。Vehicle类不能提供计算方法,但子类可以。

Java允许类设计者指定:超类声明一个方法但不提供实现,该方法的实现由子类提供。

这样的方法称为抽象方法。有一个或更多抽象方法的类称为抽象类。

Vehicle是一个抽象类,有两个抽象方法。
实现方式与上面一个案例类似,emmm就不附代码了(主要是我懒不想写了。。。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值