Java——变量

一、变量介绍

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。

1、变量声明和初始化

变量的声明:

int a;

int 是类型,a 是变量名或者说标识符。

变量初始化:

a = 10;

将 10 赋值给或者说初始化给变量 a。

也可以声明和初始化同时进行:

int a = 10;

2、变量内容的输出

再声明和初始化变量之后,我们还可以使用以下方式输出变量的内容:

public class Hello {
	public static void main(String[] args) {
		int age = 18;
		//创建一个int变量然后初始化
		float height = 1.8f;
		//创建一个float变量然后初始化
		System.out.println(age);
		System.out.println(height);
	}
}

运行结果:

3、变量的内存大小

变量在初始化时的类型不同,系统对其分配的内存大小是不同的。例如 int 类型是 4 字节,double 是8字节。

在同一个作用域中不能有重名的变量。

二、数据类型

Java 的数据类型分为基本数据类型和引用数据类型:

下面将会对基本数据类型进行详细介绍。Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

1、type

特点详情
类型名称byte
位数8位
符号性有符号
存储形式二进制补码
最小值-128 (-2^7)
最大值127 (2^7-1)
默认值0

从它的名字上面也可以看出来,它的大小是一个字节,对于比较小的整数可以用它来存储,以节省空间。

byte a = 10;
byte b = -20;

2、short

特点详情
类型名称short
位数16位
符号性有符号
存储形式二进制补码
最小值-32768 (-2^15)
最大值32767 (2^15-1)
默认值0

short 又叫短整型,占用 2 字节,在数值较小时可以使用它来存储,以节省空间。

short a = 1000;
short b = -2000;

3、int

特点详情
类型名称int
位数32位
符号性有符号
表示形式二进制补码
最小值-2,147,483,648 (-2^31)
最大值2,147,483,647 (2^31-1)
默认值0

int 就是默认整型类型,占用 4 字节。

int a = 60000;
int b = -70000;

4、long

特点详情
类型名称long
位数64位
符号性有符号
表示形式二进制补码
最小值-9,223,372,036,854,775,808 (-2^63)
最大值9,223,372,036,854,775,807 (2^63-1)
默认值0L

long 又叫长整型,对于比较大的数据可以用它来存储,占用 8 字节。由于整形常量默认是 int 类型的,如果要初始化 long 类型的数据,要在整形常量后加上 L 以表示它是长整型,这里的 L 大写小写都行,但是一般大写 L 防止与数字 1 混淆。

long a = 10000000000L;
long b = -20000000000L;

5、float

特点详情
类型名称float
位数32位
符号性有符号
表示形式IEEE 754
默认值0.0f

float 又叫单精度浮点数,用于精度比较小的情况。由于浮点数常量的默认类型是 double 类型, 所以在初始化时要在常量后加上 f 。

float a = 2.34f;
float b = -3.14f;

6、double

特点详情
类型名称double
位数64位
符号性有符号
表示形式IEEE 754
默认值0.0d

double 又叫双精度浮点数,精度比 float 高,但实际上有些情况还是不能胜任。同时可以在常量值后加上 D 以表示这个数据是 double 类型,但是对于常量浮点数默认就是 double 类型的,所以加不加 D 作为后缀都可以。

double a = 3.1415926;
double b = -2.3453534D;

7、char

特点:

特点详情
类型名称char
位数16位
符号性无符号
存储形式Unicode 字符
最小值\u0000 (0)
最大值\uffff (65535)
默认值\u0000
用途存储单个字符

介绍:

我们可以将一个字符存储到 char 类型的变量中(单个字符赋值使用单引号):

char ch = 'A';

对于 char 类型的数据,实际上存储的是字符对应的 Unicode 码。所以我们可以在初始化时直接赋值给 char 类型变量一个整数:

public class Test {
	public static void main(String[] args) {
		char ch = 65;
		System.out.println(ch);
	}			
}

这样会打印这个整数对应的 Unicode 字符:

当然我们也可以将这个字符类型强制转换为整型(因为 char 类型的本质就是整型),然后以整型形式打印,就可以得到字符对应的 Unicode 码了:

public class Test {
	public static void main(String[] args) {
		char ch = '好';
		System.out.println((int)ch);
	}
}

这样就可以得到字符对应的 Unicode 码值了:

经过查询,我们发现,字符 '好' 对应的 Unicode 码值就是:

这与我们的运行结果是对应的。

与 C 语言的 char 比较:

