第二节 变量、数据类型、运算符

**

变量、数据类型、运算符

**
标识符是用来给变量、类、方法以及包进行命名的。4大规则:

必须以字母、下划线_、美元符号 开 头 。 其 它 部 分 可 以 是 字 母 、 下 划 线 “ ” 、 美 元 符 “ 开头。 其它部分可以是字母、下划线“_”、美元符“ 线”和数字的任意组合。
大小写敏感,且长度无限制。
不可以是Java的关键字。
标识符的使用规范

表示类名的标识符:每个单词的首字母大写,如Man, GoodMan
表示方法和变量的标识符:第一个单词小写,从第二个单词开始首字母大写,我们称之为“驼峰原则”,如eat(), eatFood()
Java不采用ASCII字符集,而是采用Unicode字符集。因此,这里字母的含义不仅仅是英文,还包括汉字等等。但是不建议大家使用汉字来定义标识符!
【示例2-2】合法的标识符

1int a = 3;
2int _123 = 3;
3int $12aa = 3;
4int 变量1 = 55; //不建议使用中文命名的标识符
【示例2-3】不合法的标识符

1int 1a = 3; //不能用数字开头
2int a# = 3; //不能包含#这样的特殊字符
3int int = 3; //不能使用关键字

关键字/保留字

Java关键字是Java语言保留供内部使用的,如class用于定义类。 我们不能使用关键字作为变量名或方法名。

在这里插入图片描述
在这里插入图片描述

变量的本质
变量本质上就是代表一个”可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。
可通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。
Java是一种强类型语言,每个变量都必须声明其数据类型。变量的数据类型决定了变量占据存储空间的大小。 比如,int a=3; 表示a变量的空间大小为4个字节。
变量的声明

double salary;
long earthPopulation;
int age;
不同数据类型的常量会在内存中分配不同的空间,如图2-1所示。

image-20220209154957426

声明变量和初始化

1 int age = 18;
2 double e = 2.718281828;
3int i ,j; // 两个变量的数据类型都是int
在这里插入图片描述
变量的分类和作用域

变量的分类和作用域
变量有三种类型:局部变量、成员变量(也称为实例变量)和静态变量。

局部变量、成员变量、静态变量的核心区别

类型 声明位置 从属于 生命周期(作用域)
局部变量 方法或语句块内部 方法/语句块 从声明位置开始,直到方法或语句块执行完毕,局部变量消失
成员变量(实例变量) 类内部,方法外部 对象 对象创建,成员变量也跟着创建。对象消失,成员变量也跟着消失;
静态变量(类变量) 类内部,static修饰 类 类被加载,静态变量就有效;类被卸载,静态变量消失。
老鸟建议

成员变量和静态变量不是目前重点,不要过多纠结理解与否。我们学习面向对象时,再重点讲解成员变量和静态变量。

· 局部变量(local variable)

方法或语句块内部定义的变量。生命周期是从声明位置开始到到方法或语句块执行完毕为止。局部变量在使用前必须先声明、初始化(赋初值)再使用。

【示例】局部变量的声明

1public void test() {
2 int i;
3 int j = i+5 ; // 编译出错,变量i还未被初始化
4}
1public void test() {
2 int i;
3 i=10;
4 int j = i+5 ; // 编译正确
5 }
· 成员变量(也叫实例变量 member variable)【暂不用掌握,讲面向对象再说】

方法外部、类的内部定义的变量。从属于对象,生命周期伴随对象始终。如果不自行初始化,它会自动初始化成该类型的默认初始值。

表2-3 实例变量的默认初始值
数据类型 实始值
int 0
double 0.0
char ‘\u0000’
boolean false
【示例2-8】实例变量的声明

1public class Test {
2 int i;
3 }

常量和final
在Java语言中,用关键字final来定义一个常量。常量一旦被初始化后不能再更改。

声明格式:
在这里插入图片描述

final type varName = value;
【示例2-9】常量的声明及使用

为了更好的区分和表述,一般将1、2、3、’a’、’b’、true、false、helloWorld等称为字符常量,而使用final修饰的PI等称为符号常量。

