在java中扩展类并实现接口

在java中扩展类并实现接口,java,oop,extends,implements,Java,Oop,Extends,Implements,但是, 为什么case-2显示编译错误{预期的。为什么执行case-1时没有错误。扩展应在实现之前执行: class Sub implements Colorable extends Super {} // error (case -2) 这是因为JLS中有一个规范。当您尝试在Java中声明一个类时,元素有一定的顺序: 诸如公共、私有等修饰符 类名,首字母按约定大写 类的父类(超类)的名称(如果有),前面有 关键字扩展了。一个类只能扩展(子类)一个 家长 由类实现的以逗号分隔的接口列表,如果

但是,


为什么case-2显示编译错误
{预期的
。为什么执行case-1时没有错误。

扩展应在
实现之前执行:

class Sub implements Colorable extends Super {} // error (case -2)

这是因为JLS中有一个规范。当您尝试在Java中声明一个类时,元素有一定的顺序:

  • 诸如
    公共
    私有
    等修饰符
  • 类名,首字母按约定大写
  • 类的父类(超类)的名称(如果有),前面有 关键字
    扩展了
    。一个类只能扩展(子类)一个
    家长
  • 由类实现的以逗号分隔的接口列表,如果 any,前面带有关键字
    implements
    。类可以实现 不止一个接口
  • 类主体,由大括号包围,
    {}
参考:


您必须这样做。您只能扩展一个类,但可以分别用逗号实现多个接口。在实现之前先进行扩展会更方便读者

class Sub extends Super implements Colorable {}

位于的类定义的语法为

我认为,为了简化语法规则,它们并没有使其可互换

要使其可互换,您可能需要:

NormalClassDeclaration: 
    class Identifier [TypeParameters] [extends Type] [implements TypeList] ClassBody
甚至最糟糕的情况是,为了使用
,您可能会声明
扩展
实现


我想重要的是,它不值得把解析规则弄得乱七八糟。

我有一个例子来说明为什么extends在类声明中先于implements

正面:

NormalClassDeclaration: 
    class Identifier [TypeParameters] [ExtendsImplements] ClassBody

ExtendsImplements:
    [extends Type] [implements TypeList] | [implements TypeList] [extends Type]
抽象类:

public interface IParent {
    void getName();
    void getAddress();
    void getMobileNumber();
}
儿童班:

public abstract class Parent {
    public abstract void getAge();
    public void getName(){
        System.out.print("the parent name");
    }
}
如果您观察到在接口和抽象类中都有相同的方法getName(),则在抽象类中该方法具有实现

当您尝试实现时,类必须重写接口的所有抽象方法,然后我们尝试扩展抽象类,该抽象类已经有方法getName()的实现

当您创建子类的实例并将方法getName()作为

由于同一方法getName()将有两个实现,因此子级调用哪个方法实现将发生冲突

为了避免这种冲突,他们强制首先扩展,然后实现一个接口


因此,如果一个抽象类具有与接口中相同的方法,并且如果抽象类已经实现了该方法,那么对于一个子类,不必重写该方法,java中有一条规则,如果要实现接口并扩展类,我们必须先扩展类,然后再实现接口

Child child = new Child();
child.getName();
当Java编译器将一个类转换为字节码时,它必须首先查看父类。这是因为类的底层实现是指向父类的字节码——其中包含相关的方法和字段。然后它添加指向子类函数代码的指针——其中一些函数是由“i”命令的mplements’关键字


因为父类必须是可编译的,所以如果编译器预先知道该类是什么,就更容易了。此外,您只能扩展一个类,但可以实现任意数量的接口。如果extends关键字可以与任意数量的实现指令混合使用,编译时间就会增加。编译器希望尽快失败le可以减少开发时间,所以这个选择是合乎逻辑的。此外,它还可以帮助您出于同样的原因清楚地思考类。

为什么?后面有任何逻辑?只有Java语法,没有逻辑必须有一些规则。为什么{和[不能互换?为什么不能(和)被交换?同样的原因。如果你在JLS或任何地方发现任何支持性的评论。请分享。详细答案请参阅..可能重复的@yegor256。但是,你可以说,这属于我问题的第二部分。我不知道,为什么人们没有写下他们的理由就投反对票。如果有人有疑问,他们会问,另一方面另一方面,如果其他人知道答案,那么发布他们的答案,而不是进行向下投票。人们错误地使用了SO的向下投票功能。而且,我真的不这么认为,这真的是一个不相关的问题。作为一个初学者,许多人对此并不关心。您解释了java中的基本声明。但是,从您的解释和链接来看,这不是c了解为什么extend优先于implements。添加了对JLS语法页的引用我不这么认为,它将解释此语法的原因:/请提供一些引用。您可以添加任何引用来支持您的答案吗?您应该在评论中写下所有这些内容,而不是更新您的帖子。现在,您的帖子的内容少于您的评论。:DYour answer i这是抄袭的。
public abstract class Parent {
    public abstract void getAge();
    public void getName(){
        System.out.print("the parent name");
    }
}
public class Child extends Parent implements IParent {

    @Override
    public void getAddress() {
       System.out.print(" Child class overrides the Parent class getAddress()");
    }

    @Override
    public void getMobileNumber() {
        System.out.print(" Child class overrides the Parent class getMobileNumber()");
    }

    @Override
    public void getAge() {
        //To change body of implemented methods use File | Settings | File Templates.
    }
}
Child child = new Child();
child.getName();
interface A{}
class super{}

class sub extends super implements A {}