对于 char 类型,Java 里的字符类型与 C 语言的不同,C 语言的 char 类型只有一个字节,而且只能存储 ASCII 字符集,不能存储 Unicode 字符的超出 ASCII 的部分。所以对于以下操作 C 语言的 char 类型是做不到的:

public class Test {
	public static void main(String[] args) {
		char ch = '好';
		System.out.println(ch);
	}
}

运行结果:

Java 的 char 类型是一个单一的 16 位 Unicode 字符,使用 UTF-16 编码。(对于这里有一个需要声明的点,Unicode 是一个字符集,而UTF-16是它的一个实现。其他的实现还有UTF-8和UTF-32)它的取值范围是从 \u0000\uffff(即从 0 到 65535),这允许它能够表示世界上绝大多数字符的标准集(包括 ASCII、拉丁字母、汉字等)。因此,在 Java 中,我们可以使用 char 类型来存储像 '好' 这样的 Unicode 字符。

另一方面,C 语言的标准 char 类型通常是 8 位的,并且主要用来表示 ASCII 字符集,它的取值范围是从 0 到 255 或 -128 到 127(取决于编译器是否将 char 视为有符号类型)。由于它的大小限制,C 语言的标准 char 类型不能直接表示 Unicode 字符集中的超出 ASCII 字符集的字符。如果在 C 中想要处理 Unicode 字符,通常会使用其他数据类型,如 wchar_t,这是一个宽字符类型,其大小和编码方式可以变化,依赖于平台和编译器设置,可能是 16 位或 32 位。

char 类型的存储:

当我们在使用以下语句对一个字符型变量进行初始化时,这个字符常量值是怎么存储的呢:

char ch = 'a';

对于字符型变量,内存中存储的其实是它对应的 Unicode 码值的二进制。

编码方式:

  1. ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):ASCII 是最早的字符编码标准之一,使用一个字节(8位)来表示一个字符。原始的 ASCII 编码只使用了 7 位,共计 128 个字符。它包含了英文字母(大小写)、数字、标点符号和一些控制字符。扩展 ASCII 码:后来的很多国家扩展 ASCII 则使用了全部 8 位,增加了更多字符,这些国家扩展的 ASCII 码的前128个字符是一样的,但是后面的 128~255 的编码各不相同(因为每个国家的字母不一定一样,所以后面的编码实现不同),导致使用不同的编码实现方式打开不同的文件会导致乱码。

  2. UTF-8(Unicode Transformation Format - 8-bit):UTF-8 是一种变长编码,是一种 Unicode 字符集的编码方式实现,可以在表示 Unicode 字符时使用 1 到 4 个字节。UTF-8 兼容 ASCII 编码,即 ASCII 字符使用一个字节表示,而非 ASCII 字符需要多个字节(例如汉字使用3字节)。UTF-8 是互联网上最常用的字符编码方式,因为它兼容 ASCII,并可以表示世界上几乎所有的字符。

  3. GBK:GBK 是对 GB2312 编码的扩展,主要用于表示中文字符。GBK 使用两个字节表示一个字符,其中包含了 GB2312 中的字符及更多的汉字和符号。GBK 兼容 GB2312,所以 GB2312 中的字符可以直接在 GBK 中使用。

  4. GB2312:GB2312 是中国国家标准,主要用于表示简体中文字符。它使用两个字节表示一个字符,其中包含了大部分常用的汉字和一些符号。GB2312 的字符集较为有限,不包含繁体中文和其他语言字符。

  5. Big5 码:Big5 码主要用于表示繁体中文字符。它使用两个字节表示一个字符,其中包含了繁体中文字符及一些符号。Big5 码与 GB2312 和 GBK 不兼容,因为它们使用了不同的字符集。

8、boolean

特点详情
类型名称boolean
位数不明确,依赖于具体实现
符号性
表示形式true 或 false
默认值false

boolean 又叫布尔类型,一般用于逻辑判断。

boolean isRight = true;

补充

数据类型的内存大小:

由于 Java 的代码是在 JVM 中运行的,所以对于不同的平台这些数据类型的内存大小都是一样的。这一点与 C 语言不同。这种固定大小的设计确保了 Java 程序在不同平台上的一致性。相比之下,C 语言的基本数据类型大小是依赖于编译器和目标平台的。例如,int 在某些系统上可能是 16 位,而在其他系统上可能是 32 位。这种灵活性使得 C 语言非常接近底层,可以针对特定硬件进行优化,但同时也要求程序员在编写跨平台代码时更加小心,以确保代码在不同环境下的正确性。

数据不兼容:

当我们使用不兼容的数据来赋值时:

