`

动态类型判定,运行时多态问题

阅读更多
class A
{
   public void func1()
   {
      System.out.println("A func1 is calling");
   }
   public void func2()
   {
      func1();
   }
}
class B extends A
{
   public void func1()
   {
      System.out.println("B fun1 is calling");
   }
}
class C
{
   public static void main(String [] args)
   {
      B b=new B();
      A a=b;
      callA(a);
      callA(new B());
   }
   public static void callA(A a)
   {
      a.func1();
      a.func2();
   }
}


运行结果:

D:\>javac C.java

D:\>java C
B fun1 is calling
B fun1 is calling
B fun1 is calling
B fun1 is calling

简单来说,就是RTTI,动态类型判定,也就是

B b=new B();
A a=new B();

只要等号右边类型是什么类型,而且已经覆盖父类的方法,那么调用该方法时,会自动知道相应的B中的覆盖方法。这是一定的,运行时多态。

==================================================

只对方法进行动态判定,属性的取值看,等号左边,也就是编译时类型。

将A和B添加一个属性,在索取值,看结果:

class A
{
   public String name = "A CLASS";
   public void func1()
   {
      System.out.println("A func1 is calling");
   }
   public void func2()
   {
      func1();
   }
}
class B extends A
{
   public String name = "B CLASS";
   public void func1()
   {
      System.out.println("B fun1 is calling");
   }
}
public class C
{
   public static void main(String [] args)
   {
      B b=new B();
      A a=b;
      callA(a);
      callA(new B());
     
     
      System.out.println(a.name);
      System.out.println(b.name);
      System.out.println(new B().name);
     

   }
   public static void callA(A a)
   {
      a.func1();
      a.func2();
   }
}

运行结果:

D:\>javac C.java

D:\>java C
B fun1 is calling
B fun1 is calling
B fun1 is calling
B fun1 is calling
A CLASS
B CLASS
B CLASS


坏男孩 2007-01-05 09:53 发表评论
分享到:
评论

相关推荐

    C++:基于多态的职工管理系统

    2. **错误提示与异常处理**:在清除文件或执行其他操作时,如果用户输入错误,系统应提供清晰的错误提示,帮助用户理解问题所在。在C++中,可以使用try-catch块来捕获可能出现的异常,比如文件不存在、格式错误等。...

    大公司的软件笔试试题供参考

    每个含有虚函数的类对象在运行时(即构造函数执行时)都会有一个指向虚函数表的指针,使得通过基类指针调用虚函数时能正确调用到对应的派生类实现。 2. **文件逆序存储**:这是一个常见的文件操作问题,可以通过...

    java基础课程重点笔记.rar

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则...

    单机版五子棋chess 源代码代码

    描述提到"单击版五子棋,Java 源代码,运行时,多注意细节,因为每个人用的JDK不一样",这提醒我们,虽然项目使用Java编写,但在运行时可能会因不同用户使用的Java Development Kit (JDK)版本差异而出现兼容性问题。...

    Java经典面试题

    23. Java实现多态的机制是通过接口或者类的继承实现,在运行时根据对象的实际类型决定调用哪个方法。 24. abstract class和interface是Java中定义抽象类和接口的关键字,它们都用于声明不能实例化的引用类型,但有...

    软件复习资料.doc

    《软件复习资料》 软件危机是指在软件开发和维护中遭遇的一系列严重问题,这些问题源自软件本身的特性,以及不正确的开发和...面向对象方法学则通过对象来构建软件,体现问题域的本质,具有封装、继承和多态等特性。

    core java终结版

    - **变量赋值**需注意类型兼容性,例如,从范围小的类型向范围大的类型赋值时,无需显式转换;反之则可能需要类型转换。 ### 三、Java的语法与程序结构 #### 变量 - **局部变量**:在方法、构造函数或代码块中...

    2018华南理工大学电信学院软件工程考试题.pdf

    - 不同类型的维护(如纠错性维护、适应性维护、完善性维护等)所需的时间不同,其中某些类型的维护可能耗时较少。 #### 简答题知识点概述 1. **软件开发人员组织形式**: - 常见的组织形式包括:职能型团队、...

    MyBatis-3.0.3-User-Guide.pdf

    - **discriminator:** 判定器配置,用于处理多态或多条件查询。 - **缓存(cache):** - **Using a Custom Cache:** 自定义缓存实现。 - **cache-ref:** 引用外部缓存配置。 #### 七、动态SQL - **if:** 条件...

    java 五子棋小游戏

    数据类型的准确选用是确保程序正常运行的关键,同时,面向对象编程中的继承和多态特性也是提高代码复用性和程序结构清晰度的重要手段。 **课程设计论文**是项目实施的另一重要部分,它包括以下内容: - **目录**:...

    捕鱼达人.zip

    同时,开发者可能使用日志记录工具(如Log4j)跟踪程序运行过程,便于定位和解决问题。 总的来说,“捕鱼达人.zip”项目展示了JavaSE和Swing在创建互动游戏方面的应用,涵盖了图形界面设计、用户交互、多线程编程、...

    python+AI扑克玩家.zip

    - 继承与多态:可能设计出一个基础的卡片类,然后让扑克牌继承自这个类,利用多态实现不同类型的扑克游戏规则。 3. **人工智能**: - 算法基础:可能使用简单的决策树、随机森林或其他机器学习算法,让AI玩家根据...

    软件工程试题及答案15.doc

    6. **软件维护类型**:适应性维护是为了适应软件运行环境变化而进行的修改,纠错性维护是对软件错误的修复,改善性维护是为了提升软件性能,预防性维护则是为了防止未来可能出现的问题。 二、填空题涉及的知识点: ...

    21点小游戏

    6. **异常处理**:通过try...catch语句,可以捕获和处理程序运行时可能出现的错误,确保程序的稳定运行。 7. **GUI编程**:C#可以使用Windows Forms或WPF(Windows Presentation Foundation)创建图形用户界面。在...

    经典java小程序源代码合集

    在IT行业中,Java是一种广泛应用的编程语言,以其“一次编写,到处运行”的特性深受开发者喜爱。这个名为“经典java小程序源代码合集”的压缩包文件包含了一组丰富的Java程序示例,总计164个,涵盖了多种类型的经典...

    java面试题大全

    `会引发编译错误,因为`s1 + 1`会默认提升为`int`类型,再赋值给`short`类型时需要显式转换。而`short s1 = 1; s1 += 1;`则没有问题,因为在自增操作中,Java会自动处理类型的转换。 #### 7\. char类型存储中文字符...

    AIC的Java课程1-6章

     理解运行时判定引用对象的类型(instanceof),进行强制转型(即引用的显示转型)。 第7章 内部类 2课时  学会定义内部类,能够在外部类中或外部类外实例化内部类;定义静态内部类和实例化。...

    C++编程潜艇大战

    7. **异常处理**:为了确保程序的健壮性,应使用try-catch语句来捕获并处理可能出现的运行时错误。 8. **多线程**:为了实现游戏的实时性,可能需要使用多线程技术,如一个线程处理用户输入,另一个线程更新游戏...

    简易版博饼游戏_Java小游戏

    3. 多态(Polymorphism):允许我们使用一个接口处理不同的对象,比如,不管骰子的类型如何,都可以调用统一的摇骰子方法。 4. 面向接口编程:设计时,我们通常会定义一些接口,如Game接口,规定游戏的运行规则,...

Global site tag (gtag.js) - Google Analytics