Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java抽象方法签名_Java_Inheritance_Methods_Polymorphism_Abstract - Fatal编程技术网

Java抽象方法签名

Java抽象方法签名,java,inheritance,methods,polymorphism,abstract,Java,Inheritance,Methods,Polymorphism,Abstract,我对Java类实现的抽象方法符号感到非常困惑 例如,考虑: interface Programmer { Object program(); } class Linus implements Programmer { public String program() { return "goto end;"; } } public class Main { public static void main(String[] args) {

我对Java类实现的抽象方法符号感到非常困惑

例如,考虑:

interface Programmer {
    Object program();
}

class Linus implements Programmer {
    public String program() {
        return "goto end;";
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(new Linus().program());
    }
}
这显然是可以接受的,因为任何期望对象来自Linus.program()的对象都会得到一个(特别是字符串)

但现在考虑一下:

interface OS {
    void run(String code);
}

class Linux implements OS {
    public void run(Object code) {
        System.out.println("Hello world");
    }
}

public class Main {
    public static void main(String[] args) {
    new Linux().run("print 'Hello world'");
    }
}
这将导致编译失败,并产生错误:

The type Linux must implement the inherited abstract method OS.run(String)
现在,任何东西都可以将字符串传递到操作系统接口的任何实例中,而Linux肯定可以做到这一点


我看不出第二个无法编译的原因。在让Java编译第二个程序的后果中,我是否遗漏了使这一点成为禁止的东西?

对于第二种情况,您所做的是方法过载。
方法的签名是“方法名称”和“参数的数量和类型”
在第二种情况下,您正在更改参数的类型,编译器的东西是另一种方法,并要求您实现抽象(未实现)方法。如果您实现了接口
public void run(String code)
中的方法,则此方法
public void run(Object code)
将被视为重载方法


注意:方法over riding从不基于该方法的返回类型。因为返回类型不被视为方法的签名

对于第二种情况,您所做的是方法过载。
方法的签名是“方法名称”和“参数的数量和类型”
在第二种情况下,您正在更改参数的类型,编译器的东西是另一种方法,并要求您实现抽象(未实现)方法。如果您实现了接口
public void run(String code)
中的方法,则此方法
public void run(Object code)
将被视为重载方法


注意:方法over riding从不基于该方法的返回类型。由于返回类型不被视为方法的签名

您不能传递基类对象的实例来代替类字符串的实例,但相反的方式是有效的。在接口操作系统中,run方法的参数为String类型,在实现类中,您将参数泛化为Object类型,这是不允许的。因此,编译器会抱怨。

您不能传递基类对象的实例来代替类字符串的实例,但反之亦然。在接口操作系统中,run方法的参数为String类型,在实现类中,您将参数泛化为Object类型,这是不允许的。因此,编译器会抱怨。

您说“现在,任何东西都可以将字符串传递到操作系统接口的任何实例中,您当然可以在Linux上这样做。”=>问题是您可以,但不需要这样做

考虑一下:由于该方法的Linux版本将对象作为参数,因此您可以尝试传递一个集合,例如。因此,您不会尊重接口,接口明确地将参数限制为字符串。这就是为什么Linux版本的方法不被认为是OS版本的“子”的原因

由于接口中的每个方法都需要有它的“子对象”,编译器会抱怨您没有为OS实现“子对象”。run(String)

您说“现在,任何东西都可以将字符串传递到OS接口的任何实例中,您当然可以在Linux中这样做。”=>问题是您可以,但不需要这样做

考虑一下:由于该方法的Linux版本将对象作为参数,因此您可以尝试传递一个集合,例如。因此,您不会尊重接口,接口明确地将参数限制为字符串。这就是为什么Linux版本的方法不被认为是OS版本的“子”的原因


由于接口中的每个方法都需要有其“child”,编译器会抱怨您没有为OS.run(String)实现“child”

这并不能解释它。我正在调用Linux基类。如果我调用操作系统接口,那么这一点是有效的。Linux基类接受所有对象,包括字符串。底线是您不能更改接口强制执行的契约中的参数。在这里,您将参数的类型从字符串更改为对象,这在技术上使其成为一个新的方法定义,而不是接口约定的实现,因此出现了错误。这并不能解释它。我正在调用Linux基类。如果我调用操作系统接口,那么这一点是有效的。Linux基类接受所有对象,包括字符串。底线是您不能更改接口强制执行的契约中的参数。在这里,您正在将参数的类型从字符串更改为对象,这从技术上讲使其成为一个新的方法定义,而不是接口约定的实现,因此出现了错误。那么,哪些代码不明确或无法工作?哪些代码不明确或无法工作?