Java 转换为超类并调用重载方法

本教程将介绍Java 转换为超类并调用重载方法的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

Java 转换为超类并调用重载方法 教程 第1张

问题描述

abstract class A {

 int met(A a) {
  return 0;
 }

 int met(B b) {
  return 1;
 }

 int met(C c) {
  return 2;
 }
}

class B extends A {

 int met(A a) {
  return 3;
 }

 int met(B b) {
  return 4;
 }

 int met(C c) {
  return 5;
 }
}

class C extends B {
 int f() {
  return ((A)this).met((A)this);
 }
}

public class teste {
 public static void main(String args[]) {
  C x = new C();
  System.out.println(x.f());
 }
}

程序将返回 3,而我期待的是 0.为什么方法 f 中的第一个强制转换什么都不做而第二个有效?是不是因为A类和B类中的met方法被重载了,所以使用了静态绑定?

推荐答案

这就是多态的工作方式.看看这个例子:

A a = new C();
a.met(a);

这将按预期调用正确的方法B#met(...).对象的方法表不只是因为您更改了存储 Object 的变量的类型而改变,因为 Object 和它的方法之间的绑定是强于存储类型和相关方法之间的一种.第二种类型有效,因为输入的类型被强制转换为 A,因此该方法将其识别为 A(输入存储的类型比Object 类型).

好了关于Java 转换为超类并调用重载方法的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。