public class Test {
	public static void main(String[] args) {
		int a = 100L;
	}
}

会出现以下报错:

这里应当使用 100L 对应的数据类型,也就是 long 类型。

Java 中整型变量一般声明为 int 类型,除非是 int 无法表示的大数才使用 long 。

当我们使用不同精度的浮点数进行赋值时:

public class Test {
	public static void main(String[] args) {
		float a = 1.0;
	}
}

我们知道浮点数常量的默认类型是 double ,当我们将浮点数不加 f 后缀赋值给 float 类型,就相当于将 double 类型数据赋值给 float 类型的变量,这样就会导致精度损失,所以会出现以下报错:

浮点数赋值补充:

再对于浮点数赋值时,如果我们要赋值的值整数位为零,可以不加整数位,直接一个小数点后接小数位,就像这样:

public class Test {
	public static void main(String[] args) {
		double num = .123;
		//这里赋值给num的值为0.123
		System.out.println(num);
	}
}

运行结果:

我们还可以使用科学计数法形式的数据对浮点数变量进行赋值:

public class Test {
	public static void main(String[] args) {
		double num1 = 1.023e2;
		//这里赋值给num1的值为102.3
		double num2 = 2.333E-2;
		//这里赋值给num2的值为0.02333
		System.out.println("num1 = " + num1);
		System.out.println("num2 = " + num2);
	}			
}

运行结果:

1.023e2 就相当于 1.023 * 10 ^ 2 。这里的 e 是 exponent 的缩写,是幂的意思,这里的 e 大写小写都可以,指数可以是正负整数。

浮点数精度:

对于一个浮点数一般使用 double 类型存储,因为 double 的精度较高。可以通过下面这个例子看出来:

public class Test {
	public static void main(String[] args) {
		double num1 = 2.123456789;
		//双精度浮点数一般能保留到小数点后15~16位
		float num2 = 2.123456789f;
		//单精度浮点数一般能保留到小数点后6~7位
		System.out.println("双精度 num1 = " + num1);
		System.out.println("单精度 num2 = " + num2);
	}			
}

运行结果:

双精度浮点数一般能保留到小数点后15~16位,单精度浮点数一般能保留到小数点后6~7位。

一个小细节:

public class Test {
	public static void main(String[] args) {
		double num1 = 1.1;
		double num2 = 3.3 / 3;
		System.out.println("1.1 num1 = " + num1);
		System.out.println("3.3 / 3 num2 = " + num2);
	}			
}

虽然这里的 3.3 / 3 我们都知道是 1.1 ,但是这里输出的却不是 1.1 ,而是一个极其接近 1.1 的数。

浮点数在计算机中通常使用 IEEE 754 标准来表示,这种表示方法在存储时不能精确表示所有小数。特别是那些在十进制中有限的小数,在二进制浮点表示中可能是无限的。实际上这里的 3.3 转换为二进制的可能是无限循环小数,由于 double 精度是有限的,无法存储无限循环的小数,所以这里得到的结果是一个很接近 1.1 的小数,可以看到这里的 1.0999999999999999 小数位刚好是 16 位,确实是 double 类型精度的极限。

浮点数详细介绍补充说明:

Java 中的浮点数类型(floatdouble)遵循 IEEE 754 标准,这与 C 语言中的浮点数类型(floatdouble)相同。IEEE 754 是一个定义浮点数运算的国际标准,它规定了浮点数的表示、运算和舍入规则。

我之前的文章《C语言——数据存储_存储的c语言编程-CSDN博客》中有详细的介绍过的浮点数。

这里的介绍不仅适用于 C 语言,同样适用于 Java 。

三 、加号的使用

1. 数值加法

+ 运算符应用于数值类型(byte、short、int、long、float、double)的操作数时,它执行加法运算。

整数加法:如果两个操作数都是整型(如 byte、short、int、long),结果也是整型。如果操作数类型不同,它们会按照从小到大的顺序(byte -> short -> int -> long)进行类型提升,运算结果的类型是提升后的类型。

int a = 5;
int b = 3;
int sum = a + b; // 结果是 8

浮点数加法:如果至少有一个操作数是浮点型(float、double),则进行浮点数加法。整数和浮点数相加时,整数会被提升为浮点数类型,运算结果类型是最大的那个操作数的类型。

double a = 5.5;
int b = 3;
double sum = a + b; // 结果是 8.5

2. 字符串连接

+ 运算符的操作数中至少有一个是字符串(String 类型)时,Java 会将 + 运算符作为字符串连接操作来执行。此时,它会将非字符串操作数转换为字符串,然后将这些字符串连接在一起。

