01 Java 数据类型和变量

简介: 数据类型在声明变量或常量时会用到数据类型,在前面已经用到一些数据类型,例如 int、double 和 String 等。Java 语言的数据类型分为:八种基本类型和三种引用类型(数组, class, interface)。

数据类型


在声明变量或常量时会用到数据类型,在前面已经用到一些数据类型,例如 int、double 和 String 等。Java 语言的数据类型分为:八种基本类型和三种引用类型(数组, class, interface)。


image.png


整数类型


  • 整型分为 long、int、short 和 byte 四种类型


  • 默认为int, byte、short、int和 long ,它们之间的区别仅仅是宽度和范围的不同。


  • 默认使用 int 就够了, 除非预期会出现大于该数值的情况使用 long 类型。


  • 若存在 int 转 long 类型的情况, 建议添加后缀 L, 而不是使用易和数字 1 混淆的小写字母 l。


  • Java中整数都是有符号


image.png


short 的范围 2字节 -32,768 到 32,767


int 4字节 -2,147,483,648 到 2,147,483,647


long 8字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807


为方便查看数值类型的最大和最小值, Java 提供了对应了静态成员变量. Integer.MAX_VALUE(2147483647 21亿4748万) 和 Integer.MIN_VALUE(-2147483648)


整数的存储格式


正数和负数


– 将最高位作为符号位:0表示正数,1表示负数


– 有符号格式、无符号格式的区分


采用定长存储


  • 8 位(1字节): 无符号表示 0 ~ 255 也可以表示为00000000~11111111


  • 16 位(2字节):无符号表示 0 ~ 65535


  • 32 位(4字节):无符号表示 0~4294967295 最大值约为 42 亿


编写程序时应根据所处理数据可能的取值范围合理地选择存储位数


负数的二进制表示就是对应的正数的补码表示。负整数为什么要采用这种奇怪的表示形式呢?原因是,只有这种形式,计算机才能实现正确的加减法。


理解了二进制加减法,我们就能理解为什么正数的运算结果可能出现负数了。当计算结果超出表示范围的时候,最高位往往是1,然后就会被看作负数。比如,127+1。计算结果超出了byte的表示范围,会被看作-128。


实型(小数类型 / 浮点型)


存储格式


浮点格式采用 阶码 + 尾码 的方式。


  • 浮点型常量后面加后缀修饰, Float 类型以 F/f 结尾,double 类型以 D/d 结尾。


  • 如果浮点常量不带后缀,则默认为双精度常量


image.png


二进制中为表示小数,也采用类似的科学表示法,形如m× (2^e)。m称为尾数,e称为指数。指数可以为正,也可以为负,负的指数表示那些接近0的比较小的数。在二进制中,单独表示尾数部分和指数部分,另外还有一个符号位表示正负。几乎所有的硬件和编程语言表示小数的二进制格式都是一样的。这种格式是一个标准,叫做IEEE 754标准,它定义了两种格式:一种是32位的,对应于 Java 的 foat;另一种是64位的,对应于 Java的double。


32 位格式中,1 位表示符号,23 位表示尾数,8 位表示指数。64 位格式中,1位表示符号,52 位表示尾数,11 位表示指数。在两种格式中,除了表示正常的数,标准还规定了一些特殊的二进制形式表示一些特殊的值,比如负无穷、正无穷、0、NaN(非数值,比如0乘以无穷大)。IEEE 754 标准有一些复杂的细节,初次看上去难以理解,对于日常应用也不常用。


1、Float:比特数为32,数值范围为 -3.4E+38 ~ 3.4E+38


2、Double:比特数为64,数值范围为 -1.7E-308~1.7E+308

// 三者都是一回事
double d = 1.23; // 浮点型常量默认为 double 类型
double d = 1.23d;
double d = 1.23D;


无论是使用 float 还是 double,进行运算时都会出现一些非常令人困惑的现象,比如0.1f * 0.1的结果看上去应该是0.01,但实际上,屏幕输出却是0.010000001,后面多了个1。


二进制是类似的,但二进制只能表示那些可以表述为 2 的多少次方和的数。为什么计算机中不能用我们熟悉的十进制呢?在最底层,计算机使用的电子元器件只能表示两个状态,通常是低压和高压,对应 0和1,使用二进制容易基于这些电子元器件构建硬件设备和进行运算。如果非要使用十进制,则这些硬件就会复杂很多,并且效率低下。


