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

本文通过具体的Java代码示例,详细解释了运行时多态的概念及其工作原理。特别是通过子类重写父类方法来展示如何实现动态类型判定,并区分了方法调用与属性访问在多态中的不同表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值