字符串与字符串连接

String hello = "Hello, ";
String world = "world!";
String greeting = hello + world; // 结果是 "Hello, world!"

字符串与其他类型数据连接:如果其中一个操作数是字符串,另一个是非字符串(如数值、布尔值等),非字符串操作数将转换成字符串,然后进行连接。

String base = "Base score: ";
int score = 100;
String result1 = base + score; // 结果是 "Base score: 100"
String result2 = score + base; // 结果是 "100Base score: "

这种转换不仅适用于基本数据类型,也适用于对象。对于对象,Java 会调用对象的 toString() 方法来获取其字符串表示,然后进行连接。

特殊案例

在一系列加法操作中,如果涉及到字符串连接和数值加法,操作是从左到右依次进行的。因此,如果先遇到字符串,后续的操作数都会被转换为字符串进行连接。如果先进行数值加法,只有在遇到字符串后才开始进行字符串连接。

String result1 = "Sum: " + 5 + 7; // 结果是 "Sum: 57"
String result2 = 5 + 7 + " = Sum"; // 结果是 "12 = Sum"

示例:

public class Test {
	public static void main(String[] args) {
		System.out.println(21 + 34 + "nihao" + 1 + 2 + 3 + 4);
	}
}

运行结果:

可以发现与上面的描述是对应的。

也就是说这里的多个 + 运算,运算顺序是从左到右的,首先是 21 + 34 ,得到 55 ,然后 55 + "nihao" 得到 "55nihao" ,然后 "55nihao" + 1 得到 "55nihao1" ,然后 "55nihao1" + 2 得到 "55nihao12" ,然后 "55nihao12" + 3 得到 "55nihao123" ,然后 "55nihao123" + 4 得到 "55nihao1234" ,所以最终打印的是这样的一个字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/669175.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2021JSP普及组第三题:插入排序

2021JSP普及组第三题 题目: 思路: 题目要求排序后根据操作进行对应操作。 操作一需要显示某位置数据排序后的位置,所以需要定义结构体数组储存原数据的位置和数据本身排序后所得数据要根据原位置输出排序后的位置,所以建立一个新…

字典树,AcWing 5726. 连续子序列

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 5726. 连续子序列 - AcWing题库 二、解题报告 1、思路分析 字典树存储前缀和 考虑边遍历计算前缀和,边查询字典树 查询流程: 记当前前缀和为s 如果当前位k为1,那么s …

Qt6 mathgl数学函数绘图

1. 程序环境 Qt6.5.1, mingw11.2mathgl 8.0.1: https://sourceforge.net/projects/mathgl/,推荐下载mathgl-8.0.LGPL-mingw.win64.7z,Windows环境尝试自己编译mathgl会缺失一些库,补充完整也可以自己编译,路径"D:\mathgl-8.0.LGPL-mingw.win64\bin"添加至系统环境…

关于Golang中自定义包的简单使用-Go Mod

