java的向上向下转型


       在java中面向对象的三大特性是封装、继承和多态。多态的具体表现在对方法的重写和重载。重载,方法参数不一样;重写,方法参数一样,具体实现不一样。看上去,多态和向上/向下转型没有什么关系,继续往下看。(这里主要还是讲向上/向下转型)

      java中,向上转型是指弗雷对象的引用指向子类对象。而向下转型是基于向上转型再次指向子类的对象。

     1.向上转型

        语法:父类 = new 子类();       如下示例:

public class Father{
   public void say(){
System.out.println("father say");
}
public static void main(String[] args){
    Father son = new Son();//向上转型
    son.say();
}
}


public Son extends Father{
    public void say(){
          System.out.println("son say");
}
}
     最后输出的结果是:son say

     这是因为,父类对象的引用指向的是一个子类,所以最后打印出来的是子类的方法。

    2.向下转型

    语法: 父类  对象1 = new 子类();     子类 对象2 = (子类)对象1;        示例如下:

public class Father{
   public void say(){
System.out.println("father say");
}
public static void main(String[] args){
    Father son = new Son();//先向上转型
    Son son2  = (Son)son;//向下转型
    son2.sayMe();
}
}


public Son extends Father{
    public void say(){
          System.out.println("son say");
}
public void sayMe(){
          System.out.println("son sayMe");
}
}
      如果对象不先进行向上转型,直接将父类强转成子类对象系统就会报错!
Exception in thread "main" java.lang.ClassCastException: Father cannot be cast to Son
	at Father.main(Father.java:6)
      讲了这么多,似乎还是和多态没有扯上半毛钱关系。

      再讲一个虚拟机调用方法的机制。当虚拟机调用一个类方法时,会基于对象引用的类型来选择所调用的方法。相反,当调用一个实例方法时,则是基于对象实际的类型(只能在运行时得知)来选择所调用的方法,这就是动态绑定,也是多态的一种 。(是不是开始多态扯上关系了?)

      动态绑定具体表现在向上转型上,因为只有在运行的时候才知道具体运行的是哪个实例。示例代码和向上转型一样。具体关于动态绑定和静态绑定大家可以看看这篇博客http://blog.youkuaiyun.com/zhangjk1993/article/details/24066085

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值