java抽象类

每日一言

So, who should we hold responsible? Compensation. Punishment. If you didn’t want any problems you shouldn’t have taken risks. – Watashi
from Humanity Has Declined

抽象类

抽象类是用关键字 abstract 修饰的类。

我们创建一个基本的抽象类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class Animal{
//成员变量
String name;
//构造方法
public Animal(String name){
this.name = name;
}
//成员方法
public void sleep(){
System.out.println(name + " is sleeping");
}
//抽象方法
public abstract void eat();
}

abstract类具有以下特征:

  1. 不能直接实例化
  2. 可以包含抽象方法
  3. 其余特性与普通的类一致

所以我们我们仅仅只需在两种情况下声明一个 abstract类:

  • 我们不希望编写的类被实例化,希望它仅仅作为基类,被子类继承
  • 对于类的某些方法还不确定实现方法,需要声明一个抽象方法

虽然 abstract 类无法被实例化,但这并不表明我们无法声明一个抽象类。就像在多态中讲的那样,我们依然可以创建子类作为示例,但是用他的父类(抽象类)来声明实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
abstract class Animal {  
static String name = "动物"; //静态变量
abstract void eat();
}

class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃鱼");
}
}

public class Test {
public static void main(String[] args) {
System.out.println(Animal.name); //抽象类也可以访问静态变量、静态方法
Animal a = new Cat(); //抽象类可以引用子类对象
a.eat();
Cat c = (Cat)a;
c.eat();
}
}


抽象方法

抽象方法是使用 abstract关键字修饰的成员方法。声明方式如下:

1
2
3
4
<访问修饰符> abstract <返回值类型> <方法名>(参数列表);
//示例
public abstract double calculateArea();
abstract void eat();

声明限制:抽象方法只能在下面两个地方进行声明

  • 抽象类中
  • 接口中
  • 构造方法、类方法(static修饰的方法)无法被 abstract修饰

继承抽象类的子类必须实现(重写)所有的抽象方法,除非子类也是抽象类。

对于父类抽象方法的重写也算是一种重写,所以需要遵守重写的相关规则:

  • 参数列表与被重写方法的参数列表必须完全相同
  • 返回类型与被重写方法的返回类型可以不同,但必须是父类返回值的派生类
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
  • 子类和父类在同一个包中,那么子类可以重写父类的所有方法,除了声明为private和final的方法
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法

java抽象类
http://blog.ulna520.com/2025/03/17/java抽象类_20250317_151613/
Veröffentlicht am
March 17, 2025
Urheberrechtshinweis