1. go env 查看 GO111MODULE 是否为 on,不是修改成on go env -w GO111MODULEon 2 .自定义包的目录格式 3. test.go 内容 package calc func Add(x, y int) int { // 首字母大写表示公有方法return x y }func Sub(x, y int) int {return x - y } 4.生成calc目…

RedisSearch与Elasticsearch:技术对比与选择指南

码到三十五 : 个人主页 数据时代,全文搜索已经成为许多应用程序中不可或缺的一部分。RedisSearch和Elasticsearch是两个流行的搜索解决方案,它们各自具有独特的特点和优势。本文简单探讨一些RedisSearch和Elasticsearch之间的技术差异。 目录…

AndroidStudio使用高德地图API获取手机定位

一、高德地图API申请 首先去高德注册开发者账号 下面这两个选项,也是我们项目成功的关键 1.1怎么获取SHA1指纹密码 ①使用AS自带的签名文件 你的用户文件下面会有一个.android文件夹,进入文件夹,在这个路径下打开cmd 如果.android下面没有签名文件参考创建文章 …

CSS Canvas鼠标点击特效之天女散花(文本粒子动画)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;padding: 0;wi…

一个班有n个学生,需要把每个学生的简单材料(姓名和学号)输入计算机保存。然后可以通过输入某一学生的姓名查找其有关资料。

当输入一个姓名后&#xff0c;程序就查找该班中有无此学生&#xff0c;如果有&#xff0c;则输出他的姓名和学号&#xff0c;如果查不到&#xff0c;则输出"本班无此人"。 为解此问题&#xff0c;可以分别编写两个函数&#xff0c;函数input_data用来输人n个…

Spring系统学习 - Spring入门

什么是Spring&#xff1f; Spring翻译过来就是春天的意思&#xff0c;字面意思&#xff0c;冠以Spring的意思就是想表示使用这个框架&#xff0c;代表程序员的春天来了&#xff0c;实际上就是让开发更加简单方便&#xff0c;实际上Spring确实做到了。 官网地址&#xff1a;ht…

vmdx 文件如何打开

如果在网上下载到了 vmdx 文件要如何使用呢 首先开启 vmware 新建一个虚拟机 选择高级模式 选择你要给他的配置 在选择磁盘文件的时候,找到这个vmdx 如果要升级的话最好选择【不升级】 然后就可以用了

倪师哲学。不要浪费时间去做无谓的事情

再比如你像我拍这个视频&#xff0c;在我的视频下方啊&#xff0c;评论区啊&#xff0c;经常性的会有一些人去评论&#xff0c;一些那种不痛不痒的事&#xff0c;我给你找几条&#xff0c;你看一下就知道了. 就比如&#xff0c;今天早上&#xff0c;我翻到倪海夏老师的第一篇图…

如何获取SSL证书,消除网站不安全警告

获取SSL证书通常涉及以下几个步骤&#xff1a; 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; 你需要从受信任的SSL证书颁发机构中选择一个&#xff0c;比如DigiCert、GlobalSign、JoySSL等。部分云服务商如阿里云、腾讯云也提供免费或付费的SSL证书服务。 生成证…

命运方舟台服注册 命运方舟台服怎么注册?不会操作看这里

命运方舟台服注册 命运方舟台服怎么注册&#xff1f;不会操作看这里 命运方舟作为今年备受瞩目的一款MMORPG类型游戏&#xff0c;在上线前的预约数量已经一次又一次创下新高。这款游戏的开发商Smile gate真是给玩家们带来了一款让人眼前一亮的作品。游戏创建在虚幻引擎的基础…

为什么要学习数据结构和算法

前言 控制专业转码学习记录&#xff0c;本科没学过这门课&#xff0c;但是要从事软件行业通过相关面试笔试基础还是要打牢固的&#xff0c;所以通过写博客记录一下。 必要性 1.越是厉害的公司&#xff0c;越是注重考察数据结构与算法这类基础知识 2.作为业务开发&#xff0c…

40号渐变灰色背景证件照要求,手机拍照轻松拍干部照片

灰色渐变背景的证件照是一种常见的照片类型&#xff0c;在干部档案、事业单位工作人员信息采集、履历及升迁公示等阶段会用到&#xff0c;按照规范需要使用40号渐变灰色背景。很多朋友不清楚40号灰色是哪种灰色&#xff0c;以及照片的尺寸要求&#xff0c;下面就重点介绍40号渐…

一篇文章讲透数据结构之树

一.树 1.1树的定义 树是一种非线性的数据结构&#xff0c;它是有n个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根在上&#xff0c;叶在下的。 在树中有一个特殊的结点&#xff0c;称为根结点&#xff0c;根结点…

vue3可以快速简单的操作dom元素了

再也不需要用document.getElementById("myElement")的这种方式来对dom元素进行操作了 我们需要使用模板引用——也就是指向模板中一个 DOM 元素的 ref。我们需要通过这个特殊的 ref attribute 来实现模板引用&#xff1a; <script setup> import { ref, onMo…

【linux】docker安装下载器:aria2、gopeed、thunder迅雷

一、aria2 1、下载aria2服务镜像 docker pull p3terx/aria2-pro 2、下载ariang页面服务 docker pull p3terx/ariang 3、启动aria2服务 docker run -d --name aria2 \ --restart unless-stopped \ --log-opt max-size1m \ -e PUID$UID \ -e PGID$GID \ -e UMASK_SET022 \ -…

基于电导增量MPPT控制算法的光伏发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于电导增量MPPT控制算法的光伏发电系统simulink建模与仿真。输出MPPT跟踪后的系统电流&#xff0c;电压以及功率。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MAT…

Facebook的创新实验室:人工智能与新技术探索

Facebook作为全球领先的社交媒体平台之一&#xff0c;一直在不断探索和应用最新的技术来改善用户体验、推动创新和拓展业务边界。其创新实验室更是探索人工智能&#xff08;AI&#xff09;和新技术的前沿&#xff0c;为未来的社交媒体发展开辟了新的可能性。本文将深入探讨Face…