java类方法覆盖

 public class Dis                                                            
 {
         static class QQ {}
 
         static class _360 {}
 
        static class sqq extends QQ{}
 
         public static class F{
 
                 public void f1(QQ arg)
                 {
                         System.out.println("F QQ");
                 }
 
                 public void f1(_360 arg)
                 {
                         System.out.println("F 360");
                 }
 
                 // public void f1(sqq  arg)
                 // {
                 //      System.out.println("F sqq 360");
                // }
 
         }
 

                 public static class S extends F{
 
                public void f1(QQ arg)
                 {
                        System.out.println("S QQ");
                 }
 
                 public void f1(_360 arg)
                 {
                         System.out.println("S 360");
                 }
                 public void f1(sqq  arg)
                 {
                         System.out.println("s sqq 360");
                 }
 
       }  
 
 
         public static void main(String[] args){
 
                 
                 F son = new S();
 

                 son.f1(new sqq());
 
 
 
         }
 
 }

S是F的子类,sqq是QQ的子类。

在S和F中定义多态方法f1()

F son = new S();
son 的静态类型是F ,动态类型是 S

调用son.f1()的时候,要先在F类中查找对应函数声明,有则通过,调用S中的对应方法。如果没有,则把son.f1()中的参数向上转型,看看能不能在F中找到对应函数声明,能找到,就调用S中参数转型后的f1函数,找不到就编译报错

这段代码F.f1(sqq s)被注释,有F.f1(QQ q)。当son.f1(new sqq())时,因为F没有f1(sqq s),会将sqq向上转为QQ,编译通过,运行时调用S.f1(QQ)即输出"S QQ"

如果把F.f1(QQ)注释掉,编译会报错

感觉静态类型就是编译时用来检查的,动态类型就是运行时实际类型

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值