上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(五)-CSDN博客
十一、抽象类是否必须要有抽象方法?
在Java中,抽象类(abstract
class)是一种不能被直接实例化的类,它通常作为其他类的基类存在。抽象类可以包含抽象方法,也可以不包含。
抽象方法:
- 抽象方法是没有方法体的方法,它同样被声明为
abstract
。抽象方法必须在抽象类中声明,而且任何继承了抽象类的非抽象子类都必须提供这些抽象方法的具体实现。
抽象类和抽象方法的关系:
- 抽象类可以包含抽象方法,也可以不包含。即使一个抽象类没有抽象方法,它仍然不能被实例化,但可以作为其他类的基类。
- 如果一个类继承了一个带有抽象方法的抽象类,那么这个子类必须提供所有抽象方法的具体实现,除非该子类也被声明为抽象类。
示例代码:
// 一个抽象类,它没有抽象方法,但仍然不能被实例化
abstract class Animal {
public void eat() {
System.out.println("Eating...");
}
// 可以有具体的方法实现,也可以没有
}
// 一个抽象类,包含一个抽象方法
abstract class Figure {
public abstract double area();
}
// 一个具体类实现抽象类Figure
class Circle extends Figure {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
总结:
- 抽象类不必须包含抽象方法。它可以包含全部都是具体实现的方法。
- 抽象类不能被实例化,它通常用作继承的基类。
- 如果抽象类包含抽象方法,那么任何非抽象的子类都必须提供这些抽象方法的实现。
- 抽象类可以用于提供共同的属性和方法,同时定义一些子类必须实现的接口(即使它们没有抽象方法)。
十二、普通类和抽象类有哪些区别?
在Java中,普通类(也称为具体类)和抽象类有以下几个主要的区别:
-
实例化:
- 普通类可以被直接实例化,创建对象。
- 抽象类不能被直接实例化,必须通过其子类来创建对象。
-
构造方法:
- 普通类可以有(或没有)构造方法,并且在创建对象时会被调用。
- 抽象类也可以有构造方法,但这些构造方法不能直接调用,只能通过其子类实例化时被调用。
-
抽象方法:
- 普通类不能包含抽象方法(没有方法体的方法),如果有抽象方法,它自己必须被声明为抽象类。
- 抽象类可以包含抽象方法,并且至少有一个抽象方法。
-
访问修饰符:
- 普通类可以被声明为
public
、protected
、默认(无修饰符)
或private
。 - 抽象类同样可以有这些访问修饰符。
- 普通类可以被声明为
-
继承和实现:
- 普通类可以继承另一个普通类或抽象类,并实现接口。
- 抽象类可以继承另一个抽象类或普通类,也可以实现接口。
-
设计目的:
- 普通类通常用于创建对象,表示系统中的具体实体。
- 抽象类用于定义接口和部分实现,通常作为基类供其他子类继承和扩展。
-
使用
final
关键字:- 普通类可以使用
final
关键字修饰,表示该类不能被继承。 - 抽象类不能被声明为
final
,因为抽象类的设计目的就是要被继承(除非它实现了所有的方法,这样它就不是真正的抽象类了)。
- 普通类可以使用
-
多态:
- 普通类可以通过多态机制被其子类继承并重写其方法。
- 抽象类同样可以利用多态,其未实现的方法可以在子类中被重写。
示例代码:
// 一个普通类
class Car {
public void drive() {
System.out.println("Driving the car.");
}
}
// 一个抽象类
abstract class Animal {
public abstract void makeSound(); // 抽象方法
public void eat() {
System.out.println("The animal is eating.");
}
}
// 继承抽象类的子类
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof woof!");
}
}
总结:
- 普通类是完整的类定义,可以创建实例,而抽象类是一类特殊的类,不能创建实例,通常作为基类使用。
- 抽象类可以包含抽象方法,而普通类不可以(除非它被声明为抽象类)。
- 抽象类和普通类都支持继承和多态,但抽象类的设计初衷是作为一个模板,为其他类提供共同的属性和方法。