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

简介: Java中的变量和表达式计算问题

文章目录

一、变量

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

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

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

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

数据类型 关键字 内存占用 包装类
字节型 byte 1字节 Byte
短整型 short 2字节 Short
整形 int 4字节 Integer
长整型 long 8字节 Long
单精度浮点型 float 4字节 Float
双精度浮点型 double 8字节 Double
布尔型 boolean 没有明确规定 Boolean
字符型 char 2字节 Character

2.注意

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

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

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

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

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

1.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);
//……
//都是可以计算出来的

2.png


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

3.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<shot<int<long
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也是这样

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表示的数据范围大,需要强转,小数点之后全部丢弃
注意

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

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

2.类型提升

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

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

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

4.png

5.png

目录
相关文章
|
2天前
|
存储 Java
JAVA中的变量:深入解析与实例
JAVA中的变量:深入解析与实例
9 3
|
2天前
|
存储 安全 Java
Java中的变量与数据类型——基本数据类型与引用数据类型深入剖析
Java中的变量与数据类型——基本数据类型与引用数据类型深入剖析
6 1
|
2天前
|
Java 数据处理
Java的运算符与表达式详解
Java的运算符与表达式详解
7 1
|
2天前
|
Java API
Java的Lambda表达式与函数式接口的技术性文章
Java的Lambda表达式与函数式接口的技术性文章
5 0
|
2天前
|
Java API
Java 8新特性之Lambda表达式和Stream API
【5月更文挑战第31天】本文将详细介绍Java 8中的两个重要特性:Lambda表达式和Stream API。通过对比传统编程方式,我们将探讨这两个特性如何简化代码、提高可读性和性能。文章还将通过实例演示如何使用Lambda表达式和Stream API进行集合操作、过滤和转换等任务。
|
3天前
|
Java 开发者
Java的三元表达式用法
Java的三元表达式用法
|
3天前
|
Java 编译器
Java 8新特性之Lambda表达式与函数式接口
【5月更文挑战第30天】本文将介绍Java 8中的一个重要新特性——Lambda表达式,以及与之密切相关的函数式接口。我们将通过实例分析Lambda表达式的语法、使用方法和优势,同时探讨函数式接口的定义和应用。通过本文的学习,你将能够更好地理解和运用Java 8的这一新特性,提高编程效率和代码可读性。
|
3天前
|
Java 测试技术 编译器
Java的表达式合法性判断
Java的表达式合法性判断
|
3天前
|
Java
Java的变量的作用域
Java的变量的作用域
|
3天前
|
存储 Java
Java的变量
Java的变量