美文网首页
Java-面向对象-抽象类abstract

Java-面向对象-抽象类abstract

作者: 码农随想录 | 来源:发表于2018-07-16 10:13 被阅读11次

引出抽象类

描述狗,行为:吼叫。
描述狼,行为:吼叫。
发现他们之间有共性,可以进行向上抽取。
当然是抽取它们的所属共性类型:犬科。
犬科这类事物:都具备吼叫行为,但是具体怎么叫,是不确定的,是由具体的子类来明确的。
这时在描述犬科时,发现了有些功能不具体,这些不具体的功能,需要在类中标识出来,通过java中的关键字abstract(抽象)。
定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。

抽象类:在描述事物时,没有足够的信息描述一个事物,这时该事物就是抽象事物。

抽象类的特点

1,抽象类和抽象方法都需要被abstract修饰。
抽象方法一定要定义在抽象类中。
2,抽象类不可以创建实例,原因:调用抽象方法没有意义。
3,只有覆盖了抽象类中所有的抽象方法后,其子类才可以实例化。
否则该子类还是一个抽象类。

之所以继承,更多的是在思想,是面对共性类型操作会更简单。

细节问题

1、抽象类一定是个父类?

是的,因为不断抽取而来的。

2、抽象类是否有构造函数?

有,虽然不能给自己的对象初始化,但是可以给自己的子类对象初始化。
抽象类和一般类的异同点:
相同:
    1,它们都是用来描述事物的。
    2,它们之中都可以定义属性和行为。

不同:
    1,一般类可以具体的描述事物。
        抽象类描述事物的信息不具体
    2,抽象类中可以多定义一个成员:抽象函数。
    3,一般类可以创建对象,而抽象类不能创建对象。

3、抽象类中是否可以不定义抽象方法。

是可以的,那这个抽象类的存在到底有什么意义呢?仅仅是不让该类创建对象。

4、抽象关键字abstract不可以和哪些关键字共存?

4.1、final:没办法派生子类
4.2、private:子类没办法覆盖
4.3、static:能直接被类名调用抽象方法,抽象方法必需被对象调用。

实例

需求

公司中程序员有姓名,工号,薪水,工作内容。
项目经理除了有姓名,工号,薪水,还有奖金,工作内容。
对给出需求进行数据建模。

在问题领域中先找寻其中涉及的对象。
程序员
属性:姓名,工号,薪水
行为:工作

项目经理
属性:姓名,工号,薪水,奖金
行为:工作

这些对象是否有关系呢?因为发现了他们之间的共性,应该存在着关系。
可以将他们的共性向上抽取到共性类型:员工。
员工:
属性:姓名,工号,薪水
行为:工作
发现员工的工作内容本身就不具体。应该是抽象的,由具体的子类来体现的。

实现

abstract class Employee
{
    private String name;
    private String id;
    private double pay;
    /**
    构造一个员工对象,一初始化就具备着三个属性。
    */
    public Employee(String name,String id,double pay)
    {
        this.name = name;
        this.id = id;
        this.pay = pay;
    }
    /**
    工作行为。
    */
    public abstract void work();
}

//具体的子类:程序员。
class Programmer extends Employee
{
    public Programmer(String name,String id,double pay)
    {
        super(name,id,pay);
    }
    public void work()
    {
        System.out.println("code....");
    }
}

//具体的子类:经理。
class Manager extends Employee
{
    //特有属性。
    private double bonus;
    public Manager(String name,String id,double pay,double bonus)
    {
        super(name,id,pay);
        this.bonus = bonus;
    }
    public void work()
    {
        System.out.println("manage");
    }
}

class AbstractTest 
{
    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
    }
}

相关文章

网友评论

      本文标题:Java-面向对象-抽象类abstract

      本文链接:https://www.haomeiwen.com/subject/phmvpftx.html