变量和常量命名规范

所有变量、方法、类名:见名知义
类成员变量:首字母小写和驼峰原则: monthSalary
局部变量:首字母小写和驼峰原则
常量:大写字母和下划线:MAX_VALUE
类名:首字母大写和驼峰原则: Man, GoodMan
方法名:首字母小写和驼峰原则: run(),runRun()

基本数据类型(primitive data type)
在这里插入图片描述

Java数据类型分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。

注意事项
引用数据类型的大小统一为4个字节,记录的是其引用对象的地址!

整型变量和整型常量和各种进制

类型 占用存储空间 表数范围
byte 1字节 -27 ~ 27-1(-128~127)
short 2字节 -215 ~ 215-1 (-32768~32767)
int 4字节 -231 ~ 231-1 (-2147483648~2147483647) 约21亿
long 8字节 -263 ~ 263-1
Java 语言整型常量的四种表示形式

十进制整数,如:99, -500, 0
八进制整数,要求以 0 开头,如:015
十六进制数,要求 0x 或 0X 开头,如:0x15
二进制数,要求0b或0B开头,如:0b01110011
Java语言的整型常数默认为int型,声明long型常量可以后加l或L 。

【示例】long类型常数的写法及变量的声明

1long a = 55555555; //编译成功,在int表示的范围内(21亿内)。
2long b = 55555555555;//不加L编译错误,已经超过int表示的范围。
报错:The literal 55555555555 of type int is out of range,所以我们需要修改代码为:

1long b = 55555555555L;
在这里插入图片描述

浮点型_float_double
float 4字节 -3.403E38~3.403E38
double 8字节 -1.798E308~1.798E308
float类型又被称作单精度类型,尾数可以精确到7位有效数字。

double表示这种类型的数值精度约是float类型的两倍,又被称作双精度类型,绝大部分应用程序都采用double类型。

Java浮点类型常量有两种表示形式

(1) 十进制数形式: 例: 3.14 314.0 0.314

(2) 科学记数法形式 例:3.14e0 3.14E2 3.14E-1

浮点型不精确,不要用于比较

浮点数存在舍入误差,数字不能精确表示。浮点数适合普通的科学和工程计算,精度足够;但不适合精度要求非常高的商业计算,这时候要使用BigDecimal进行运算和比较。

浮点常量默认类型是double,要改成float可以后面加F或f

【示例】使用科学记数法给浮点型变量赋值

1double f = 314e2; //31410^2–>31400.0
2double f2 = 314e-2; //314
10^(-2)–>3.14
float类型的数值有一个后缀F或者f,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。

【示例】float类型常量的写法及变量的声明

1float f = 3.14F;//float类型赋值时需要添加后缀F/f
2double d1= 3.14;
3double d2 = 3.14D;
【示例2-13】浮点型数据的比较一

1float f = 0.1f;
2double d = 1.0/10;
3System.out.println(f==d);//结果为false
【示例2-14】浮点型数据的比较二

