答案是:不必须。
这个题目主要是考察对抽象类的理解。
说一下我个人的理解吧。
1.如果一个类使用了abstract关键字修饰,那么这个类就是一个抽象类。
2.抽象类可以没有抽象方法
3.一个类如果包含抽象方法,那么这个类必须是抽象类,否则编译就会报错。
4.最关键的一点就是如果一个类是抽象类,那么这个类是不能被实例化的。
如下:
public abstract class MQTest {}
现在user这个类就是一个抽象类,如果直接 使用该类创建新对象是行不通的,编译直接报错。
抽象类只能用其子类(该子类不能是抽象类)去创建新对象。
接下来我就用狗的例子来说明,先创建一个动物类(抽象类),然后创建一个狗类(抽象类),狗下面再分为金毛和二哈(非抽象类)。
动物类:
package com.xingli.abstractDemo;import lombok.Data;/***@ClassName Animal*@Description 动物抽象类*@Auther William*@Date 2019/7/22 14:11*@Version 1.0*/ @Data public abstract class Animal { //定义一个抽象的“让动物叫”的方法 public abstract void say(); }
狗类:
package com.xingli.abstractDemo;/***@ClassName Dog*@Description 狗类的抽象方法*@Auther William*@Date 2019/7/22 14:13*@Version 1.0*/ public abstract class Dog extends Animal{//默认继承父类的say方法 }
金毛:
package com.xingli.abstractDemo;/***@ClassName JINMAODog*@Description 金毛*@Auther William*@Date 2019/7/22 14:16*@Version 1.0*/ public class JINMAODog extends Dog{//实现父类的抽象方法@Overridepublic void say() {System.out.println("金毛:我的名字叫金毛");}}
二哈:
package com.xingli.abstractDemo;/***@ClassName ERHADog*@Description 二哈*@Auther William*@Date 2019/7/22 14:21*@Version 1.0*/ public class ERHADog extends Dog{@Overridepublic void say() {System.out.println("二哈:我的名字叫二哈");} }
直接父类创建新对象:结果报错
使用动物子类创建新对象,因为狗类也是抽象接口所以也报错
使用非抽象子类创建新对象(正确)
public class Test {public static void main(String[] args) {Animal erhaDog = new ERHADog();Animal jinmaoDog = new JINMAODog();erhaDog.say();jinmaoDog.say();} }