当前位置:

首页 > 编程开发 > Java类型自动转换机制的示例及其分析

Java类型自动转换机制的示例及其分析

类型自动转换机制解析概述自动类型转换也叫隐式类型转换表达式的数据类型自动提升所有的byte型、short型和char的值将被提升到int型。如果一个操作数是long型,计算结果就是long型;如果一个操作数是float型,计算结果就是float型;如果一个操作数是double型,计算结果就是double型。数据类型只会自动提升,不能自动降低int值可以赋值给long、float、double型变量,不能赋值给byte、short、char型变量对于函数的传参也是一样当然,在有函数重载的情况下,java编译

本文目录

    类型自动转换机制解析

    概述

    • 自动类型转换也叫隐式类型转换

    • 表达式的数据类型自动提升

    所有的byte型、short型和char的值将被提升到int型。

    如果一个操作数是long型,计算结果就是long型;

    如果一个操作数是float型,计算结果就是float型;

    如果一个操作数是double型,计算结果就是double型。

    数据类型只会自动提升,不能自动降低

    int值可以赋值给long、float、double型变量,不能赋值给byte、short、char型变量

    Java类型自动转换机制的示例及其分析

    对于函数的传参也是一样

    Java类型自动转换机制的示例及其分析

    当然,在有函数重载的情况下,java编译器会自动选择最匹配的函数进行调用

    Java类型自动转换机制的示例及其分析

    Java中整数默认的数据类型是int类型

    所有长度低于int的类型(byte、short、char)在运算之后结果将会被提升为int型

    Java类型自动转换机制的示例及其分析

    当然还有以下的这种情况,这种情况是因为我们在进行赋值运算的时候,java编译器可以明确知道运算的结果是否超过byte或short的取值范围,所以 byte a = 1 + 1; 并没有报错。而上面 byte c = a + b; 编译出错的原因是因为a和b均为一个变量,相加的结果是否会超过byte的取值范围编译器并不知道,所以编译器将结果提升为int型了。

    Java类型自动转换机制的示例及其分析

    小结一下:

    • 当编译器明确知道整数的运算结果没有到达int的表示范围时,byte、short或char类型的运算结果不会被自动提升为int类型

    • 当编译器明确知道或不清楚整数的运算结果是否到达int的表示范围时,编译器将会自动将运算的结果转换成int,即使原来是byte、short或char类型。

    自动类型转换 & 强制类型转换

    什么时候会发生类型转换

    答: 赋值 | 运算时 ,两边数据类型不一致时就会发生类型转换

    如下:

    public class TypeTest {
        public static void main(String[] args){
           	// 运算时发生的隐式类型转换,两整数相除得到的还是一个整数
            byte a  = 3;
            byte b = 4;
            int num  =  a + b;
            System.out.println(num); // 7
            // 赋值时发生的隐式类型转换
            int ch = '0';
            System.out.println(ch); // 48
            // 运算时发生的强制类型转换
            byte a1 = 12;
            byte a2 = 12;
            byte num1 = (byte)(a1  + a2);
            System.out.println(num1); // 24
            // 赋值时发生的强制类型转换
            short b3 = 1234;
            byte a3 = (byte) b3;
            System.out.println(a3); // -46
        }
    }

    运行截图:

    Java类型自动转换机制的示例及其分析

    类型转换分类

    • 自动类型转换

    • 强制类型转换

    自动类型转换(隐式类型转换)

    规则:从小到大 ,低字节向高字节自动提升

    顺序:

    byte(1字节) – > short(2字节)-- > int(4字节) – > long(8字节) --> float(4字节) – > double(8字节)

    char (2字节)-- > int(4字节) – > long(8字节) --> float(4字节) – > double(8字节)

    画图分析:

    Java类型自动转换机制的示例及其分析

    代码展示:

    public class TypeDemo {
        public static void main(String[] agrs){
            // byte -- > short
            byte b1 = 127;
            short s1 = b1;
            System.out.println(s1); // 127
            // short -- > int 
            short  s2 = 30000;
            int i = s2;
            System.out.println(i); // 30000
            // int  -- > long
            int num = 2100000000;
            long lg = num;
            System.out.println(num); // 2100000000
            // long -- > float 
            long lg1 = 200000000000000L;
     	    float f1 = lg1;
            System.out.println(f1);// 2.00000001E14
            // float -- > double 
            float f2 = 3.14f;
            double d1 = f2;
     	    System.out.println(d1); // 3.140000104904175
            // char -- > int
    	    char ch = 'a';
            int i1 = ch ;
            System.out.println(i1); // 97
            // char -- > long
            char ch2 = 'b';
            long lg2 = ch2;
            System.out.println(lg2); // 98
            // char  -- >  double
            char ch3 = 'c';
            double dou = ch3;
            System.out.println(dou); // 99.0
            // char -- > float
            char ch4 = 'd';
            float  f3 = ch4;
            System.out.println(f3); // 100.0
        }
    }

    运行截图:

    Java类型自动转换机制的示例及其分析

    注意:

    byte、short不能和char进行相互转换

    代码展示:

    public class TypeDemo2 {
        public static void main(String[] agrs){
     	    // byte -- > char
            byte bt = 127;
            char ch = bt;
            System.out.println(ch);
            // short -- > char
            short sh = 12;
            char ch2 = sh;
            System.out.println(ch2);
        }
    }

    编译错误截图:

    Java类型自动转换机制的示例及其分析

    float虽然是4个字节,但是float比long表示的数据范围更大。说明数据范围的大小和字节的大小不一定相关

    代码展示:

    public class TypeDemo3 {
        public static void main(String[] agrs){
            long lg = 20000000000000L;
            float f1 = lg;
            System.out.println(f1); // 1.99999997E13
        }
    }

    运行截图:

    Java类型自动转换机制的示例及其分析

    boolean类型不能参与类型转换

    代码展示:

    public class TypeDemo4 {
        public static void main(String[] agrs) {
            boolean flag = 12;
            int flag1 = flag;
            System.out.println(flag1);
        }
    }

    编译错误截图:

    Java类型自动转换机制的示例及其分析

    强制类型转换(显式类型转换)

    规则:从大到小,高字节向低字节手动强制转换

    顺序:

    double(8字节) – > float(4字节) – > long(8字节) – > int(4字节) – > short (2字节)-- > byte(1字节)

    double(8字节) – > float(4字节) – > long(8字节) – > int(4字节) – > char(2字节)

    画图分析:

    Java类型自动转换机制的示例及其分析

    (掌握)格式:目标数据类型 变量名 = (目标数据类型) 变量 | 常量;

    代码展示:

    public class TypeDemo5 {
        public static void main(String[] agrs){
            // float -- > long
            // final float  PI = 3.14f;
            // long num = (long) PI; // 3
            // float little =  3.14f;
            // long num = (long)little; // 3
     	    long num = (long)3.14f;      
            System.out.println(num);// 3 
            // double -- > float 
            // double dou = 3.14;
            // float little1 = (float)dou; // 3.14
            //  float little1 = (float) 3.14d;  // 3.14
            final double  dou = 3.14;
            float little1 = (float)dou;
            System.out.println(little1); // 3.14
            // long -- > int 
            // long  num1 = 2000000000000L;
            // int   num2 = (int)num1;  // -1454759936
            // int num2 = (int)2000000000000L; // -1454759936
           	final  long num1 = 2000000000000L;
            int num2 = (int)num1;
            System.out.println(num2);  // -1454759936
            // int --> short
            // int  num3  = 12;
            // short num4 = (short)num3; // 12
            // short num4 = (short)40000; // -25536
            final int num3 = 60;
            short num4 = (short)num3;
            System.out.println(num4); // 60
            // short -- > byte
            final short sh = 12345;
            byte bt = (byte)sh;
            System.out.println(bt); // 57
            short sh2 = 78;
    	    bt = (byte) sh2;
            System.out.println(bt); // 78
        }
    }

    运行截图:

    Java类型自动转换机制的示例及其分析

    注意:

    强制类型转换有数据丢失,一般不建议使用

    代码展示:

    public  class TypeDemo6 {
       public static void main(String[] agrs) {
           short a = 1245;
           byte b = (byte)a;
           System.out.println(b);
       } 
    }

    运行截图:

    Java类型自动转换机制的示例及其分析

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。