我做的对吗(接口和类代码(编译成功)

6ljaweal  于 2021-07-09  发布在  Java
关注(0)|答案(5)|浏览(437)

给定:考虑以下接口和类:类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 expressionpublic void m1(){

vc9ivgsu

vc9ivgsu1#

我认为我们的目标是只改变c类,而不是改变接口。不做作业,只写c类的代码

h6my8fg2

h6my8fg22#

使代码在编译时不做太多更改的理想方法是重写类中的接口方法。另外,如果在单个文件中定义了接口和类,请删除接口的访问修饰符。
解决方案-

interface I {
    public void m1();
    public void m2();
}
public class C implements I {
    // code for class C
    @Override
    public void m1() {}

    @Override
    public void m2() {}
}

或者,如果您想在接口中定义一个默认方法,您可以按如下方式进行-

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();
    }
}
e5nqia27

e5nqia273#

当一个接口由一个类实现时,我们需要为实现类中接口中声明的方法提供实现。
接口只提供方法的声明,这些方法的定义应该在实现的类中给出。
我们可以对接口中的方法使用default关键字来提供实现的而不是声明(可从java8获得)。在这种情况下,未提供定义的方法应该在类c中实现
根据问题——代码应该在c类中给出。因此,更改接口方法并不是完美的答案。

public class C implements I {
        public void m1(){
            System.out.println("simply a method definition");
        }
        public void m2(){
            System.out.println("simply a method definition");
        }

        }
wd2eg0qa

wd2eg0qa4#

“我是不是把原来的代码改得太多了?”
在我看来,是的。问题是“类c的代码必须是什么样的才能成功编译?”。那就是问你该怎么改变 C 使其可编译。它没有提到改变 I .
这将是一个更好的答案:

public class C implements I {
    public void m1() {
         // do something
    }

    public void m2() {
         // do something else
    }
}

非代码(即英语)的答案是 C 需要实施 m1 以及 m2 声明的方法 I ... 具有相同的签名和兼容的返回类型 throws 条款。
还有几个额外的警告。这个 I 以及 C 代码需要在不同的文件中(因为两者都是顶级类型和 public ). 这意味着他们每个人都应该有一个 package 开始时的声明。
fwiw,还有一个答案:

public class C {}

拆下 implements I 以及 C 将编译。但我不认为这是问问题的人期望的答案。

iswrvxsc

iswrvxsc5#

一句话就行了。
但首先:

C c = new C();          
c.m2();

我不知道你为什么要加上这个,也不知道它想达到什么目的。我想这是你不小心粘进去的测试代码。但如果不是这样,这就没有意义了-只是摆脱它/解释一下这是要做什么。
问题的本质是,实现接口的类必须为接口中提到的每个方法都有一个实现。有很多方法可以解决这个问题:
从接口中删除方法(只需删除中声明方法的2行) I -瞧!
在接口中为这些方法提供默认的实现,这样就不需要实现接口的类来提供这些方法的实现—您或多或少已经做到了这一点。不过,这可能是解决问题最复杂的方法了!
给出所述方法的类实现。
只需将类抽象化—抽象类不必为它通常继承的所有方法提供实现。
最后一个是你最简单的答案。一个字的改变:

public interface I {
    public void m1();
    public void m2();
}

public abstract class C implements I {}

然而,这掩盖了这个问题的一个更核心的问题:
这是个愚蠢的问题!
这个问题明确指出:“c类的代码什么是真的”——正如我在上面所展示的,这个问题没有一个答案。
如果我们对提出问题的人缺乏严谨性做出一些假设,我猜我们的意图是假定 abstract 不作为一个概念存在,并且所提供的接口将被视为是不可更改的。在这种情况下,唯一正确的答案是c类需要两种方法的实现。因此,虽然有很多答案,而c抽象是最简单的,但如果我看看我的水晶球,对问题作者(糟糕地)试图在这里完成的事情做一些假设,他们会寻找这个:

public interface I {
    public void m1();
    public void m2();
}

public class C implements I {
    @Override public void m1() {}
    @Override public void m2() {}
}

虽然不必要,你也应该始终坚持 @Override 这些方法的注解,所以, @Override public void m1() {} . 这是由编译器检查的文档:如果您将注解粘贴在一个实际上没有重写任何内容的方法上(例如,因为您输入了一个错别字),编译器会告诉您这一点,这非常好。如果你想的话,你可以不穿( m1() {} 将重写该注解是否存在-该注解只是确保如果它不重写任何内容,编译器将出错)。

相关问题