"不能将最终类子类化"错误,但该类不是最终的

Fle*_*her 38 java inheritance package final-class

这是我的代码:

package basic;

public abstract class Entity {}
Run Code Online (Sandbox Code Playgroud)
package characters;

import basic.Entity;

public abstract class Character extends Entity {}
Run Code Online (Sandbox Code Playgroud)
package player;

public class Player extends Character {}
Run Code Online (Sandbox Code Playgroud)

我得到了

该类型Player不能继承final class Character.

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

Ada*_*ski 93

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

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


参考:使用包成员:

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

  • 而是重命名自定义`Character`类. (19认同)

Chr*_*ris 17

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

package player;
import characters.Character

public class Player extends Character {

}
Run Code Online (Sandbox Code Playgroud)

  • 更好的建议是避免将代码库中的默认库类的名称加倍.像对待关键字"char"一样对待"Character",因为无论如何它就是它所代表的.我会说"Character"类重命名为"Avatar","Entity","Person"或其他不会导致与现有默认类混淆的东西. (12认同)

And*_*lko 9

在这种情况下,我强烈建议使用完全合格的名称中的Characterextends条款.

public class Player extends characters.Character {}
Run Code Online (Sandbox Code Playgroud)

经验丰富的Java开发人员知道这java.lang.Character是因为final并且因此无法扩展.通过写作class Player extends Character,你可能会让他们感到困惑.

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

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

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


Jab*_*ngg 7

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

public final class Character
extends Object
implements Serializable, Comparable<Character>
Run Code Online (Sandbox Code Playgroud)

所以它不能分类.

您正在从此Character类中获取错误,该类正在被隐式导入.谨防!.