在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 {}