写点什么

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

作者:安苒
  • 2022-10-26
    河南
  • 本文字数:2170 字

    阅读完需:约 7 分钟

@[toc]

一、变量

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

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

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

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


2.注意

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

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

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

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

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

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);//……//都是可以计算出来的
复制代码



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


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 编码,并且是两个字节,所以可以放中文

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

3.拓展

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


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

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

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

1.类型转换

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

//1.在变量之间赋值过程中——整形家族//byte<shot<int<longint 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和bytebyte b1 = 100; //在范围内,发生隐式类型转换byte b2 = 257; //失败,257超过了byte的数据范围,有数据丢失//类似的short也是这样
复制代码

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和inta = d; // 报错,类型不兼容 ——这里跟C中不同,这里直接不能通过编译a = (int)d; // double没有int表示的数据范围大,需要强转,小数点之后全部丢弃
复制代码
注意

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

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

2.类型提升

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

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

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



发布于: 刚刚阅读数: 2
用户头像

安苒

关注

还未添加个人签名 2022-10-24 加入

还未添加个人简介

评论

发布
暂无评论
【Java SE】java中变量和表达式计算的相关问题_Java_安苒_InfoQ写作社区