计算不精确,怎么办呢?大部分情况下,我们不需要那么高的精度,可以四舍五入,或者在输出的时候只保留固定个数的小数位。如果真的需要比较高的精度,一种方法是将小数转化为整数进行运算,运算结束后再转化为小数;另一种方法是使用十进制的数据类型,这个并没有统一的规范。在Java中是BigDecimal,运算更准确,但效率比较低。


数字表示方式


进制数字表示


Java中对整型数据的表示有以下三种形式:


- 二进制:数据以0b0B开头(jdk 1.7新增)。


- 八进制:数据以0开头,例如:054012


- 十六进制:数据以0x0X开头,例如:0x110xAD00


二进制写起来太长,为了简化写法,可以将 4 个二进制位简化为一个0~15的数, 10~15用字符A~F表示,这种表示方法称为十六进制。


指数表示


进行数学计算时往往会用到指数表示的数值。如果采用十进制表示指数,需要使用大写或小写的 e 表示幂。

System.out.println(1e2);// 100.0
System.out.println(1e+2);// 100.0
System.out.println(1e-2);// 0.01
System.out.println(1E+1);// 10.0


在使用十六进制数的时候也是可以使用科学计数法,只是此种用法用得不多

// 表示十六进制12 乘以 (2 的 2次方) = 18 * 4 = 72
System.out.println(0x12P2);


在 Java SE 7 中,还支持以下划线作为分隔符联接的数值表示方式, 但是下划线不能放在首尾的位置


输出样例

System.out.println(123_456);
System.out.println(0B1111_1111);
System.out.println(3.141_592F);


字符类型


  • Java中 char 声明字符类型


  • 必须用单引号括起来的单个字符


  • 双字节国际统一标准 Unicode 编码,占两个字节(16位),因而可用十六进制(无符号的)编码形式表示, 所以'A'字符也可以用 Unicode 编码'\u0041'表示


提示 字符类型也属于是数值类型,可以与int等数值类型进行数学计算或进行转换。这是因为字符类型在计算机中保存的是 Unicode编码,双字节Unicode 的字符范围:\u0000(即为 0)到 \uffff(即为 65,535)


在 Java中,为了表示一些特殊字符,前面要加上反斜杠(\),这称为字符转义。


image.png


特殊字符


\u3000 表示一个中文空格。


布尔类型


在Java语言中声明布尔类型的关键字是 boolean,只有两个值:true 和 false。


image.png


取值范围的总结


数值类型相互转换


自动类型转换


自动类型转换就是需要类型之间转换是自动的,不需要采取其他手段,总的原则是小范围数据类型可以自动转换为大范围数据类型,列类型转换顺序如图所示,从左到右是自动。


image.png


注意 如图所示,char 类型比较特殊,char 自动转换为 int、long、float和 double,但 byte 和 short 不能自动转换为char,而且 char 也不能自动转换为 byte 或 short。


char 和 int 的码值对应

a 97 ~ z 122
A 65 ~ Z 90
0 48 ~ 9 57

// 字符 转 int 属于自动升位, 不需要强转
int c = 'a';
// 输出'A'
System.out.println((char)(c - 32));


强制类型转换


在数值类型转换过程中,除了需要自动类型转换外,有时还需要强制类型转换,强制类型转换是在变量或常量之前加上“(目标类型)”实现。


变量



变量和常量是构成表达式的重要部分,变量所代表的内部是可以被修改的。


  • 一定要注意变量属于哪个类型和它的取值范围


  • 强制类型转换(小能默认转大,大转小要用强转)


  • 强转可以取某个实数的整数部分(int a = (int)12.34)


成员变量


  • 定义在类中,在整个类中都可以被访问。


  • 成员变量随着对象的建立而建立,存在于对象所在的堆内存中。


  • 成员变量有默认初始化值。


静态成员变量(类变量)


在定义 class 时,作为成员变量且加了static 关键字。


局部变量(自动变量) :


  • 局部变量只定义在局部范围内,如:方法内,语句内等。


  • 局部变量存在于栈内存中。


  • 作用的范围结束,变量空间会自动释放。


  • 局部变量没有默认初始化值


  • 在方法体内可以定义本方法所使用的变量,这种变量是局部变量,它的生存期与作用域是在本方法内。


  • 方法体内定义变量时,变量前不能加修饰符。


  • 局部变量在使用前必须明确赋值,因为它没有默认值,否则编译时会出错。


  • 在语句块中定义的变量它只在语句块中有效;


  • 方法参数:作用域是整个方法.


  • 异常处理参数: catch跟随的异常处理块.


变量的作用域总结