1float d1 = 423432423f;
2float d2 = d1+1;
3if(d1d2){
4 System.out.println("d1
d2");//输出结果为d1d2
5}else{
6 System.out.println(“d1!=d2”);
7}
运行以上两个示例,发现示例2-13的结果是false,而示例2-14的输出结果是d1
d2。这是因为由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。 浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近, 但不等于。二进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。

java.math包下面的两个有用的类:BigInteger和BigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。

不要使用浮点数进行比较!很多新人甚至很多理论不扎实的有工作经验的程序员也会犯这个错误!需要比较请使用BigDecimal类
在这里插入图片描述

char 字符型

ASCII字符集表示了英文字母、数字、特殊字符、控制符,所有字符集的老祖宗,大家都会兼容它。但是一个字节能够表示256个状态,而ASCII字符只用到128个,后面128个一直是空的。

于是有了ISO8859-1,别名叫latin-1, 包含了256个字符。前128个字符与ASCII中完全相同。后128个包括了西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。

随着我国的计算机普及,汉字的处理也有了我们自己的方案。那就是GB2312,两个字节表示1个汉字。两个字节可以表示65536个状态,汉字再多也能全部包含。后来,又有了GBK、GB18030。

我国的台湾地区自己搞了一套显示繁体中文的大五码BIG5。

全世界各个地方,都有自己的文字编码。由于不互通,经常造成乱码的问题。

如果有一种统一的字符集,将世界上所有语言字符都纳入其中,每一个字符都给予一个全球独一无二的编码,那么乱码问题就会消失。于是,全球所有国家和民族使用的所有语言字符的统一字符集诞生了,这就是Unicode字符集。

Unicode字符集是为了给全世界所有字符一个唯一的编码,“唯一”对应的英文为Unique,而编码的英文为code。

Unicode采用了字符集和编码分开的策略。Unicode之前,Unicode诞生之前可以将字符集和字符编码混为一谈,而在Unicode中必须严格区分开。

Unicode字符集统一采用两个字节表示一个字符,包括英文字母。但是,由于英文占据互联网信息的绝大部分。真实存储和传输时,会造成极大的浪费;因此,目前主要采用UTF-8编码来实现具体的存储和传输。UTF-8是变长编码,用1-6个字节编码Unicode字符。西欧字符仍然是1个字节,汉字3个字节。

字符型在内存中占2个字节,在Java中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串。

char 类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字,它占2个字节,可允许有65536个字符。

【示例2-16】字符型演示

1char eChar = ‘a’;
2char cChar =‘中’;
Unicode具有从0到65535之间的编码,他们通常用从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为u表示Unicode)

【示例2-17】字符型的十六进制值表示方法

1char c = ‘\u0061’;
Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义。常用的转义字符及其含义和Unicode值如表2-6所示。

【示例2-18】转义字符

1char c2 = ‘\n’; //代表换行符
表2-6 转义字符
转义符 含义 Unicode值
\b 退格(backspace) \u0008
\n 换行 \u000a
\r 回车 \u000d
\t 制表符(tab) \u0009
\“ 双引号 \u0022
\‘ 单引号 \u0027
\ 反斜杠 \u005c
注意事项

以后我们学的String类,其实是字符序列(char sequence), 本质是char字符组成的数组。
在这里插入图片描述
boolean类型
有两个常量值,true和false。

在内存中占一个字节或4个字节,不可以使用 0 或非 0 的整数替代true和false,这点和C语言不同。

【注意点】

JVM规范指出boolean当做int处理,也就是4字节,boolean数组当做byte数组处理,这样我们可以得出boolean类型占了单独使用是4个字节,在数组中是确定的1个字节。

【示例2-19】boolean类型演示

1boolean flag ;
2flag = true; //或者flag=false;
3if(flag) {
4 // true分支
5} else {
6 // false分支
7}
老鸟建议

Less is More!!请不要这样写:if ( flag = = true ),只有新手才那么写。关键也很容易写错成if(flag=true),这样就变成赋值flag为true而不是判断!老鸟的写法是if ( flag )或者if ( !flag)
在这里插入图片描述

在这里插入图片描述
算术运算符

+,-,*,/,%属于二元运算符。%是取模运算符,就是我们常说的求余数操作。
算术运算符中++(自增),–(自减)属于一元运算符。
二元运算符的运算规则:

整数运算:

如果两个操作数有一个为long, 则结果也为long。
没有long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:

如果两个操作数有一个为double,则结果为double。
只有两个操作数都是float,则结果才为float。
取模运算:

其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:7%3=1,-7%3=-1,7%-3=1。
在这里插入图片描述

赋值及其扩展赋值运算符
运算符 用法举例 等效的表达式
+= a += b a = a+b
-= a -= b a = a-b
*= a = b a = ab
/= a /= b a = a/b
%= a %= b a = a%b
在这里插入图片描述

关系运算符
关系运算符用来进行比较运算。关系运算的结果是布尔值:true/false;

运算符 含义 示例
== 等于 a==b
!= 不等于 a!=b

大于 a>b
< 小于 a
= 大于或等于 a>=b
<= 小于或等于 a<=b
注意事项

