第二章 数据类型和运算符
【目标】
1.了解Java中的注释和javadoc命令
2. 了解Java的分隔符
3.掌握Java标识符及其命名规则,关键字
4. 掌握8种基本数据类型
5.掌握变量的声明,初始化,作用域,常量
6. 掌握基本数据类型转换
7. 掌握运算符的使用
【内容】
一 Java中的注释和javadoc命令
注释:用来说明某段代码的作用,某个方法的功能或者思路等等.
Java注释分类:单行注释,多行注释,文档注释
单行注释:
// 注释内容
多行注释:
/*
* 注释内容
* 注释内容
* 注释内容
*/
文档注释
/**
* 注释内容
* 注释内容
* 注释内容
*/
生成API文档,API文档可以帮助用户更好的理解和学习该程序。
单行注释和多行注释案例:

文档注释案例:

运行:
编译源文件是否有错,
javadoc DocComm.java

二 Java中的分隔符
Java语言中{}、[]、()、;、,、.、空格、”” 都具有分割作用,统称为分隔符.
分号:语句的分割。Java语言中一行语句的结束必须要加分号。
{}: 定义一个代码块。成对出现。
[]:定义数组,访问数组
定义数组:intarr = [1,2,3,4];
访问数组:arr[0]
(): 定义方法的时候使用。
表达式里表示优先级,(1+2)*3
强制类型转换 inta = (int)10L;
逗号:变量声明时分割多个变量 int a,b,c;
方法定义时分割多个参数,方法调用也会使用
方法定义:publicstatic int sum(int a, int b, int c ){
}
方法的调用:sum(1,2,3)
定义数组:intarr = [1,2,3,4];
点号:类/对象和定义成员之间的分隔符,表示要调用那个属性或者方法。
System.out.println();
空格:分割单词与单词之间,语句之间。
三标识符及其命名规则,关键字
标识符:给程序中的类、方法、变量命名的符号。
标识符规则:
英文大小写字母a-zA-Z
数字 0-9
$ 和_
注意事项:
不能以数字开头
不能是Java的关键字
区分大小写
简明,见名知意
不能有空格
Java关键字,保留字
Java关键字:48个

保留字2个:goto,const
直接量3个:true真,false假,null空
Java中关键字,保留字,直接量全部是小写。
包(其实就是文件夹)
全部小写,并用逗号隔开
例如:单级包:com
多级包:com.bbs,com.itcase.test
类或者接口
首字母大写,驼峰命名
例如:一个单词:Student,Demo
多个单词:HelloWrold,LoginAction
方法和变量
首字母小写;从第二个单词开始,首字母要大写
例如:name,main,studentAge,showAllUsers
常量
全部大写,多个单词用下划线(_)隔开
例如:PI,STUDENT_MAX_AGE
四基本数据类型
Java语言是强类型语言. Java语言数据类型分类:基本数据类型 8种
引用类型 3种String,Array

整数类型
byte 1个字节,8位 范围: -128——127 (-27 ——27-1)
short 2个字节,16位 范围:-32768——32767(-215——215-1)
int 4个字节,32位 范围:-2,147,483,648——2,147,483,647(-231——231-1)
long 8个字节,64位 范围:-9,223,372,036,854,775,808——9,223,372,036,854,775,807 -263——263-1
整数类型:表示没有小数部分的数值,可以是负数。
一般情况下int是最常用的,Java默认整数类型就是int。定义int变量 int a = 5;
定义long类型时,需要在后面加上l或者L。longc = 5L;
Int 5= 4+1=22+20 0000 0000 0000 0000 0000 00000000 0101
案例

如果做加法运算,比如b+s,一定要用int以上的类型来接收。这是由于加法运算得到的那个数字是int类型,intx = b+s;如果这个数值超过了int的范围或者其中一个参数是long类型,就会自动转换为long类型,此时就需要long接收,longn = b+m;

Java中整数类型有四种表示方式:二进制,八进制,十进制,十六进制,默认是十进制。
二进制:0b开头,如:0b0101= 1*20+0*21+1*22+0*23=5
八进制:0开头,如:0117= 7*80 + 1*81+1*82=7+8+64= 79
十六进制:0x开头,0-9,a,b,c,d,e,f如:0x1af =15*160+10*161+1*162 = 15+160+256 =431

