对java强制类型转换的一些理解

对java强制类型转换的一些理解

概述

\qquad 从我这个编程小白来看,java的强制类型转换并不常用。不同于C/C++语言,可以进行int,double等类型之间的强制转换,java是不支持一下格式的:

double a = 3.14;
int b = (int)a;

\qquad 并且,java编程中的很多对象之间并没有什么关系,贸然进行强制类型转换很容易使程序抛出异常并终止;一般情况下,只会在对equals方法进行override时才会用到强制类型转换。较少且固定的使用使我们对这个过程的本质并不了解,我们掌握的只是一些固定的用法。只有在遇到一些不能理解的结果时,才会静下心来寻找问题的根源。

问题的提出

​ 我们来看下面这个例子:

class A{
    public A(){}
    
    void foo(){
        System.out.println("A.bar");
    }
}
class B extends A{
    
    public B(){}
    
    @override
    void foo(){
        System.out.println("B.bar");
    }
}

public class test{
    public static void main(String[] args){
        B b = new B();
        ((A)b).foo();
    }
}

\qquad 开始时我以为打印的结果可能是"A.bar",毕竟已经强制类型转换成了A类型的对象,但实际上打印出来的却是"B.bar".

我就开始思考强势类型转换的机制。而这个无外乎有三种可能:

  • 只是将引用转换为A类型
  • 只是将对象转换为A类型
  • 将引用和对象均转换为A类型

想法的验证

\qquad 从理论上来看,第二,三种猜想不成立。根据Java override机制可知,如果对象转换的话,那么b在调用函数时会根据实际的对象来进行选择。所以,如果后两种猜想成立的话,最后打印出来的应该是"A.bar"。而getClass函数可以获得object的引用类型,调用此函数并打印,得到A。故第一种猜想成立。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值