抽象类和接口的应用
1.抽象类中能不能包含方法体?
答:抽象类中可以包含方法体。抽象类的构成也可以完全是包含方法体的普通方法,只不过这样并不是抽象类最优的使用方式。
题目解析:包含了方法体的抽象类示例代码如下:
abstract class AbstractAnimal {
public void run() {
System.out.println("AbstractAnimal Run.");
}
}
class Animal extends AbstractAnimal {
public static void main(String[] args) {
AbstractAnimal animal = new Animal();
animal.run();
}
}
以上代码执行的结果是: AbstractAnimal Run.
2.抽象类能不能被实例化?为什么?
答:抽象类不能被实例化,因为抽象类和接口的设计就是用来规定子类行为特征的,就是让其他类来继承,是多态思想的一种设计体现,所以强制规定抽象类不能被实例化。
3.抽象方法可以被 private 修饰吗?为什么?
答:抽象方法不能使用 private 修饰,因为抽象方法就是要子类继承重写的,如果设置 private
则子类不能重写此抽象方法,这与抽象方法的设计理念相违背,所以不能被 private 修饰。
4.添加以下哪个选项不会引起编译器报错?
abstract class AbstractAnimal {
static String animalName = "AbstractAnimal";
// 添加代码处
}
A:protected abstract void eat();
B: void eat();
C:abstract void eat(){};
D:animalName += "Cat";
答:A
题目解析:选项 B 普通方法必须有方法体;选项 C 抽象方法不能有方法体;选项 D 变量赋值操作必须在方法内。
5.以下关于抽象类和抽象方法说法正确的是?
A:抽象类中的方法必须全部为抽象方法
B: 抽象类中必须包含一个抽象方法
C:抽象类中不能包含普通方法
D:抽象类中的方法可以全部为普通方法(包含方法体)
答:D
题目解析:抽象类中可以没有方法或者全部为普通方法,都是允许的,如下代码所示:
abstract class AbstractAnimal {
public void run() {
System.out.println("AbstractAnimal Run.");
}
}
class Animal extends AbstractAnimal {
public static void main(String[] args) {
AbstractAnimal animal = new Animal();
animal.run();
}
}
程序执行的结果为:AbstractAnimal Run.
6.接口和普通类有什么关系?
答:在 Java 语言设计中,接口不是类,而是对类的一组需求描述,这些类必须要遵循接口描述的统一格式进行定义。
7.接口能不能有方法体?
答:JDK 8 之前接口不能有方法体,JDK 8 之后新增了 static 方法和 default 方法,可以包含方法体。
8.执行以下代码会输出什么结果?
interface IAnimal {
static String animalName = "Animal Name";
}
class AnimalImpl implements IAnimal {
static String animalName = new String("Animal Name");
public static void main(String[] args) {
System.out.println(IAnimal.animalName == animalName);
}
}
答:执行的结果为 false。
题目解析:子类使用 new String… 重新创建了变量 animalName,又因为使用 == 进行内存地址比较,所以结果就是 false。
9.抽象类和接口有什么区别?
答:抽象类和接口的区别,主要分为以下几个部分。
默认方法
-
抽象类可以有默认方法的实现
-
JDK 8 之前接口不能有默认方法的实现,JDK 8 之后接口可以有默认方法的实现
继承方式
-
子类使用 extends 关键字来继承抽象类
-
子类使用 implements 关键字类实现接口
构造器
-
抽象类可以有构造器
-
接口不能有构造器
方法访问修饰符
-
抽象方法可以用 public / protected / default 等修饰符
-
接口默认是 public 访问修饰符,并且不能使用其他修饰符
多继承
-
一个子类只能继承一个抽象类
-
一个子类可以实现多个接口
10.以下抽象方法描述正确的是?
A:抽象方法可以是静态(static)的
B:抽象方法可同时是本地方法(native)
C:抽象方法可以被 synchronized 修饰
D:以上都不是
答:D
题目解析:抽象方法需要被子类重写,而静态方法是无法被重写的,因此抽象方法不能被静态(static)修饰;本地方法是由本地代码实现的方法,而抽象方法没有实现,所以抽象方法不能同时是本地方法;synchronized和方法的实现细节有关,而抽象方法不涉及实现细节,因此抽象方法不能被 synchronized 修饰。
总结
抽象类和接口都是面向对象编程中多态的具体实现,在 Java 编程思想中占据着重要的地位,同时也是初级面试岗位必问的问题之一,但由于接口在 JDK 8中的改动比较大,因而面试者在网上搜到的绝大数关于接口和抽象类区别的答案也是不准确的,这点需要面试者特别注意一下。