• 【Java SE】2.java中变量和表达式计算的相关问题


    一、变量

    1.概念、语法格式以及分类

    概念:这些经常改变的内容,在Java程序中,称为变量。

    语法:数据类型 变量名 = 初始值;

    分类:与基本数据类型(如下表所示)相对应

    数据类型关键字内存占用包装类
    字节型byte1字节Byte
    短整型short2字节Short
    整形int4字节Integer
    长整型long8字节Long
    单精度浮点型float4字节Float
    双精度浮点型double8字节Double
    布尔型boolean没有明确规定Boolean
    字符型char2字节Character

    2.注意

    1)不初始化是否报错问题

    作为类成员变量,无论初始化与否都不会出错。

    作为函数代码里的变量,无论什么类型不初始化全部都会报错。

    成员变量会被系统默认初始化,局部变量必须得手写初始化

    注:成员变量是指在类体的变量部分中定义的变量,也称为属性。成员变量声明在类中,方法体之外。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wilL6QWZ-1658801468503)(C:\Users\19271\AppData\Roaming\Typora\typora-user-images\image-20220726091959792.png)]

    2)变量范围与超过范围是不是报错问题

    //1.可以通过包装类直接得到数据类型的最大值最小值
    //2.字面常量赋值超过范围——不能通过编译
    
    // int型变量所能表示的范围 
    System.Out.println(Integer.MIN_VALUE); System.Out.println(Integer.MAX_VALUE);
    // long型变量所能表示的范围:这个数据范围远超过 int 的表示范围. 一般在大型工程场景使用.
    System.Out.println(Long.MIN_VALUE); System.Out.println(Long.MAX_VALUE);
    // short型变量所能表示的范围
    System.Out.println(Short.MIN_VALUE); System.Out.println(Short.MAX_VALUE);
    // byte型变量所能表示的范围: 
    System.Out.println(Byte.MIN_VALUE); System.Out.println(Byte.MAX_VALUE);
    //……
    //都是可以计算出来的
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wVrMx0HQ-1658801468505)(C:\Users\19271\AppData\Roaming\Typora\typora-user-images\image-20220726092642082.png)]

    当我们采用表达式打印超过范围的数时可以通过编译,但其实它会溢出,最后得到一个不符合预期的数值 。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ADdNKxdK-1658801468507)(C:\Users\19271\AppData\Roaming\Typora\typora-user-images\image-20220726093126503.png)]

    3)其他

    1. 为了区分int和long类型,一般建议:long类型变量的初始值之后加L或者l ,同时,为了明显区分数字1和小写l,我们一般写L

    2. double /float类型的内存布局遵守 IEEE 754 标准(和C语言一样), 使用有限的内存空间表示可能无限的小数, 一定会存在一定的精度误差,所以浮点数都是近似值。同时,由于float比double范围小,所以会优先使用double类型

    3. Java 的 boolean 类型和 int 不能相互转换, 不存在 1非0表示 true, 0 表示 false 这样的用法,同时也不存在这样的运算boolean value = true; System.out.println(value + 1);会编译报错。【编译时可以检查出语法错误】

    4. jvm规范中没有说boolean占几个字节,但是在Oracle公司的虚拟机实现中,boolean占1个字节。

    5. 除法分为整数除法和小数除法,这点与C类似。

    6. 单精度后边是写f或者F,当我们定义时不些的时候会发生隐式类型转换。

    7. java中的char采用的是Unicode编码,并且是两个字节,所以可以放中文

      【在使用命令窗口编译时,如果在执行出现不能正确解析汉字的情况,那么这时需要加入一条语句,参考之前写的java程序运行那篇笔记

    3.拓展

    1.Unicode字符集不仅可以表示英文还有希腊文、中文等其他国家的语言,向下兼容ASCII字母集,但其实我们做题只是绝大多数时候用的ASCII里边的,所以没有必要再去专门研究这个字母集。

    2.谈论char的最小最大其实没有太大意义。他们没有符号位【所以共有65535个】,本质上是字符,但是我们经常用的IDEA无法正常解析出来,并且他也没有太大的应用场景。

    二、有关表达式计算中的类型问题【!!!】

    这里的大小是指表示能力。

    1.类型转换

    1)小转大——隐式类型转换

    //1.在变量之间赋值过程中——整形家族
    //byte
    int a = 10; 
    long b = 100L;
    b = a; // 可以通过编译 
    a = b; // 编译失败
    
    //2.在变量之间赋值过程中——浮点家族
    float f = 3.14F;
    double d = 5.12; 
    d = f; // 编译器会将f转换为double,然后进行赋值
    f=d;//虽然不安全,但是可以通过编译,只不过可能会有精度丢失
    
    //3.在打印过程中——主要体系体现在打印精度上
    System.Out.println(1024); // 整型默认情况下是int System.Out.println(3.14); // 浮点型默认情况下是double
    
    //4.特殊的——short和byte
    byte b1 = 100; //在范围内,发生隐式类型转换
    byte b2 = 257; //失败,257超过了byte的数据范围,有数据丢失
    //类似的short也是这样
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2)大转小——强制类型转换

    //1.关于byte的计算
    //同类型相加也会进行转换
    byte a1=100;
    byte a2=50;
    byte ret=(byte)(a1+a2);//计算机计算时的最小操作单位摆在那了——最小是4字节
    
    //超范围的时候
    byte b1 = 100; // 100默认为int,没有超过byte范围,隐式转换
    byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显示转换,否则报错
    
    //2.整形/浮点型,精度大的给小的
    //同家族之间交叉
    int a = 10; 
    long b = 100L;
    b = a; // int-->long,数据范围由小到大,隐式转换
    a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败 float f = 3.14F;
    
    double d = 5.12; 
    d = f; // float-->double,数据范围由小到大,隐式转换
    f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败
    
    //不同类型交错
    //eg.double和int
    a = d; // 报错,类型不兼容 ——这里跟C中不同,这里直接不能通过编译
    a = (int)d; // double没有int表示的数据范围大,需要强转,小数点之后全部丢弃
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    注意

    没有意义,但是可以:比如double&char【打印的都是字符,同时double会把小数丢了】

    对于不相干的类型,存在强制类型转换也不行钉子户,最典型的就是布尔类型和其他任何类型。

    2.类型提升

    运算时,不同但属于同一大类进行计算时小类型会提升至大类型,与C是一样的。

    同时java与C一样,整型算术运算总是至少以缺省【缺省即默认】整型类型的精度来进行的。

    这里我们经常看到的就是,byte运算时的整型提升、int到long的、float到double。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JbyKAs5A-1658801468508)(C:\Users\19271\AppData\Roaming\Typora\typora-user-images\image-20220726095900594.png)]

    在这里插入图片描述

  • 相关阅读:
    2022 CCPC桂林 G. Group Homework
    MVC您正在查找的资源可能被移除
    DoS和DDos攻攻击
    时序数据库基本概念学习
    web网页设计期末课程大作业:美食餐饮文化主题网站设计——美食汇5页HTML+CSS+JavaScript
    springboot入门
    go map fatal errorconcurrent map read and map write
    【SpringBoot】请求处理——常用参数注释及使用
    Python写猜数游戏
    输入输出管理:I/O控制方式
  • 原文地址:https://blog.csdn.net/moteandsunlight/article/details/125989100