02《JAVA从零到壹》第二讲:数据类型及运算符
【摘要】 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆❤️技术活,该赏❤️点赞 👍 收藏 ⭐再看,养成习惯 基本元素 标识符标识符是用来标识类,方法和变量的名称,标识符由 字母、数字、下划线、美元符号 自由组合形成,不能以数字为开始!不能以数字为开始!不能以数字为开始!重点:Java是区分大小写的; J...
❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆
❤️技术活,该赏
❤️点赞 👍 收藏 ⭐再看,养成习惯
基本元素
标识符
标识符是用来标识类,方法和变量的名称,标识符由 字母、数字、下划线、美元符号 自由组合形成,不能以数字为开始!不能以数字为开始!不能以数字为开始!
重点:Java是区分大小写的; Java是区分大小写的; Java是区分大小写的;
合法标识符:
x2 $xuzhu xu_zhu_nb Xiaoxuzhu 小虚竹
非法标识符:
2xuzhu xu-zhu
注:Java关键字不能当作Java标识符,下面会有介绍。
字符集
java用的是Unicode字符集,Unicode字符集涵盖了目前人类使用的所有字符,并为每个字符进行统一编号,分配唯一的字符码,最多可以识别65536个字符。那这样就是,中文 也可以当JAVA类名,变量名了,因为中文也是Unicode字符集中的字符。
但不建议代码中用中文标识符。
但不建议代码中用中文标识符。
但不建议代码中用中文标识符。
不信邪可以在工作中试试,看leader会怎么骂你~
命名规范:
- 类名变量名采用-驼峰命名:
如:personName personSex
- 类名的首字母一定要大写
- 变量和方法名的首字母一定要小写
- 常量的所有字母都要大写
- 包名都要小写
- 工程名或项目名首字线一定要大写
关键字
JAVA有是关键字的,不能用来当标识符使用,这些关键字有特殊的含义和作用。
以下这些都是关键字
基本分类:
- 用于数据类型
boolean、byte、char、 double、 float、int、long、new、short、void、instanceof
- 用于语句
break、case、 catch、 continue、 default 、do、 else、 for、 if、return、switch、try、 while、 finally、 throw、this、 super
- 用于修饰
abstract、final、native、private、 protected、public、static、synchronized、
transient、 volatile
- 用于方法、类、接口、包和异常
class、 extends、 implements、interface、 package、import、throws
- 异常处理
throw, try, finally
- 保留字
goto、const、null
这些关键字不用背,后面会介绍。
常量变量
常量是指程序中固定不变的值
示例:
8 , 8.8 数字/整型,浮点常量
‘X’ , “” 字符,字符串常量
true false 布尔型
变量的概念:
- 占据着内存中的某一存储区域,是一个存储单元;
- 变量有自己的标识符和数据类型
- 变量要有初始值
- 在这个存储单元内,数据是可以在这个数据类型内变化的
基本的变量声明方法如下:
type indentifier =[value];
例如:
正确示范:
int index = 10;
错误示范:强烈不建议用魔法值来当变量名
int a,b,c;
int d=5,f=18;
char x = ‘x’;
注释
java有三种注释:
第一种: //单行注释
第二种: /* 多行注释
……
*/第三种: /** Java文档注释,这种可以使用javadoc命令,生成API接口文档
……
*/
数据类型
java的八大基本数据类型
Java语言是强类型语言
java对变量的数据类型有严格要求
java进行变量传递时,都会进行数据类型检查
八大基本数据类型
布尔型 | 整型 | 浮点型 | 字符型 |
---|---|---|---|
boolean | byte (又称字节型) | float (单精度) | char |
short(又称短整型) | double (双精度) | ||
int | |||
long (又称长整型) |
布尔型
- 所占内存: 占1个字节
- 常量: true , false
- 变量: 使用boolean定义:
boolean xuzhuFlag=true;
整型
byte(字节型)
- 所占内存: 占1个字节
- 常量: 12、32(十进制); 033(八进制); 0x7F (十六进制)
- 变量: 使用byte定义:
- byte by1;
- byte by2=033,by4=0x7F;
二进制存储形式:
对于byte型变量,内存分配给1个字节,1个字节由8位(bit)组成;位有两种状态分别用0,1来表示,这样计算机可以用二进制数来存储信息。
例如: byte x=7; 内存储状态为: 0000111
最高位(左边的第一位)是符号位,0表示正数,1表示负数; 正数用原码表示;负数用补码(即加1取反)表示。
例如: byte x=-8 内存储状态为: 11111000
得到-8的补码,首先得到7的原码,然后将7的原码中的0变成1, 1变成0就是-8的补码。
因此byte型变量的取值范围是 ~ -1 (-128 ~ 127)
short(整型)
- 所占内存: 占2个字节
- 常量: 12、32(十进制); 01133(八进制); 0x117F (十六进制)
- 变量: 使用short定义:
- short sh1;
- short sh2=12,sh3=01133,sh4=0x117f;
- 取值范围为: ~ -1
int(整型)
- 所占内存: 占4个字节
- 常量: 12、32(十进制); 01133(八进制); 0x117F (十六进制)
- 变量: 使用int定义:
- int in1;
- int in2=12,in3=01133,in4=0x117F;
- 取值范围为: ~ -1
long(整型)
- 所占内存: 占8个字节
- 常量: 12、32(十进制); 01133(八进制); 0x117F (十六进制)
- 变量: 使用long定义:
- long lo1;
- long lo2=12l,lo3=123456789012345L;
- 取值范围为: ~ -1
- 注: 对long型变量赋值时,数字后要大写或小写的 l
浮点型
float(浮点型)
- 所占内存: 占4个字节
- 常量: 3.14F、2.23f;
- 变量: 使用float定义:
- float fl1;
- float fl2=12f, fl3=2.34f;
- 取值范围为: ~ ~
- 注: 对float型变量赋值时,必须数字后要大写或小写的 f
double(浮点型)
- 所占内存: 占8个字节
- 常量: 3.14D、2.23d、23.23;
- 变量: 使用double定义:
- double do1;
- double do2=12, do3=2.34E5,do4=2.34e-5;
- 取值范围为: ~ ~
- 注: 对double型变量赋值时,(可选)数字后要大写或小写的 d
字符型(char)
字符型: java使用Unicode字符集;
-
所占内存: 占2个字节
-
常量: ‘a’、’A’、’\t’、’你’、’ぁ’、’?’
-
变量: 使用char定义:
-
char ch1;
-
char ch2=‘a’, ch3=‘A’;ch4=’\u0011’;
-
注:字符型用 单引号括起来
-
取值范围为: 对于char类型,内存分配2个字节,占16位,最高位不用来表示符号。char型变量取值为:0 ~ -1 (0 ~ 65535)
-
数据类型小结
基本类型所占位数是固定的 ,不因操作系统改变而改变。
基本类型的关键词是小写的
总结如下:
数据类型 | 字节数 | 所占位数 | 数的范围 |
---|---|---|---|
boolean | 1 | 8 | true false |
char | 2 | 16 | 0 ~65535 |
byte | 1 | 8 | ~ -1 (-128 ~ 127) |
short | 2 | 16 | ~ -1 |
int | 4 | 32 | ~ -1 |
long | 8 | 64 | ~ -1 |
float | 4 | 32 | ~ ~ |
double | 8 | 64 | ~ ~ |
代码初体验:
public class DataType {
public static void main(String[] args) throws Exception {
int xInt , yInt ;
short sShort;
byte bByte = 6;
float z1Float= 1.234F;
float z2Float = 1.234f;
long l1Long=123L;
long l2Long=123l;//不建议这种写法,小写l容易跟1混乱;应该以大写L结尾
double wDouble = 1.234 ;
boolean flag = true ;
char cChar ;
cChar = 'A' ;
xInt = 12 ;
yInt = 300;
sShort = 77;
System.out.println("xInt:"+xInt);
System.out.println("yInt:"+yInt);
System.out.println("sShort:"+sShort);
System.out.println("z1Float:"+z1Float);
System.out.println("z2Float:"+z2Float);
System.out.println("l1Long:"+l1Long);
System.out.println("l2Long:"+l2Long);
System.out.println("wDouble:"+wDouble);
System.out.println("flag:"+flag);
System.out.println("cChar:"+cChar);
}
}
数据类型转换
隐式转换
整型、浮点型、字符型数据可以混合运算。代码运算时,会先把不同的类型数据先转化为同一类型数据,然后再进行运算处理。,转换从低级到高级:(混合运算:默认转换) :
低---------------------------->高
byte, short, char > int > long > float > double
代码初体验:
public class DataTypeTransition {
public static void main(String[] args) throws Exception {
byte by1Byte=12;
short sh1Short;
int in1Int;
float f1Float=32.0f;
double d1Double;
sh1Short=by1Byte;
in1Int=sh1Short;
d1Double=f1Float;
System.out.println("sh1Short:"+sh1Short);
System.out.println("in1Int:"+in1Int);
System.out.println("d1Double:"+d1Double);
}
}
强制类型转换
把某一个表达式强制转换成某一个类型:
转换的通用语法是:
- (type) cast
- type 任意有效的 java 数据类型
示例:
public class DataTypeForceTransition {
public static void main(String[] args) throws Exception {
int xInt;
float fFloat;
fFloat = 3.14159f;
xInt = (int) fFloat;
System.out.println("xInt:"+xInt);
System.out.println("fFloat"+fFloat);
}
}
代码分析:
先定义了变量xInt 为int类型;定义了变量fFloat为float类型;
给变量fFloat赋值
对变量fFloat进行类型转换,强制转换成了int整型,并赋值给xInt变量
对数据结果进行输出。
会发现xInt变量数据精度有丢失,但fFloat 本身的值不变
数据类型转换必须满足如下规则
-
boolean类型 是 不能 进行类型转换的。
-
不相关类的对象不能进行对象类型转换。
-
所占位数大的类型转换为所占位数小的类型时,一定要用强制类型转换。
-
转换时,可能会有数据精度丢失
int index = 8; byte byte1=(byte)index;
-
浮点数转换成整数,不是四舍五入,而是舍弃小数
(int)3.14 == 3,(int)-88.88f == -88
字符型与int整型转换
字符型在java使用Unicode字符集,字符型存储的值为该值在unicode字符集中的位置。
如: char xuzhu1=‘a’,xuzhu2=97;
char xuzhu3=‘你’,xuzhu4=20320;
字符型所在内存是2个字节。字符型一般与int相互转化;
如: char ch1Char=‘a’,ch2Char=‘你’;
int in1Int=(int)ch1Char, in2Int=(int)ch2Char;
int in3Int=97,in4Int=20320;
char ch3Char=(char)in3Char,ch4Char=(char)in4Char;
注:想要查看字符在unicode的位置,可以用上面的示例代码,进行强制类型转换,得到位置的值。
表达式的类型转化
整数表达式包括byte、short、int,表达式的类型自动被提升到int
约定如果一个操作数是long整个表达式被提升到long,float和double一样
代码初体验:
public class ExpressionTypeTransition {
public static void main(String[] args) throws Exception {
byte by1Byte=12;
int in1Int=32;
//byte,int相加后类型取高精度int;
int in2Int=by1Byte+in1Int;
System.out.println(in2Int);
}
}
表达式和运算符
什么是表达式
-
由变量或常量与符号的组合,称为表达式
例如:num1+num2;或age>18
-
表达式可分为:
-
算术表达式
num1+num2;
-
关系表达式
age>18
-
逻辑表达式
if ((a>10) && (a<20))
-
赋值表达式
X =X+ 5
-
什么是运算符
- 运算符可以分为:一元运算符、二元运算符和三元运算符
- 根据用途可以分为以下几类:
- 赋值运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 运算符的优先级和结合方向
- 按运算符的优先级高低次序执行。例如,先乘除后加减。
- 如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按java语言规定的结合方向(结合性)进行。
算术运算符及算术表达式
一元运算符 | 操作 | 二元运算符 | 操作 |
---|---|---|---|
- | 一元减 | + | 加 |
++ | 递增 | - | 减 |
– | 递减 | ***** | 乘 |
% | 模 | ||
/ | 除 |
-
算术表达式中的运算符都是算术运算符。
示例:
(x+y)/2-1 ; ++i % 7 ;
5 + (c = 3 + 8); a * (b + c/d)*22 -
java语言规定:两个整数相除,其商为整数,小数部分被舍弃。例如,22/5结果等于4,而不是4.4。
-
良好的源程序书写习惯 :在表达式中,在双目运算符的左右两侧各加一个空格 ,可增强程序的可读性。
赋值运算符
- 赋值符号“=”就是赋值运算符,它的作用是将一个表达式的值赋给一个变量。
- 通用的形式:变量名=表达式
- 将同一个值赋给多个变量的操作叫做多重赋值
复合赋值运算符及优化级
运算符 | 表达式 | 计算 | 结果(假设 X=10 ) |
---|---|---|---|
+= | X += 5 | X = X + 5 | 15 |
-= | X -= 5 | X = X - 5 | 5 |
*= | X *= 5 | X = X * 5 | 50 |
/= | X /= 5 | X = X / 5 | 2 |
%= | X %= 5 | X = X % 5 | 0 |
注:
还可以与位运算符构成复合赋值运算符,如:^=、<<=、>>=、&=、|=
赋值运算符之间的优先级
- 所有的赋值运算符的优先级相同
- 始终按从右向左顺序进行计算
- 赋值运算符的优先级低于算术运算符,仅高于逗号运算
- 赋值表达式
- 由赋值运算符或复合赋值运算符,将一个变量和一个表达式连接起来的表达式,称为赋值表达式。
- 赋值表达式的值:任何一个表达式都有一个值,赋值表达式也不例外。被赋值变量的值,就是赋值表达式的值。
关系运算符及优先级
运算符 | 关系运算 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
- 用于测试两个操作数或两个表达式之间的关系,其中操作数可以是变量、常量和表达式
- 不存在相对于其他算术运算符有较高的优先级
- 始终按从左向右顺序进行计算
运算符类型 | 运算符 | 结合方向 |
---|---|---|
二元 | < , <=, >, >= | 从左向右 |
二元 | == , != | 从左向右 |
逻辑运算符及优化级
-
逻辑运算符用于对包含关系运算符的表达式进行合并或取非
-
使用逻辑运算符的表达式,返回 false表示假,返回 true 表示真
-
示例:
if ((a>10) && (a<20))
运算符 | 逻辑运算 | 说明 |
---|---|---|
&&(短路与) &(非短路与) | 与 | 当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”。 |
||(短路或) | 非短路或 | 或 | 当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。 |
! | 非 | 当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。 |
- 逻辑运算符的运算对象主要是关系表达式
- 逻辑表达式计算有时会出现部分表达式不参加运算的情况(短路现象)
代码初体验:
public class LogicalExpression {
public static void main(String[] args) throws Exception {
int aInt=1,bInt=2,cInt=3;
if( aInt>2 && (bInt++)>0 ){
System.out.println(bInt);
}
if( aInt>0 || (cInt--)>3){
System.out.println(cInt);
}
}
}
逻辑运算符之间的优先级
优先级 | 运算符 | 结合方向 |
---|---|---|
1 | ! | 从右向左 |
2 | && | 从左向右 |
3 | || | 从左向右 |
当条件中有多个逻辑运算符时,可以使用括号,但括号只改变了操作数的组合关系,在特定的条件下仍然存在短路现象。
位运算符
将数字转换成等价的二进制形式后再处理数据(按位表示法)
运算符 | 描述 |
---|---|
按位与 ( x & y ) | 如果两个操作数的相应位均为 1,则该位的结果值为 1 |
按位或 ( x | y ) | 如果两个操作数的相应位有一个为 1,则该位的结果值为 1 |
按位取反( ~x ) | 将操作数按位取反(0 到 1 和 1 到 0) |
按位异或 ( x^y ) | 如果参加运算的两个操作数的相应位同号,则结果为 0,异号则为 1 |
左移 ( x<<2 ) | 左端(高位)移出部分舍弃,右端(低位)补0 |
右移 ( x>>2 ) | 右端(低位)移出部分舍弃,左端(高位)根据符号位补0或者1,无符号或正数补0,负数补1 |
操作数 | 位操作 | 位表达式 | 数字 |
---|---|---|---|
10 & 15 | 1010 & 1111 | 1010 | 10 |
10 | 15 | 1010 | 1111 | 1111 | 15 |
10 ^ 15 | 1010 ^ 1111 | 0101 | 5 |
~ 10 | ~1010 | 0101 | -11 |
位运算符将数字视为二进制值,并按位进行相应运算,运算完成后再重新转换为数字
^异或的简单加密
异或运算有个特性:一个数被同一个数异式两次后数值不变;
代码初体验:
public class XorEncryption {
public static void main(String[] args) throws Exception {
char ch1Char='虚', ch2Char='竹';
char srChar='V';
ch1Char= (char) (ch1Char^srChar);
ch2Char= (char) (ch2Char^srChar);
System.out.println("加密后:"+ch1Char+ch2Char);
ch2Char=(char) (ch2Char^srChar);
ch2Char=(char) (ch2Char^srChar);
System.out.println("解密后:"+ch1Char+ch2Char);
}
}
修改优先级及不同类型运算
修改优先级:
- 括号 ( ) 的优先级最高
- 使用括号 ( ) 可修改运算符的优先级
- 用括号括起来的优先级较低的运算符具有最高的优先级,最先执行
- 在括号嵌套 ( ( ( ) ) ) 的情况下,最里层的最先执行
- 包含多个括号的表达式从左向右进行计算
不同类型运算:
- 运算符的操作数属于不同的数据类型,运算时通常会将这些操作数转换为同一类型,转换后的类型为参与运算不同数据类型的精度最高的,由编译系统自动完成。
运算符之间的优先级
运算符 | 描述 | 结合性 |
---|---|---|
(), ., [ ] | 圆括号 | 自左向右 |
!, ++, – | 逻辑非,递增, 递减 | 自右向左 |
*, /, % | 乘法,除法,取余 | 自左向右 |
+, - | 加法,减法 | 自左向右 |
<, <=, >, >= | 小于,小于等于,大于,大于等于 | 自左向右 |
= =, != | 等于,不等于 | 自左向右 |
&& | 逻辑与 | 自左向右 |
|| | 逻辑或 | 自左向右 |
=,+=, *=, /=, %= ,-= | 赋值运算符,复合赋值运算符 | 自右向左 |
注:一般来说,算术运算符优先级高于比较运算符高于逻辑运算符高于赋值运算符
总结
- 基本元素
- 标识符 、字符集 、关键字 、常量与变量
- 注释
- 数据类型
- java的八大基本数据类型
- 数据类型转换
- 运算符
- 掌握赋值、算术、关系和逻辑运算符,了解位运算符
- 熟悉掌握赋值、算术、表达式
- 熟悉掌握运算符的优先级和结合方向
课后作业
1、编写程序 输出 char c1=’你’, c2=’a’; char c3=’ぁ’; 三个字符变量中字符对应的unicode码;
2、编写程序实现简单加密与解密;
3、有一个小写的字母’f’,把它转换成自身的后4个字母的大写形式,并且把结果输出。如:a字母结果输出E
4、定义两个整数并初始化,把两个数字输出,然后交换两个数字并且输出结果
5、理解如下代码:int x = 9;int y = (x++)+(++x)+7+(++x)+(–x)+8+(x–),并输出y的值
6、试运行如下代码:理解++与—前置后置的区别
int x = 5;
System.out.println("x= "+x);
System.out.println("++x= "+(++x));
System.out.println("x= "+x);
System.out.println("--x= "+(--x));
System.out.println("x= "+x);
System.out.println("x++= "+(x++));
System.out.println("x= "+x);
System.out.println("x--= "+(x--));
System.out.println("x= "+x);
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)