java中重写抽象方法的快捷方式_关于java:抽象方法实现与抽象方法重写。 这两个对抽象类的意义是否相同?...

我差点参加Java SE 8 Programmer I考试(1Z0-808)。我正在使用这本学习指南:https://www.selikoff.net/java-oca-8-programmer-i-study-guide/。在回答第5章(班级设计)中的复习问题时,我在这个问题上失败了:

关于具体子类,以下哪一项是正确的? (选择所有适用的选项)

具体的子类可以声明为abstract。

具体的子类必须实现所有继承的抽象方法。

具体的子类必须实现一个中定义的所有方法

继承的接口。

具体的子类不能标记为final。

具体的子类不能覆盖抽象方法。

我的答案是2和5.但只有第二个是正确的。我选择了第5个答案,因为我认为你不能从抽象类中覆盖抽象方法,但是你可以实现它,就像从Java 8开始几乎就像抽象类一样。

在谈论抽象类时,知道接口抽象方法是实现的,而不是重写:说"抽象方法可以被具体子类覆盖"而不是"抽象方法可以由具体子类实现"是正确的吗?

如果我们注意第二个答案(这是正确的答案),他们使用"实施"一词。

1,2,4..........?

@SureshAtta没有大声笑我已经说过正确的答案是第5和第2。 这不是问题

如果第五个是正确答案,那么大声笑。

@SureshAtta对不起,我的意思是只说第二个

这个问题的措辞非常糟糕。 我可能会找到一个案例,其中每个句子都是真的,另一个案例中每个句子都是假的。

这是规范使用此术语的方式:

If a non-abstract method mC overrides an abstract method mA from a class C, then mC is said to implement mA from C.

An instance method mC declared in or inherited by class C, overrides from C another method mI declared in an interface I, iff all of the following are true: [...]

请注意,在引用覆盖接口方法时,它确实使用术语"覆盖"。

更简单地说,如果方法覆盖抽象方法(来自抽象类或接口),则覆盖方法实现抽象方法。不过,它仍然被认为是一种覆盖。

abstract class A {

abstract void m();

void n() {}

}

class C extends A {

// C.m() both overrides and implements A.m()

@Override

void m() {}

// C.n() overrides A.n(), but does not implement it

@Override

void n() {}

}

Java语言规范没有定义"具体类"的概念。它确实讨论了具体方法,其中具体方法具有已定义的实现(与没有主体,只有类型签名的抽象方法相对)。 Java 8在接口中的默认方法在这里稍微混乱,但并非完全:即使方法具有默认实现,它仍然被认为是抽象的(如果没有提供其他实现,则默认实现简单地复制到实现类中)。

由于具体类别的概念定义不明确,因此很难确定地对其作出任何陈述。通常,当人们谈论具体类时,他们只是指一个非抽象类,但我也看到(并且自己使用)表达式"具体类型"来引用泛型类型的特定实例。例如,List< T >是通用的,但List可以被认为是List< T >的具体对应物,即使List仍然是抽象类型(因为它是一个接口)。

另外,由于一个类可以有多个独立的抽象接口继承层次结构,因此它可以同时具体用于其中一些,而对其他层则是抽象的!

简短的回答:当面对由不了解主题本身的人设计的测试时,忽略哪个答案是"正确的"变得毫无意义。从规范中学习,因为它是对语言中正确内容的规范定义。

我搜索了JLS,发现这个短语具体类出现在一个地方,没有定义。 (它用斜体字说明。)"不明确的"在这里确实是一个准确的描述。

"具体"没有一般定义并不重要。问题的上下文是关于单个abstract方法的简单继承,并且"具体"的任何常识定义将产生相同的答案"抽象方法可以被具体子类覆盖"。实际上,你甚至可以使用一个完全荒谬的具体定义(例如"恰好定义2个方法"),它仍然是真的。我不会质疑这个问题措辞严厉这一事实,但只回答"问题不好"的问题没有帮助。当有一个有效的答案

@HTNW:你说:"问题的上下文是关于单个抽象方法的简单继承"。我恭敬地不同意:问题并没有说明。问题的上下文是Java语言。你正在简化问题并阅读没有给出的上下文。

A concrete subclass can be declared as abstract.

由于措辞这是错误的:具体的calss不能是抽象的,如果它是一个子类和抽象,

因此它是一个抽象的子类。

A concrete subclass must implement all inherited abstract methods.

这实际上是一个棘手的问题。子类不必实现任何抽象方法,但是,如果不实现,则它也必须声明为抽象类。就像问题1一样,这是措辞;如果它是抽象的,那么从技术上讲它不是一个具体的子类,所以这个问题都是正确的。

A concrete subclass must implement all methods defined in an inherited interface.

这也是事实。但是,如果子类继承自已实现接口的超类,则子类不必重新实现它们,在这种情况下它将为false。

A concrete subclass cannot be marked as final.

这是假的;当然可以。

Abstract methods cannot be overridden by a concrete subclass.

这是另一个措辞问题。从技术上讲,你没有覆盖抽象方法,你正在实现它,所以这将是错误的。覆盖方法意味着您覆盖的方法在其父类中具有完全匹配(名称,返回类型,参数)。隐藏方法与覆盖它们相同,只是隐藏仅适用于静态方法和字段。因此,如果方法具有主体,并且您在子类中实现相同的方法,那么您将覆盖它。如果在子类中实现抽象方法,那么您只是实现它。如果在子类中实现静态方法,则将其隐藏。

这些问题措辞可怕,试图传达他们对抽象类,接口和遗传性的看法。虽然,鉴于开发是关注细节,也许这更重要。

希望能帮助澄清一些事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值