简单的方法:
0 0 0 0 0 0 0 0
128 64 32 16 8 4 2 1
5 = 4+1= 22 +20 = 0101
11 = 8+ 2+1 = 23 +21+20 = 1011
案例:

浮点类型
Java浮点类型有固定的表数范围和字段长度,不受平台影响.
Float 4个字节,32位 大约正负3.40282347E+38F 小数点后有效位数6-7位
Double 8个字节,64位 小数点后有效数是15-16位
默认的类型是double,如果声明为float类型,就必须在后面加F或者f。
案例:

字符类型
Char2个字节
字符类型用于表示单个字符,字符常量必须用单引号引起来.Java中字符类型使用Unicode编码.Unicode编码几乎支持世界上所有书面语言.包括中文字符,韩文字符….
字符类型的三种表示方式:
直接使用单个字符表示:char sex = ‘男’; char a= ‘X’;
通过转义字符表示特殊的字符常量:’\n’,’\t’
直接使用Unicode编码表示字符常量:char a = ‘\u9999’;
案例:

布尔类型
布尔类型表示逻辑上的真假,布尔类型只有两个值:true(真)和false(假)
布尔类型不可以和其他类型相互转化

五变量和常量,作用域
变量
变量就是在程序执行的过程中,在某个范围内其值可以发生改变的量。
定义格式:
声明变量:数据类型变量名; eg: int a;
初始化:变量名 = 变量值;eg: a = 10;
声明和初始化合在一起:数据类型变量名 = 变量值;例如:int a = 10;
Eg: intdays = 25;
int age = 18;
System.out.println(days+ “\t ” + age);
常量
常量:就是不能改变的量,值是固定的。变量名字用大写字母表示,如果是两个单词中间加下划线,如:MAX_VALUE,MONTH
Java中常量的分类:
字面值常量
自定义常量(面向对象)
定义常量:
final int MONTHS = 12;

作用域:
变量定义在哪一级的大括号内,变量的作用域就是哪个大括号内的区域.
相同的作用域是不可以定义两个同名的变量

六数据类型转换
Java八种基本数据类型有两种转换方式:自动类型转换,强制类型转换
boolean类型不可以和其他任何类型相互转换
自动类型转换


自动类型转换规则:
如果有double参与运算,表达式就被提升为double类型
满足自动类型转换的条件
两种类型要兼容:
数值类型(整型和浮点型)互相兼容
目标类型大于源类型:
例如:double型大于 int 型
强制类型转换:
格式:(数据类型)表达式。例如:inta = (int)10.2;

如果将一个int类型233转换为byte类型,结果是多少?-23
知识点:二进制,原码,反码,补码,负数用二进制如何表示
当使用二元运算符对两个值进行运算时,两个操作数会转换成通用类型。
如果两个操作数中有一个是double类型,则另一个将会转换成double类型。
如果两个操作数中有一个是float类型,则另一个将会转换成float类型。
如果两个操作数中有一个是long类型,则另一个将会转换成long类型。
否则,两个操作数就转换成int类型。
字符串和所有基本数据类型连接操作时,基本数据类型就被转换成字符串
System.out.println(“abc” + 1 +2); abc12
System.out.println(“abc” + (1+2)); abc3

变量相加时,首先转换为默认数据类型或者变量数据类型中最大的,然后再看是否在赋值的数据类型范围内,如果不是报错。
B = b1+b2;//先转换为int类型,然后进行加法运算,运算结果是int类型,大于byte,所以编译报错。如果想要编译成功,必须强制类型转换:b= (byte)(b1+b2);
常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,如果不是,就报错。
B = 3+4;//先3+4=7,7是在byte的范围之内,所以说编译通过。

七 运算符的使用
Java中的运算符分为:算术运算符,算术运算符、逻辑运算符、位运算符、三目运算符
算术运算符:

加号+的几种作用:
加法、正数、字符串的连接
除法:
整数相除,只能得到整数
要想得到小数,可以*1.0
除数不能为0,得到无穷大的值

/和%的区别:
数据做除法操作的时候,/取的是商,%取的是余数
1%2 =1
2%3 = 2
1、从控制台输入学员王浩3门课程成绩,编写程序实现
(1)Java课和SQL课的分数之差
(2)3门课的平均分
效果图:

编码实现:

++和—

总结:单独使用i++和++k,没有任何区别

