抽象类方法是否具有正文?

时间:2017-12-10 23:55:21

标签: java oop abstract-class

我得出的理论是,抽象类方法没有方法体,只有方法签名。虽然方法没有在方法声明中指定abstract关键字,但它会自动转换为JVM中的摘要 那么为什么这个eat()方法有一个正文,为什么它不会在Swan类中覆盖。

public abstract class Animal {

    protected int age;

    public void eat() {
        System.out.println("Animal is eating");
    }

    public abstract String getName();
}

class Swan extends Animal {

    public String getName() {
        return "Swan";
    }
}

3 个答案:

答案 0 :(得分:1)

来自Oracle tutorial

抽象类与接口相比

抽象类与接口类似。您无法实例化它们,并且它们可能包含使用或不使用实现声明的方法组合。

如果定义一个方法,那么就可以像任何其他超类方法一样引用它。

答案 1 :(得分:1)

  

我得出的理论是抽象类方法没有方法体,只有方法签名。

这不是一个理论,它是一个事实,在JLS #8.4.3.1 'Abstract methods'中指定,但它适用于抽象方法,而不适用于抽象中的所有方法类

  

虽然方法没有在方法声明中指定abstract关键字,但它会自动转换为JVM中的抽象。

不,它没有。 JLS #8.1.1.1 'Abstract classes'中没有任何相关内容。

  

那么这个eat()方法怎么会有一个正文

因为它不是抽象的。

  

怎么没有在Swan课程中覆盖呢。

我不知道这意味着什么。

答案 2 :(得分:1)

  

我得出的理论是抽象类方法没有   方法体,只有方法签名。

实际上,Java类和方法都可以是抽象的。抽象方法是一种只能签名的方法。

除其他外,还有一个抽象的Java类:

  • 可能包含抽象方法,具体方法或两者兼有
  • 可能无法直接实例化
  • 定义一种类型(就像界面一样)

具体的Java类:

  • 可能不包含抽象方法(只允许具体方法)
  • 可以直接实例化
  • 可以定义一个类型,但接口(有时是抽象类)通常更好地用于此目的