Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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_Types_Extends - Fatal编程技术网

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
引用的对象实际上是a
B
,因此选择了
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 ) ;
}