【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

目录
相关文章
|
29天前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
25 2
|
21天前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
23天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
25天前
|
并行计算 Java 编译器
深入理解Java中的Lambda表达式
在Java 8中引入的Lambda表达式,不仅简化了代码编写,还提升了代码可读性。本文将带你探索Lambda表达式背后的逻辑与原理,通过实例展示如何高效利用这一特性优化你的程序。
|
29天前
|
搜索推荐 Java API
探索Java中的Lambda表达式
本文将深入探讨Java 8引入的Lambda表达式,这一特性极大地简化了代码编写,提高了程序的可读性。通过实例分析,我们将了解Lambda表达式的基本概念、使用场景以及如何优雅地重构传统代码。文章不仅适合初学者,也能帮助有经验的开发者加深对Lambda表达式的理解。
|
1月前
|
Java
探索Java中的Lambda表达式
【10月更文挑战第37天】本文将带你深入理解Java的Lambda表达式,从基础语法到高级特性,通过实例讲解其在函数式编程中的应用。我们还将探讨Lambda表达式如何简化代码、提高开发效率,并讨论其在实际项目中的应用。
|
1月前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
20天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
22天前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
24 0
|
1月前
|
Java 开发者
探索Java中的Lambda表达式
【10月更文挑战第43天】本文将深入浅出地介绍Java中的Lambda表达式,通过实际代码示例,带领读者理解其背后的原理及应用场景。Lambda表达式不仅简化了代码,还提高了开发效率,是Java开发者必备的技能之一。
下一篇
DataWorks