总结:当执行j=i++时,先把i的值赋给了j,然后i自增,所以结果i=6,j=5
当执行m=++k时,先让k自增,然后再将结果赋给m,所以结果:k=6,m=6
Intj = i++ + i;
Intj = i + i++;
赋值运算符
=、+=、-=、*=、/=、%=
a+=10就相当于a= a+ 10;

面试题:
short s=1, s = s+1;
short s=1, s+=1;===s = s +1;
上面两个代码有没有问题,如果有,那里有问题
总结:
S= s+1; s是short类型,1是int类型,s+1就变成了int。s= s+1;编译出错,损失精度。强制转换才能编译成功:s= (short) (s + 1);
S+=1;编译没有问题,先进行s+1计算结果2,2在short范围之内,所以是正确的。
比较运算符(关系运算符)

注:比较运算符的结果都是boolean类型,要么是true,要么是false。
相等是两个等号==

逻辑运算符

逻辑运算符用于连接boolean类型的表达式
&与:有false就是false,两个true才是true
|或:有true就是true
^异或:相同false,不同true
!非:非true则false,非false则true。
&&短路与:规则与&一样,有短路效果。如果左边是false,右边就不执行,结果是false。
||短路或:规则与|一样,有短路效果。左边true,右边不执行,结果就是true。

Eg:(5>6) ^(5>7)
(5<6) ^(5<7)
位运算符:



分析:
3的二进制:11
0000000000000000 00000000 00000011
4的二进制:100
0000000000000000 00000000 00000100
&的运算:
00000000 00000000 00000000 00000011
&00000000 00000000 00000000 00000100
-----------------------------------------------------------
0000000000000000 00000000 00000000
结果就是:0
|的运算:
00000000 00000000 00000000 00000011
|00000000 00000000 00000000 00000100
-----------------------------------------------------------
0000000000000000 00000000 00000111
结果:7^的运算:
00000000 00000000 00000000 00000011
^00000000 00000000 00000000 00000100
-----------------------------------------------------------
0000000000000000 00000000 00000111
结果:7
~的运算:
~00000000 00000000 0000000000000011
----------------------------------------------------------
11111111 11111111 11111111 11111100
最高位是符号位,如果是0是正数,如果是1是负数
负数先-1,再取反得到对应的正数
11111111 11111111 11111111 11111100
-00000000000000000 00000000 0000001
--------------------------------------------------------
11111111 11111111 11111111 11111011
~11111111 11111111 1111111111111011
100000000 00000000 00000000 00000100
结果:-4
负数的二进制:
负数对应的正数的原码,以-3为例
3的原码(原始的二进制):00000011
3的反码(对原码取反):11111100
3的补码(对反码+1):11111101
-3的原码就是3的补码:11111101
<<:左移。就是将二进制向左移动相应位数,右边被移空的部分补0.就相当于乘以2的倍数
>>:右移。就是将二进制向右移动相应位数,如果最高位是0,左边被移空的位置就补0;如果最高位是1,左边被移空的位置就补1.
>>>:按位右移。就是将二进制向右移动相应位数,无论最高位是0还是1,都补0。

3的二进制:00000011
向左移动2位,去掉多出来的两个最高位,右边补0
00001100-------12
左移几位乘以2的多少次方。3<<4=====3*24= 48
面试题:
请用最有效率的方式写出2*8的结果?
2<<3
右移:
向右移动2位,去掉右边多出来的,左边最高位是1补1,是0则补0
24: 00011000
00000110===6
-24:00011000取反=11100111+1= 11101000
-24右移两位:11111010
11111010-1=11111001 =取反=10000110 = -6
-24:1111111111111111 11111111 11101000=右移两位:0011111111111111 11111111 11111010=1073741818
练习题:
1.请自己实现两个整数变量的交换
例如:a= 3;b = 4 交换之后a= 4; b = 3;

三元运算符(三目运算符)
格式:比较表达式? 表达式1 :表达式2
执行流程:首先计算比较表达式的值,看是true还是false。
如果是true,结果就是表达式1;
如果是false,结果就是表达式2.

练习:
比较两个数是否相等
获取两个数中的最大值
获取三个数中的最大值

运算符的优先级
运算符的优先级(从高到低)
[object HTMLImageElement]
如果在程序中,要改变运算顺序,可以使用()。




