(一)泛型-Java的多态-Java向下转化和向上转化

本文深入探讨Java中的多态概念,包括特殊多态、参数化多态及子类型多态等不同形式。重点介绍子类型多态,解释其实现机制、必要条件及应用场景,并通过实例演示向上转化与向下转化的过程。

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

起先向单刀直入的解决 Java 泛型的相关概念和应用,发现有一些概念不是很理解,于是发现是被卡在“协变和逆变”的概念上了,接着看,终于发现根源是在 Java 的多态。

Java 的多态
Java 的多态分为三种情况
  • 特殊多态(Ad hoc polymorphism),此类下又包含函数重载(function overloading)以及类型转换多态(coercion polymorphism)
  • 参数化多态(Parameteric polymorphism),对应到Java里即泛型。
  • 子类型多态(Subtyping polymorphism),子类型多态,即通过类型继承关系获得的多态。

    对于第三种情况有三个必要条件:

    • 要有继承
    • 要有重写
    • 父类引用指向子类对象,这里涉及到向上转化,比如 Number n=new Integer(1);

    依旧是针对第三种情况:

    • 子类只能覆盖重写父类的非静态成员方法,常量(不管是否是静态的)、静态成员方法都是不可被覆盖的,而且,这种方式下,子类特有的方法不可以被直接访问。
Java 的向下转化和向上转化

我们以简单的代码来说明。
背景内容:子类 extends 父类,子类覆盖重写父类的普通成员方法,子类有一个自己特有的方法。
然后,父类 f=new 子类();
这个时候,f 是可以运行子类中的方法的,但是不能调用子类自己特有的方法,即虽然我们实例化的是子类,但是所能
调用的方法被局限在了父类的成员方法中,这个过程就是向上转化,Java 的多态是基于这一过程的。至于向下转化,如果通过声明父类而以子类实例化得到了对象a,把对象a强制类型转化为子类型,并赋值给一个新声明的子类型,这样也是可以的,而且子类型中自己特有的方法也可以调用了,类似于把父类对象转化为了子类型的对象,即向下转化。

再一个,向下转化并不体现多态,这只是一个强制转化的过程,而且,只有父类实例化对象是子类型时,才可能成功,换而言之,如果一个父类实例化对象是父类本身,其就不可以再被强制转化为子类对象了。

我们以简单的代码来说明,
背景内容:子类 extends 父类,子类覆盖重写父类的普通成员方法,子类有一个自己特有的方法。
然后,父类 f=new 子类();
这个时候,f 是可以运行子类中的方法的,但是不能调用子类自己特有的方法,即虽然我们实例化的是子类,但是所能
调用的方法被局限在了父类的成员方法中,这个过程就是向上转化,Java 的多态是基于这一过程的。至于向下转化,如果通过声明父类而以子类实例化得到了对象a,把对象a强制类型转化为子类型,并赋值给一个新声明的子类型,这样也是可以的,而且子类型中自己特有的方法也可以调用了,类似于把父类对象转化为了子类型的对象,即向下转化。

再一个,向下转化并不体现多态,这只是一个强制转化的过程,而且,只有父类实例化对象是子类型时,才可能成功,换而言之,如果一个父类实例化对象是父类本身,其就不可以再被强制转化为子类对象了。

class father{  
    public void m1(){  
        System.out.println("father.m1");  
    }  
}  
class son extends father{  
    @Override  
    public void m1(){  
        System.out.println("son.m1");  
    }  

    public void m2(){  
        System.out.println("son.m2");  
    }  
}  
public class JavaTest {  
    public static void main(String[] args) {  
        father f=new son();//向上转化  
        f.m1();//打印结果为 son.m1  

        son s=(son) f;//向下转化-强制转化的一种  
        s.m2();//打印结果为 son.m2   

    }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值