Java抽象方法签名
我对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) {
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基类接受所有对象,包括字符串。底线是您不能更改接口强制执行的契约中的参数。在这里,您正在将参数的类型从字符串更改为对象,这从技术上讲使其成为一个新的方法定义,而不是接口约定的实现,因此出现了错误。那么,哪些代码不明确或无法工作?哪些代码不明确或无法工作?