38

这是我的代码:

package basic;

public abstract class Entity {}

package characters;

import basic.Entity;

public abstract class Character extends Entity {}

package player;

public class Player extends Character {}

我得到了

该类型Player不能子类化final class Character.

但我检查了一百万次,我还没有final在我的项目中使用过一次。是什么赋予了?

4

4 回答 4

93

您正在扩展java.lang.Character(不需要导入,因为它来自java.lang)。

插入import characters.Character您的Player代码。


参考:使用包成员

为方便起见,Java 编译器自动为每个源文件导入两个完整的包:(1) java.lang 包和 (2) 当前包(当前文件的包)。

于 2018-12-14T12:29:24.807 回答
17

Character 是 java.lang 的一个类(“char”的包装类)。你必须在你的 Player 类中导入 characters.Character

package player;
import characters.Character

public class Player extends Character {

}
于 2018-12-14T12:30:30.360 回答
9

在这种情况下,我强烈建议在子句中使用完全限定Characterextends

public class Player extends characters.Character {}

有经验的 Java 开发人员知道,java.lang.Characterfinal可以扩展,也不能扩展。通过写作class Player extends Character,你可能会让他们不知所措。

每个编译单元都隐式导入预定义包中声明的每个公共类型名称java.lang,就好像该声明import java.lang.*;出现在每个编译单元的开头,紧跟在任何包声明之后。因此,所有这些类型的名称在每个编译单元中都可以作为简单名称使用。

Java 11 规范 > 7. 包和模块 > 7.3。编译单元

java.lang当然,从标准包中选择一个不与类冲突的名称(如Person、 或GameCharacter)会更合理。

于 2018-12-14T13:44:04.450 回答
7

Character 是Java Docs 中定义的最终类:

public final class Character
extends Object
implements Serializable, Comparable<Character>

所以它不能被子分类。

您从这个 Character 类中得到错误,该类被隐式导入。谨防!.

于 2018-12-14T12:36:55.113 回答