=是赋值运算符,而真正的判断两个操作数是否相等的运算符是==
==、!= 是所有(基本和引用)数据类型都可以使用。

、>=、 <、 <= 仅针对数值类型(byte/short/int/long,float/double 以及char)。
在这里插入图片描述
位运算指的是进行二进制位的运算。

位运算符 说明
     取反

& 按位与
| 按位或
^ 按位异或
<< 左移运算符,左移1位相当于乘2

右移运算符,右移1位相当于除2取商
新手雷区

&和|既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
不要把^当做数学运算乘方,是位的异或操作。
在这里插入图片描述
在这里插入图片描述

字符串连接符

+运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
在这里插入图片描述

条件运算符

在这里插入图片描述

String type = score<60?不及格:及格;

x为 boolean 类型表达式,先计算 x的值,若为true,则整个运算的结果为表达式y的值,否则整个运算结果为表达式z 的值。在这里插入图片描述

运算符的优先级

优先级 运算符 类
1 () 括号运算符
2 !、+(正号)、-(负号) 一元运算符
2 ~ 位逻辑运算符
2 ++、-- 递增与递减运算符
3 、/、% 算术运算符
4 +、- 算术运算符
5 <<、>> 位左移、右移运算符
6 >、>=、<、<= 关系运算符
7 ==、!= 关系运算符
8 & 位运算符、逻辑运算符
9 ^ 位运算符、逻辑运算符
10 | 位运算符、逻辑运算符
11 && 逻辑运算符
12 || 逻辑运算符
13 ? : 条件运算符
14 =、+=、-=、
=、/=、%= 赋值运算符、扩展运算符
老鸟建议

大家不需要去刻意的记这些优先级,表达式里面优先使用小括号来组织!!
逻辑与、逻辑或、逻辑非的优先级一定要熟悉!(逻辑非>逻辑与>逻辑或)。
如:a||b&&c的运算结果是:a||(b&&c),而不是(a||b)&&c
在这里插入图片描述
数据类型的转换
在这里插入图片描述

我们讲解了八种基本数据类型,除了boolean类型之外的七种类型是可以自动转化的。

自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。如图2-6所示,黑色的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。

在这里插入图片描述

自动类型转换图

可以将整型常量直接赋值给byte、 short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
在这里插入图片描述
强制类型转换,又称为造型(cast),用于强制转换数值的类型,可能损失精度。
将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。
新手雷区

不能在布尔类型和任何数值类型之间做强制类型转换
在这里插入图片描述
强制类型转换常见问题

操作比较大的数时,要留意是否溢出,尤其是整数操作时。

L和l的问题:

(1) 不要命名名字为l的变量,字母l容易和数字1混淆。

(2) long类型使用大写L,不要用小写l。

【示例】类型转换常见问题一

1int money = 1000000000; //10亿
2int years = 20;
3//返回的total是负数,超过了int的范围
4int total = moneyyears;
5System.out.println(“total=”+total);
6//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生//了数据丢失
7long total1 = money
years;
8System.out.println(“total1=”+total1);
9//返回的total2正确:先将一个因子变成long,整个表达式发生提升。全部用long来计算。
10long total2 = money*((long)years);
11System.out.println(“total2=”+total2);
运行结果如图所示。

在这里插入图片描述

【示例】类型转换常见问题二

1int l = 2; //分不清是L还是1,
2long a = 23451l;//建议使用大写L
3System.out.println(l+1);
在这里插入图片描述
Scanner处理键盘输入

逻辑运算符
逻辑运算的操作数和运算结果都是
boolean 值。
短路与和短路或采用短路的方式。从左到右计算,如果只通过运算符左边的操作数就能
够确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。
在这里插入图片描述

【示例
2 22 】短路与和逻辑与
//1>2的结果为false,那么整个表达式的结果即为false,将不再计算2>(3/0) boolean c = 1>2 && 2>(3/0); System.out.println©; //1>2的结果为false,那么整个表达式的结果即为false,还要计算2>(3/0),0不能做除数,//会输出异常信息 boolean d = 1>2 & 2>(3/0); System.out.println(d);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值