Java中的继承,表观类型与实际类型
谁能告诉我这次处决的结果吗?我注意不到为什么要调用每个方法。以及我们如何区分真实类型和表面类型。谢谢:) 结果:Java中的继承,表观类型与实际类型,java,inheritance,types,extends,Java,Inheritance,Types,Extends,谁能告诉我这次处决的结果吗?我注意不到为什么要调用每个方法。以及我们如何区分真实类型和表面类型。谢谢:) 结果: Send a fax to A Send an email to B Send a fax to B 你就是那个(根据维基百科)用不同的实现创建多个同名方法的人。我想你指的是f(ax)方法和f(bx)方法。重写(根据wikipedia)允许子类或子类提供已由其超类或父类之一提供的方法的特定实现 根据你在问题中表达的惊讶,我认为你想要类似的东西 @Override public vo
Send a fax to A
Send an email to B
Send a fax to B
你就是那个(根据维基百科)用不同的实现创建多个同名方法的人。我想你指的是f(ax)
方法和f(bx)
方法。重写(根据wikipedia)允许子类或子类提供已由其超类或父类之一提供的方法的特定实现
根据你在问题中表达的惊讶,我认为你想要类似的东西
@Override
public void f(A x) {
System.out.println("Send an email to"+ x ) ;
}
这定义了类的输出方式。当您调用以下函数时:
b.f(a)
您正在输入一个类作为参数。由于您的
toString()
方法是输出类的标准方法的重写,因此在向发送电子邮件后显示id
,因为B
扩展了A
并且A有一个公共方法。所以它有以下两种方法-
public void f(A x){
System.out.println("Send a fax to "+ x ) ;
}
及-
public void f(B x){
System.out.println("Send an email to"+ x ) ;
}
实际上B
中的第二个方法是从A
继承的B
类的对象同时具有f(A)
和f(B)
方法的重载版本。当您调用f(x)
时,它通常会选择与x
类型匹配的最具体的一个。对于这一点,重要的是引用的类型
因此您的a
是a
,因此它调用f(a)
。您的b
是b
,因此它调用f(b)
。但是你的ab
是什么?引用的类型是A
。因此编译器告诉它调用f(A)
重载
但是,它不应该使用ab
对象作为A
,因此使用A.toString()
而不是B.toString()
向A
发送传真吗
否,因为在这种情况下要调用的方法的选择不是由参数决定的。它不是像上面的选择那样在重载之间进行选择,而是在覆盖之间进行选择。当决定使用哪个方法时,从超类还是从子类,对象的实际类型决定了它。由于ab
引用的对象实际上是aB
,因此选择了B
的toString()
因此,在重载方法中,选择的方法是根据参数的数量和类型确定的,参数的类型是引用的类型
在被重写的方法中,选择的方法是对象实例的实际类型中的方法,而不管调用它的引用的类型是什么
请注意,只有当方法与父方法具有相同的名称、参数数量和相应的参数类型时,才认为该方法被重写
public void f(A x){
System.out.println("Send a fax to "+ x ) ;
}
public void f(B x){
System.out.println("Send an email to"+ x ) ;
}