当前位置: 首页 > 面试题库 >

Java中的动态方法调度

卢子民
2023-03-14
问题内容
class A{
int a=10;   
public void show(){ 
    System.out.println("Show A: "+a);
    }
}

class B extends A{
public int b=20;    
public void show(){
    System.out.println("Show B: "+b);
    }
}



public class DynamicMethodDispatch {

    public static void main(String[] args) {

    A aObj = new A();       
    aObj.show();    //output - 10

    B bObj = new B();
    bObj.show();   //output - 20

    aObj = bObj;   //assigning the B obj to A..         
    aObj.show();  //output - 20

    aObj = new B();
    aObj.show();  //output - 20
             System.out.println(bObj.b);  //output - 20 
    //System.out.println(aObj.b); //It is giving error



     }
}

在上面的程序中,我尝试调用 aObj.b时 遇到错误。
1.为什么我无法通过aObj访问该变量,尽管它引用的是B类?
2.为什么我可以使用show()方法?


问题答案:

你有区分 静态类型aObj运行时类型aObj

代码

A aObj = new B();

产生aObj具有静态类型A和运行时类型的变量B

在决定允许或不允许的内容时,编译器也只会考虑 静态类型

对您的问题:

1.为什么我无法通过aObj访问该变量,尽管它引用的是B类?

因为有(一般)没有办法让编译器 知道
aObj会是指一个B对象在运行时,只知道它会是指某种形式的A对象。由于.b并非在所有A对象上都可用,因此编译器会认为
“安全胜于遗憾” 并不允许这样做。

2.为什么我可以使用show()方法?

由于这种方法 在所有可用的A对象(如果它没有在子类中声明,它仍然继承自A)。



 类似资料:
  • 问题内容: 请具有PHP经验的人提供以下帮助。在我的代码中的某个地方,我调用了一个非实例化类中的公共静态方法: 但是,我希望有许多这样的类,并根据用户的语言即时确定正确的类名称。换句话说,我有: …,我需要做类似的事情: 我知道我可以将语言作为参数传递给函数,并在一个通用类中处理它,但是由于种种原因,我希望使用其他解决方案。 有人吗?谢谢。 问题答案: 使用call_user_func函数: ht

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是

  • 本文向大家介绍java动态方法调度实例分析,包括了java动态方法调度实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java动态方法调度。分享给大家供大家参考,具体如下: 动态方法调度: 1. 访问一个引用型的变量的非静态方法,运行时与实际引用的对象的方法绑定。 2. 访问一个引用型的变量的静态方法,运行时与声明的类的方法绑定。 3. 访问一个引用型的变量的成员变量(包括静态变量

  • 问题内容: 有没有一种方法可以在PHP的同一类中动态调用方法?我的语法不正确,但是我正在寻找类似的方法: 问题答案: 有多种方法可以做到这一点: 您甚至可以使用反射API http://php.net/manual/en/class.reflection.php

  • 我是一个初学者,我正在尝试用动态编程方法编写一个旅行推销员问题。 这是我的计算函数的代码: 代码没有给我正确的答案,我试图找出错误发生在哪里。我想我的错误发生在我添加:< code>distCur = compute(newSet,unvisitedSet[I])dist MTX[unvisitedSet[I]][dest]的时候;所以我一直在摆弄这一部分,在返回< code>distMin之前,

  • 我试图理解在另一个类中完成一个过程后,如何在我的活动中调用一个方法? 请看我的插图例子。在MyActivity中,我想在MyClass中调用一个名为DoSomething的当doSomething完成后,我希望MyClass(通知?、接口?、委托?、可观察?、插入“我不知道这里”)我完成的方法回到活动状态。 我看过接口。但我不明白重点。(您基本上promise实现一个方法?但是...为什么?您可以