变量的作用域也称变量的有效范围,它是程序的一个区域,变量在其作用域内可以通过它的名字来引用。作用域也决定系统什么时候为变量创建和清除内存。根据变量在程序声明的位置,可以将变量分为4类情形。


  • 成员变量 / 类变量(静态成员变量)
    成员变量可添加修饰符,包括访问权限修饰符publicprivateprotected和非访问权限修饰符staticfinalnative等。


  • 如果没有给对象属性赋初值,则对象属性的初始值由相应数据类型的默认值决定,如数值型数据的默认值为0,boolean的默认值为 false,字符串的默认值为 null。成员变量的作用域是在类的范围。


成员变量和静态成员变量(类变量)的区别


  1. 两个变量的生命周期不同。    
    成员变量随着对象的创建而存在,随着对象的被回收而释放。     
    静态变量随着类的加载而存在,随着类的消失而消失。


  1. 调用方式不同。


  • 成员变量只能被对象调用。


  • 静态变量可以被对象调用,还可以被类名调用。


  1. 数据存储位置不同。


  • 成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据


  • 静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据.


常量



常量事实上是那些内容不能被修改的变量,常量与变量类似也需要初始化,即在声明常量的同时要赋予一个初始值。常量一旦初始化就不可以被修改。它的声明格式为:final 数据类型 变量名 = 初始值;


常量和变量的命名规范



Java 编码规范命名方法采用驼峰法,下面分类说明一下。


  • 包名:包名是全小写字母,中间可以由点分隔开。作为命名空间,包名应该具有唯一性,推荐采用公司或组织域名的倒置,如com.apple.quicktime.v2。但Java核心库包名不采用域名的倒置命名,如java.awt.event。


  • 类和接口名:采用大驼峰法,如 SplitViewController。


  • 文件名:采用大驼峰法,如 BlockOperation.java。


  • 变量:采用小驼峰法,如 studentNumber。


  • 常量名:全大写,如果是由多个单词构成,可以用下划线隔开,如 YEAR 和WEEK_OF_MONTH。


  • 方法名:采用小驼峰法,如 balanceAccount、isButtonPressed 等。


参考



  • 丁振凡编著,《Java 语言程序设计(第2版)》华东交大版







目录
相关文章
|
6月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
87 13
|
2月前
|
存储 人工智能 JavaScript
Java中的数据类型转换
本文介绍了 Java 中常见的数据类型转换方法,涵盖字符串与整型、长整型、浮点型、布尔型及日期类型的相互转换,并讲解了可能出现的异常和处理方式。
|
6月前
|
Java
课时12:Java数据类型划分(字符型)
课时12介绍了Java中的字符型数据(char),包括字符的定义、与int类型的转换及应用。通过范例展示了如何观察字符、编码转换、大小写字母互转、保存中文字符,以及Java中字符处理的灵活性。字符型使用单引号声明,可与int互相转换,支持Unicode编码,能表示任何文字,包括中文。虽然实际开发中直接操作字符型的情况不多,但理解其特性有助于更好地编程。
103 17
|
6月前
|
存储 传感器 缓存
java变量与数据类型:整型、浮点型与字符类型
### Java数据类型全景表简介 本文详细介绍了Java的基本数据类型和引用数据类型,涵盖每种类型的存储空间、默认值、取值范围及使用场景。特别强调了`byte`、`int`、`long`、`float`、`double`等基本类型在不同应用场景中的选择与优化,如文件流处理、金融计算等。引用数据类型部分则解析了`String`、数组、类对象、接口和枚举的内存分配机制。
166 15
|
6月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、"+"操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
138 9
|
6月前
|
Java
课时13:Java数据类型划分(布尔型)
观察布尔型的操作。布尔是一位数学家的名字,这个布尔发明了两个单词:True、False(一个表示真一个表示假)。一般布尔类型都只表示逻辑的计算结果。
147 9
|
5月前
|
存储 缓存 Java
理解Java引用数据类型:它们都是对象引用
本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。
220 0
|
6月前
|
Java
课时11:Java数据类型划分(浮点类型)
课时11介绍了Java中的浮点数据类型。主要内容包括:1. 定义小数,默认使用Double类型;2. 定义Float变量,需在数值后加"F"或"f"进行强制转换;3. 观察不同类型计算结果,如Int型除法会丢失精度,需至少包含一个Double或Float类型以确保准确性。总结指出,在复杂计算中推荐使用Double类型以避免精度损失。
129 5
|
6月前
|
Java
课时10:Java数据类型划分(整型类型)
本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。
161 4
|
存储 Java
02 Java基础语法(变量+数据类型+运算符)(下)
02 Java基础语法(变量+数据类型+运算符)
76 5

热门文章

最新文章