理论教育 Java程序设计:抽象类的定义及使用

Java程序设计:抽象类的定义及使用

时间:2023-10-18 理论教育 版权反馈
【摘要】:在定义抽象方法和抽象类时,需要在类名或方法名前加上abstract关键字进行声明。抽象类是为了解决代码的复用性而提出的,其主要是用来让子类继承。编译器强制子类实现抽象父类中的抽象方法,否则会报编译错误。抽象类中的构造函数用于初始化抽象类中的属性,以便在用子类创建对象时实现对从父类继承过来的属性进行初始化。在抽象类Amimal类中重载了两个构造方法,实现对Animal类中的name属性进行初始化。

Java程序设计:抽象类的定义及使用

当描述一个类的时候,如果不能确定功能函数的函数体如何定义,可以暂不写函数的函数体,只写函数首部,把这种只有方法首部说明而没有方法体的实现的函数称为抽象方法,包含抽象方法的类称之为抽象类

下面通过一个例子来看为什么使用抽象类。

现在我们定义一个Dog类,其包含有颜色属性和吠叫的方法;定义Bird类,其包含有颜色属性和鸣叫的方法;定义Dog类和Bird类的父类Animal类,在Animal类中,抽取Dog类和Bird类的共同属性和行为,有颜色属性和叫的方法。在Animal类中定义的颜色的属性可以使用默认值初始化,但动物叫的方法在父类中如何定义呢?狗是汪汪叫,鸟是叽叽喳喳叫,我们可以将父类的方法定义为狗叫,然后让Bird类继承父类并重写叫的方法。但是我们在定义Bird类的时候如何确定是否需要重写父类中叫的方法呢?如果不重写,编译和运行都没有问题,只是在执行鸟叫的方法时会出现狗叫。

如果我们要求在子类中强制重写父类中的某个方法时,并且在父类中的某个方法的方法体无法明确其具体的实现时,可以将该方法定义为抽象方法,同时将该类定义为抽象类,这样在子类中就必须重写父类中的抽象方法;如果不重写父类的抽象方法,则子类也必须定义为抽象类,否则编译会报错。

在定义抽象方法和抽象类时,需要在类名或方法名前加上abstract关键字进行声明。一旦将某个方法定义为抽象方法后,则该抽象方法就没有方法体,只有方法的声明。

如:public abstract void shout();

抽象类的特点:

(1)若在一个类包含有抽象函数,则该类一定是抽象类。

(2)抽象类中不一定有抽象函数,也可以没有抽象方法。

(3)抽象类不能使用new创建对象,因为抽象类中的抽象方法没有方法体。

(4)抽象类是为了解决代码的复用性而提出的,其主要是用来让子类继承。(www.daowen.com)

(5)编译器强制子类实现抽象父类中的抽象方法,否则会报编译错误。当然也可以不实现,但子类也必须声明为抽象类。

(6)final和abstract一定不能同时修饰一个类,二者修饰的类是矛盾的。final修饰的类是终极类,不能被继承;而用abstract修饰的类却是用来被继承的,因此二者一定不能同时修饰一个类。

(7)static和abstract一定不能同时修饰类中的方法,二者修饰的类是矛盾的。static修饰的方法可以用类名调用,对于abstract修饰的方法是没有具体的实现方法体,所有不能直接调用,因此二者不能共同修饰一个方法。

(8)private和abstract一定不能同时修饰类中的方法,private修饰的方法只能在本类中使用,而abstract修饰的方法是用来被子类即类外进行重写,因此有矛盾,所以二者不能共同修饰同一个方法。

(9)抽象类不能创建对象,但抽象类中一定有构造函数。抽象类中的构造函数用于初始化抽象类中的属性,以便在用子类创建对象时实现对从父类继承过来的属性进行初始化。

【例5.9】在抽象类Amimal类中重载了两个构造方法,实现对Animal类中的name属性进行初始化。在Dog类中的带参数的构造方法中用super(name)调用父类Animal类中的带参数的构造方法实现对父类中的name属性进行初始化。

抽象类的优点:

(1)提高代码复用性。

(2)强制子类实现父类中没有实现的功能。

(3)提高代码的扩展性,便于后期的代码维护。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