给定:考虑以下接口和类:类c的代码必须是什么样的才能成功编译?
public interface I {
public void m1();
public void m2();
}
public class C implements I {
// code for class C
}
这是我(以前)的回答:
public interface I {
public void m1();
default public void m2 {
System.out.println("default m2");
}
}
public class C implements I {
public void m1()
}
C c = new C();
c.m2();
有什么办法可以改进吗?我是不是把原来的代码改得太多了?这是我的作业,但我需要反馈。我不熟悉界面。感谢您的帮助!
编辑:我试过这么做
interface I {
public void m1();
public void m2();
}
public class C implements I {
public static void main(String[] args){
public void m1() {
System.out.println("To be honest..");
}
public void m2() {
System.out.println("It's a vague question to begin with.");
}
}
class Main {
public static void main(String[] args) {
C why = new C();
why.m1();
why.m2();
}
}
输出:
错误:表达式public void m1()的非法开始{
我不知道为什么会出现这个错误我只是做了这个网站所做的:源代码,但我的编译器坚持让我插入一个 public static void main(String[] args){
即使我已经有一个在底部。我唯一的错误就是 illegal start of expression
上 public void m1(){
5条答案
按热度按时间vc9ivgsu1#
我认为我们的目标是只改变c类,而不是改变接口。不做作业,只写c类的代码
h6my8fg22#
使代码在编译时不做太多更改的理想方法是重写类中的接口方法。另外,如果在单个文件中定义了接口和类,请删除接口的访问修饰符。
解决方案-
或者,如果您想在接口中定义一个默认方法,您可以按如下方式进行-
e5nqia273#
当一个接口由一个类实现时,我们需要为实现类中接口中声明的方法提供实现。
接口只提供方法的声明,这些方法的定义应该在实现的类中给出。
我们可以对接口中的方法使用default关键字来提供实现的而不是声明(可从java8获得)。在这种情况下,未提供定义的方法应该在类c中实现
根据问题——代码应该在c类中给出。因此,更改接口方法并不是完美的答案。
wd2eg0qa4#
“我是不是把原来的代码改得太多了?”
在我看来,是的。问题是“类c的代码必须是什么样的才能成功编译?”。那就是问你该怎么改变
C
使其可编译。它没有提到改变I
.这将是一个更好的答案:
非代码(即英语)的答案是
C
需要实施m1
以及m2
声明的方法I
... 具有相同的签名和兼容的返回类型throws
条款。还有几个额外的警告。这个
I
以及C
代码需要在不同的文件中(因为两者都是顶级类型和public
). 这意味着他们每个人都应该有一个package
开始时的声明。fwiw,还有一个答案:
拆下
implements I
以及C
将编译。但我不认为这是问问题的人期望的答案。iswrvxsc5#
一句话就行了。
但首先:
我不知道你为什么要加上这个,也不知道它想达到什么目的。我想这是你不小心粘进去的测试代码。但如果不是这样,这就没有意义了-只是摆脱它/解释一下这是要做什么。
问题的本质是,实现接口的类必须为接口中提到的每个方法都有一个实现。有很多方法可以解决这个问题:
从接口中删除方法(只需删除中声明方法的2行)
I
-瞧!在接口中为这些方法提供默认的实现,这样就不需要实现接口的类来提供这些方法的实现—您或多或少已经做到了这一点。不过,这可能是解决问题最复杂的方法了!
给出所述方法的类实现。
只需将类抽象化—抽象类不必为它通常继承的所有方法提供实现。
最后一个是你最简单的答案。一个字的改变:
然而,这掩盖了这个问题的一个更核心的问题:
这是个愚蠢的问题!
这个问题明确指出:“c类的代码什么是真的”——正如我在上面所展示的,这个问题没有一个答案。
如果我们对提出问题的人缺乏严谨性做出一些假设,我猜我们的意图是假定
abstract
不作为一个概念存在,并且所提供的接口将被视为是不可更改的。在这种情况下,唯一正确的答案是c类需要两种方法的实现。因此,虽然有很多答案,而c抽象是最简单的,但如果我看看我的水晶球,对问题作者(糟糕地)试图在这里完成的事情做一些假设,他们会寻找这个:虽然不必要,你也应该始终坚持
@Override
这些方法的注解,所以,@Override public void m1() {}
. 这是由编译器检查的文档:如果您将注解粘贴在一个实际上没有重写任何内容的方法上(例如,因为您输入了一个错别字),编译器会告诉您这一点,这非常好。如果你想的话,你可以不穿(m1() {}
将重写该注解是否存在-该注解只是确保如果它不重写任何内容,编译器将出错)。