Java-Chapter 13 Abstract Classes and Interfaces

问题 1:什么是抽象类?

答案
抽象类是一种不能直接实例化的类,它可以包含数据和方法,但无法使用 new 操作符直接创建对象。

解释
抽象类的主要作用是为其子类提供一个模板,子类必须实现抽象类中的抽象方法,才能创建实例。抽象类可以包含常规方法和实例变量,但它不能实例化,因为它通常被设计为提供通用的行为和属性,而具体的行为由子类实现。


问题 2:什么是抽象方法?

答案
抽象方法是没有方法体的方法,只包含方法的声明,必须在子类中实现。

解释
抽象方法没有方法体,只定义了方法的签名。任何包含抽象方法的类都必须声明为抽象类。抽象方法的目的是让子类根据需要实现具体的行为。抽象方法通常用于定义类的公共接口。

示例

1
2
3
4
5
6
7
8
9
10
11
abstract class Animal {
// 抽象方法
abstract void sound();
}

class Dog extends Animal {
// 实现抽象方法
void sound() {
System.out.println("Bark");
}
}

问题 3:一个非抽象类可以包含抽象方法吗?

答案
不能。一个非抽象类不能包含抽象方法。如果一个类包含抽象方法,它必须被定义为抽象类。

解释
只有抽象类才能包含抽象方法,因为抽象方法没有具体的实现,它必须由子类提供实现。如果在非抽象类中包含抽象方法,编译器会报错,要求该类声明为抽象类。


问题 4:一个抽象类是否可以没有抽象方法?

答案
是的,一个抽象类可以没有抽象方法。抽象类的主要目的是不能被实例化,它可以包含普通的实例方法和变量。

解释
虽然抽象类通常包含抽象方法,但它也可以没有任何抽象方法。在这种情况下,抽象类的作用是提供一个通用的父类,或者为其子类提供默认的行为。


问题 5:子类必须实现父类的所有抽象方法吗?

答案
是的,如果子类不是抽象类,它必须实现父类的所有抽象方法。否则,子类也必须声明为抽象类。

解释
如果子类继承了一个抽象类并且没有实现父类的所有抽象方法,子类就必须被定义为抽象类。这样,编译器就不会强制要求它实现父类的抽象方法。只有当子类实现了所有抽象方法时,才可以实例化该类。


问题 6:子类是否可以是抽象类,父类是具体类?

答案
是的,子类可以是抽象类,即使它的父类是具体类。

解释
子类可以选择不实现父类的某些方法,特别是如果它也想将某些方法留给进一步的子类去实现。因此,子类可以声明为抽象类,即使其父类是一个具体类(即没有抽象方法的类)。这种做法通常用于实现多层次的抽象。

  1. 抽象类不能直接实例化,主要作为子类的模板。
  2. 抽象方法没有方法体,必须在子类中实现。
  3. 含有抽象方法的类必须声明为抽象类
  4. 非抽象类不能包含抽象方法。
  5. 一个抽象类可以没有抽象方法。
  6. 子类必须实现所有父类的抽象方法,除非子类是抽象类。

问题 7:什么是接口(Interface)?

答案
接口是一个类似于类的结构,它只包含常量和抽象方法。接口可以被看作是一种特殊的抽象类,但与抽象类不同,接口不能包含实例变量和具体方法。

解释
接口主要用于定义类应遵循的一组方法签名。与抽象类相比,接口更侧重于定义一个公共的行为规范,而不关心具体的实现。接口中的方法默认是抽象的,且不能包含实现代码。接口可以用于实现类之间的多重继承,允许多个类实现相同的接口。


问题 8:接口和抽象类有何区别?

答案

  • 接口只能包含常量和抽象方法,而抽象类可以包含常量、抽象方法、具体方法以及实例变量。
  • 接口不能有实例变量,而抽象类可以。
  • 一个类可以实现多个接口,但只能继承一个抽象类。

解释
接口与抽象类的主要区别在于接口只定义行为规范,不关心实现细节,而抽象类既可以定义行为规范,也可以提供实现。抽象类可以包含一些具体的实现和实例变量,而接口则不能包含任何实例变量或方法的实现。类可以实现多个接口,但只能继承一个抽象类。


问题 9:Java中的Comparable接口是什么?

答案
Comparable接口定义了一个compareTo方法,用于比较当前对象与另一个对象的大小关系。

解释
Comparable接口允许对象进行自然排序。在实现了Comparable接口的类中,compareTo方法通常用于实现对象的排序逻辑。很多Java类,如StringIntegerDate等都实现了Comparable接口,从而可以使用诸如Collections.sort()等方法进行排序。

示例

1
2
3
4
5
6
7
8
9
public class Person implements Comparable<Person> {
private String name;
private int age;

@Override
public int compareTo(Person other) {
return this.age - other.age;
}
}

问题 10:什么是Cloneable接口?

答案
Cloneable是一个标记接口,它不包含任何方法或常量,用于标记类可以被克隆。

解释
Cloneable接口并没有定义任何方法,它的存在是为了标记一个类的对象可以被复制(克隆)。如果一个类实现了Cloneable接口,那么该类的对象可以调用Object类中的clone()方法进行浅拷贝或深拷贝。


问题 11:一个类可以继承多个接口吗?

答案
是的,一个类可以实现多个接口,但只能继承一个类。

解释
Java允许一个类实现多个接口,这意味着类可以从多个接口继承方法,从而实现多重继承的效果。然而,Java不支持类的多重继承,一个类只能继承一个父类。通过实现多个接口,Java克服了多重继承的限制,实现了接口的多继承。


问题 12:接口可以继承多个接口吗?

答案
是的,接口可以继承多个接口。

解释
在Java中,接口之间可以通过extends关键字继承多个接口。当一个接口继承多个接口时,它继承了所有接口的抽象方法。类实现这个接口时,必须实现所有继承自多个接口的抽象方法。

  1. 接口只包含常量和抽象方法,而抽象类可以包含常量、抽象方法、实例变量和具体方法。
  2. 接口可以通过实现多个接口来实现多重继承,而类只能继承一个父类。
  3. Comparable接口用于实现对象的自然排序,类需要实现compareTo方法。
  4. Cloneable是一个标记接口,用于表示类的对象可以被克隆。
  5. 接口之间可以继承多个接口。