你真的了解java的抽象类和抽象方法吗?一起来看看吧。
(尽量整理的全面逻辑一点了,因为资料大多是零碎的提及,可以补充!)
抽象类
抽象类是不能实例化的类,可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。
- 使用关键字
abstract
,它可以包含抽象方法和非抽象方法。 - 抽象类可以有构造方法和成员变量。
- 子类必须实现所有抽象方法,除非子类本身也是抽象类。
- 抽象类不能被实例化,通常用作其他类的基类,其中包含了一些通用的方法。
- 抽象类中可以包含普通的成员变量和成员方法。
- 因为抽象类不能被实例化,通常用于作为其他类的父类,声明方法而不实现它们,需要子类来实现。
public abstract class AbstractClass { // 抽象类定义
public void nonAbstractMethod() {
// 非抽象方法的实现
}
public abstract void abstractMethod(); // 抽象方法
}
abstract class Animal {
abstract void sound();
//抽象方法不能有方法体,也就是大括号对,它的实现要在子类里,不是在抽象类本身这里
public void sleep() {
System.out.println("Sleeping...");
}
}
class Dog extends Animal {
//覆盖
@Override
void sound() {
System.out.println("Bark"); //继承覆盖抽象父类,具体实现了父类的抽象方法
}
}
Q:抽象类的子类也都是抽象的吗?
A:不是的,在Java中,抽象类的子类不一定是抽象的。当一个抽象类有一个或多个抽象方法时,通常情况下,它的子类需要实现这些抽象方法。如果子类实现了所有的抽象方法,那么该子类就是一个非抽象类;如果子类没有实现所有的抽象方法,那么该子类必须继续声明为抽象类,或者它自己也要包含抽象方法。
下面是一个示例:
public abstract class AbstractClass {
public abstract void abstractMethod();
}
public class ConcreteClass extends AbstractClass {
// 非抽象子类需要实现抽象方法
@Override
public void abstractMethod() {
// 实现抽象方法的具体逻辑
}
}
在这个示例中,ConcreteClass
继承自 AbstractClass
,并且实现了 abstractMethod
方法,因此它是一个非抽象类。
另外,如果一个抽象类并没有包含任何抽象方法,那么它的子类即使不实现任何方法也是非抽象类。
那么问题来了,抽象类和抽象方法有什么关系呢?
Q:抽象类必须包含抽象方法吗?
A:抽象类可以有抽象方法,也可以没有抽象方法。但是,如果一个类内部包含抽象方法,那么这个类必须声明为抽象类。
~
由此我们延伸出抽象方法的概念辨析~
抽象方法
- 抽象方法是用
abstract
关键字声明、并且没有方法体的方法。(亲测有的话会报错 - 抽象方法必须存在于抽象类中,但抽象类中可以包含抽象方法,也可以不包含。
- 所有子类都需要实现抽象类中的抽象方法,除非子类本身也是抽象类。
public abstract class AbstractClass {
public abstract void abstractMethod(); // 抽象方法
}
期末笔记整理,有错误之处还望纠正和海涵。
本号持续更新java详细笔记和ac代码。