循序渐进学Java:变量|数据类型|运算符
Java学习,更新ing,附目录
- Stage1
Chapter1:Java入门和背景知识
Chapter2:变量|数据类型|运算符
二进制_摩尔斯电码
- 二进制,是计算技术中广泛采用的一种数制,由德国数理哲学大师莱布尼茨于 1679 年发明。二进制数据是用 0 和 1 两个数码来表示的数。它的基数为 2,进位规则是“逢二进一”。数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。
- 二进制对应两种状态,广泛应用于电子科学。比如:可以对应电子器件的开关状态、对应信 号电压状态(+5V 等价于逻辑"1",0V 等价于逻辑"0")、对应卡带是否打孔状态、电磁存储(磁体状态:南为 0,北为 1)等等。
- 二进制广泛应用于我们生活的方方面面。比如,广泛使用的摩尔斯电码,它由两种基本信号 组成:短促的点信号“·”,读“滴”;保持一定时间的长信号“—”,读“嗒”。然后, 组成了 26 个字母,从而拼写出相应的单词。
- 在线进制转化的工具: https://tool.lu/hexconvert/
各种进制之间的转换
注释|单行注释|多行注释|文档注释|注释内容和字节码关系
- 注释
为了方便程序的阅读
,Java 语言允许程序员在程序中写上一些说明性的文字
,用来提高程序的可读性
,这些文字性的说明就称为注释。
注释不会出现在字节码文件中,即 Java 编译器编译时会跳过注释语句。
在 Java 中根据注释的功能不同,主要分为单行注释、多行注释和文档注释。 - 单行注释
单行注释使用“//”开头,“//”后面的单行内容均为注释。
- 多行注释
多行注释以“/”开头以“/”结尾,在“/”和“/”之间的内容为注释, 我们也可以使用多行注释作为行内注释。但是在使用时要注意,多行注释不能嵌套使用。
- 文档注释
文档注释以“/**”开头以“*/”结尾,注释中包含一些说明性的文字及一些JavaDoc 标签(后期写项目时,可以生成项目的 API)
标识符_关键字_驼峰原则
- 标识符是用来给
变量、类、方法以及包
进行命名的,如 Welcome、main、System、age、name、gender 等。标识符需要遵守一定的规则(这些基础内容挺重要的
):
标识符必须以字母、下划线_、美元符号$开头。
标识符其他部分可以是字母,下划线,美元符号和数字的任意组合
Java 标识符大小写敏感,且长度无限制。
标识符不可以是 Java 的关键字。 - 标识符的使用规范
表示类名
的标识符:每个单词的首字母大写,如 Man, GoodMan
表示方法和变量
的标识符:第一个单词小写,从第二个单词开始首字母大写,我们称之为“驼峰原则”,如 eat(), eatFood() - Java 不采用通常语言使用的ASCII 字符集,而是采用 Unicode 这样标准的国际字符集。因此,这里字母的含义不仅仅是英文,还包括汉字等等。但是不建议大家使用汉字来定义标识符
- 使用标识符的案例
- 关键字
Java 关键字是 Java 语言保留供内部使用的,如 class 用于定义类。 关键字也可以称为保留字,它们的意思是一样的,我们不能使用
关键字作为变量名或方法名。
关键字没必要背诵,用多了就熟了
变量的本质_变量声明和初始化
- 引入----变量(variable)
如果我们把一个软件、一个程序看做一座大楼的话,变量就是“砖块”,一个个“砖块” 最终垒成了大厦。 变量也是进入编程世界最重要的概念. - 变量的本质
变量本质上就是代表一个”可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。我们可通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。
Java 是一种强类型语言,每个变量都必须声明其数据类型。
变量的数据类型决定了变量占据存储空间的大小。 比如,int a=3; 表示 a 变量的空间大小为 4 个字节。
变量作为程序中最基本的存储单元,其要素包括变量名,变量类型和作用域
。变量在使用前必须对其声明
, 只有在变量声明以后,才能为其分配相应长度的存储空间。 - 变量的声明
声明格式:
文字表达就是:最简情况下,你可以只进行变量的声明即int a;而暂时不进行变量初始化;同时还可以一次性声明多个变量,但是不建议这么做,最好一行声明一个更规范.
声明
变量:
不同的数据类型的变量在内存中分配有不同大小的空间
- 注意
每个变量都有类型,类型可以是基本类型
,也可以是引用类型
。
变量名必须是合法的标识符
变量声明是一条完整的语句,因此每一个声明都必须以分号结束
变量的分类和作用域
- 整体来看,可以将变量划分为’局部变量,成员变量(实例变量)和静态变量(类变量)
类型 | 声明位置 | 从属于 | 生命周期(作用域)) |
局部变量 | 方法或语句块内部 | 方法/语句块 | 从声明位置开始,直到方法或语句块执行完毕,局部变量消失 |
成员变量(实例变量) | 类内部,方法外部 | 对象 | 对象创建,成员变量也跟着创建; 对象消失,成员变量也跟着消失 |
静态变量(类变量) | 类内部,static修饰 | 类 | 类被加载,静态变量就有效; 类被卸载,静态变量消失(静态变量是在类被load的时候分配内存的,并且存在于方法区。当类被卸载的时候,静态变量被销毁。) |
- 局部变量(local variable)
方法或语句块内部
定义的变量。生命周期是从声明位置开始到到方法或语句块执行完毕为止。局部变量在使用前必须先声明、初始化(赋初值)再使用
.
- 成员变量(实例变量,member variable)
方法外部、类的内部
定义的变量。从属于对象,生命周期伴随对象始终。如果不自行初始化,它会自动初始化
成该类型的默认初始值。
- 静态变量(类变量 static variable)
使用static 定义
。 从属于类,生命周期伴随类始终,从类加载到卸载。 如果不自行初始化,与成员变量相同会自动初始化
成该类型的默认初始值
常量和final
- 常量通常指的是一个固定的值,在 Java 语言中,主要是利用关键字
final
来定义一个常量。 常量一旦被初始化后不能再更改其值。 - 声明格式:
- 常量中需要
注意点
:对于基本数据类型,final使数值恒定不变,而对于对象引用,final使引用恒定不变(也就是说一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象),但是对象自身却是可以修改的,Java并未提供使任何对象恒定不变的途径. -
变量和常量命名规范总结
:
(1) 所有变量,方法,类名:见名知意
(2) 类成员变量:首字母小写和驼峰原则
(3) 局部变量:首字母小写和驼峰原则
(4) 常量:大写字母和下划线
(5) 类名:首字母大写和驼峰原则:Man,People
(6) 方法名:首字母小写和驼峰原则:run(),runRun()
基本数据类型介绍
- Java 是一种
强类型
语言,每个变量都必须声明其数据类型
。 Java 的数据类型可分为两大类:基本数据类型
(primitive data type)和引用数据类型
(reference data type) - 数据类型图
- 引用数据类型的大小统一为4个字节,记录的是其引用对象的地址
整型
- 整型用于表示没有小数部分的数值,它允许是负数。整型的范围与运行 Java 代码的机器无关,这正是 Java 程序具有很强移植能力的原因之一。与此相反,C 和 C++程序需要针对不同的处理器选择最有效的整型。
- 整型数据类型占用字节和范围一览
- 整型四种表示形式
- Java语言的整型常数
默认均为int类型
,如果要定义long类型最好在后面添加小写l或者大写L
浮点型_float_double
- 带小数的数据在java中称为浮点型.浮点型可以分为float类型和double类型
- 浮点型占用空间及表数范围
- float 类型又被称作单精度类型,尾数可以精确到
7 位
有效数字,在很多情况下,float 类型的精度很难满足需求。而 double 表示这种类型的数值精度约是 float 类型的两倍,又被称作双精度类型,绝大部分应用程序都采用 double 类型
. - float类型的数值有一个后缀F或者f ,默认的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。
- 科学计数法表示浮点型
格式为: 浮点数a后面跟e或E再跟一个指数b,表示a乘以10的b次方
- 关于浮点数精确度的说明
(1) 浮点类型float,double的数据不适合在不允许出现舍入误差的金融计算领域.如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类
(2) 运行以上两个示例,发现示例1的结果是“false”,而示例2的输出结果是“d1==d2”。这是因为由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。 浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近, 但不等于。二进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。 - BigInteger和BigDecimal类
java.math 包下面的两个有用的类:BigInteger 和 BigDecimal
,这两个类可以处理任意长度的数值。BigInteger 实现了任意精度的整数运算。BigDecimal 实现了任意精度的浮点运算。(不要使用浮点数进行比较
)
- 总结
char字符型_转义字符
- 字符型在内存中占 2 个字节,在 Java 中使用
单引号
来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串。 - char 类型用来表示在 Unicode 编码表中的字符。Unicode 编码被设计用来处理各种语言的文字,它占 2 个字节,可允许有 65536 个字符。
- Unicode 具有从 0 到 65535 之间的编码,他们通常用从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为 u 表示 Unicode),下面演示中 \u0061 其实就是字符 a
- 演示
- 转义字符
Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义。
- 对于String类,其实就是字符序列,本质上是字符组成的数组
boolean布尔型
- boolean 类型有两个常量值,
true 和 false
,在内存中占一个字节或 4 个字节
,不可以使用 0 或非 0 的整数替代 true 和 false ,这点和 C 语言不同。boolean 类型用来判断逻辑条件,一般用于程序流程控制。 - 示例
- 注意:boolean 类型占了
单独使用
是 4 个字节,在数组中
是确定的 1 个字节
操作符介绍
- 在最底层,Java中的数据是通过使用操作符来操作的
- 操作符接收一个或多个参数,并生成一个新值.参数的形式与普通方法的调用不同,但是效果是相同的.操作符作用于操作数,生成一个新值,有些操作符可能会改变操作数自身的值,这被称为"副作用"
- 操作符分类
算术操作符
- 算术运算符中+,-,*,/,%属于二元运算符,二元运算符指的是需要两个操作数才能完成运算的运算符。其中,整数除法会直接去掉结果的小数位,%是取模运算符,就是我们常说的求余数操作
- 二元运算符运算规则:
- 算术运算符中++(自增),–(自减)属于一元运算符,该类运算符只需要一个操作数。自增自减操作符这种快捷运算使编码更方便.有个小故事,在一个关于Java的演讲中,Bill Joy(Java创始人之一)声称"Java=C+±-"意味着Java已去除了C++中一些很困那而有没有必要的东西,成为了一种更加精简的语言.
- 一元操作符运算规则:
赋值操作符
- 最常见的赋值操作符就是"=",意为将等号右边数的值赋值给左边
- 扩展赋值操作符运算规则
- 赋值运算符案例
关系操作符
- 关系操作符生成的是一个boolean结果,他们计算的是操作数的值之间的关系.如果关系是真实的,关系表达式会生成true,反之为false.
- 关系运算符中等于和不等于适用于所有的
基本数据类型
,而其他比较符不适用于boolean类型. - 关系运算符一览
- 扩展点:(看不懂可以跳过)
请大家看以下代码,想一下输出是啥?
有的可能认为两个值都是47,所以认为是true,false
这就涉及到比较两个对象的实际内容是否相同了,此时必须使用所有对象都适用的特殊方法equals(),但是这个方法不适用于基本数据类型
,基本类型直接用==和!=即可
再比如,我这里自己创建了一个新的类,然后用equals进行比较呢?
如果你认为结果是true,那就错了哦
这是因为equals方法的默认行为
是比较引用.而之前的Integer类已经对equals方法进行了覆写,所以除非在自己创建的类中覆盖equals方法,否则不可能表现希望的结果
逻辑操作符
- 逻辑操作符能根据参数的逻辑关系,生成一个布尔值(true或false)
-
短路
:使用逻辑操作符时,会遇到一种短路现象.即一旦明确无误地确定整个表达式的值,就不再计算表达式余下部分了,这将获取潜在的性能提升 - 逻辑操作符一览表
- 短路案例
按位操作符
- 按位操作符用来操作整数基本数据类型中的单个"比特"(bit),即二进制位,按位操作符会对两个参数中对应位执行布尔代数运算,并最终生成一个结果.
- 按位操作符一览
- 移位运算符:只能够用来处理整数类型(基本类型一种)
- &和|既是逻辑运算符,也是位运算符。如果两侧操作数都是 boolean 类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
条件操作符(也称三元操作符)
- 它有三个操作数,但它确实属于操作符的一种,最终也会生成一个值.
- 表达式形式:boolean-exp?value0:value1 (如果boolean-exp的结果为true,就计算value0,而且这个计算结果就是操作符最终产生的值.如果boolean-exp的结果为false,就计算value1.)
- 案例
字符串操作符+和+=
- 特殊用途:连接不同的字符串
- 案例:
第一个打印语句输出的是012而不是3,之所以这样,是因为Java编译器会将x,y和z转换成他们的字符串形式,然后连接这些字符串,而不是先把它们加到一起.
第二个打印语句会先计算x+z的值,然后进行字符串拼接
第三个打印语句中的s提前进行了拼接操作,然后使用了括号来控制表达式的赋值顺序,使得int类型变量在显示之前进行了求和操作
最后一个打印语句在今后某些地方还是挺常见的,空的字符串+一个基本类型变量,这样的话就可以自动转为String类型,这样就没必要去调用更麻烦的显式方法(Integer.toString)
操作符优先级问题
- 一览表
- 注意点:表达式里面优先使用小括号来组织,逻辑非(!)>逻辑与(&&)>逻辑或(||)
类型转换
- 类型转换(cast)原意是"模型铸造".在适当的时候,Java会将一种数据类型自动转换成另一种.比如,假设我们为某浮点变量赋予一个整数值,编译器会将int自动转换成float.类型转换运算允许我们显式地进行这种类型转换,或者在不能自动进行转换的时候强制进行类型转换
- 分类:自动类型转换和强制类型转换
- 自动类型转换
自动类型转换指的是将容量小的数据类型可以自动转换为容量大的数据类型.下图中实线表示无数据丢失的自动类型转换,虚线表示在转换时可能有精度的损失
可以将整型常量直接赋值给byte,short,char等类型变量,而不需要进行强制类型转换,只要不超出目标表数范围即可
4.强制类型转换
强制类型转换,将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型,用于强制的转换一个数值的类型.当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断
成为一个完全不同的值(而不是四舍五入,采用四舍五入的话,需要用round()方法)。
- 类型转换注意点:
(1) java允许我们将任何基本数据类型
转换成别的基本数据类型,但是布尔型除外
,因为它根本不允许进行任何类型的转换处理
(2) 关于类的类型转换,对象可以在其所属类型的类族之间可以进行类型转换
(3) 通常表达式中出现的最大数据类型决定了表达式最终结果的数据类型,比如:如果将一个float值与一个double值相乘,结果就是double,如果将一个int和一个long值相加,则结果为long
基本类型转换常见错误_溢出问题
- 案例
使用Scanner获得键盘输入
- 为了我们能写出更加复杂的程序,可以让我们的程序和用户可以通过键盘交互,我们先 学习一下简单的键盘输入和输出。
- 案例:
(1) next()方法在遇到有效字符前所遇到的空格、tab键、enter键都不能当作结束符,next()方法会自动将其去掉,只有当next()方法遇到有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符,所以如果输入了中间含有空格的字符串,那么使用next()不能得到完整的带有空格的字符串,只能得到部分字符串(空格前面的)。
(2) nextLine()方法的结束符是Enter键
,即nextLine()方法返回的是Enter键之前的所有字符串,所以nextLine()方法可以获取到带有空格的字符串。