1.常量包括
(1)字符串常量,用双引号括起来的内容
(2)整数常量,所有整数
(3)小数常量 ,所有小数
(4)字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号
(5)布尔常量 较为特殊,只有true和false
(6)空常量 null(数组部分讲解)
2.进制
二进制以0b开头,八进制以0开头,十六进制以0x开头
3.原码,反码,补码
(1)原码
就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
通过一个字节,也就是8个二进制位表示+7和-7
0(符号位) 0000111 +7
1(符号位) 0000111 -7
(2)反码
正数的反码与其原码相同(+7的反码为00000111);负数的反码是对其原码逐位取反,但符号位除外(-7的反码为11111000)。
(3) 补码
正数的补码与其原码相同(+7的补码为00000111);负数的补码是在其反码的末位加1(-7的反码为11111001)。
4.数据类型
Java中数据类型的分类
(1)基本数据类型
(2)引用数据类型
基本数据类型分类(4类8种)
整数型
byte 占一个字节 -128到127
short 占两个字 -2^15~2^15-1
int 占四个字节 -2^31~2^31-1
long 占八个字节 -2^63~2^63-1
浮点型
float 占四个字节 -3.403E38~3.403E38 单精度
double 占八个字节-1.798E308~1.798E308 双精度
字符型
char 占两个字节 0~65535
布尔型
boolean
boolean理论上是占八分之一个字节,因为一个开关就可以决定是true和false了,但是java中boolean类型没有明确指定他的大小
特别注意:
float f = 12.3F; //占四个字节
double d = 33.4; //占八个字节 小数默认的数据类型是double,double类型后面也可以用D或d标识,但是一般不加
System.out.println(f);
System.out.println(d);
因为小数的数据类型默认是double类型的,12.3是double类型,转为float类型会损失精度,所以需要写成float f = 12.3F
如果超过int的取值范围-21亿~21亿,需要用long类型的话,需要在数值后面加上L,一般是大写,小写的l容易和1混淆。
5.数据类型转换
隐式转换
int x = 3;
byte b = 4;
x = x + b;
System.out.println(x);
x是int类型,b是byte类型,两者相加后赋值给x是int类型,这叫隐式转换
强制转换
int x = 3;
byte b = 4;
b = (byte)(x + b);
System.out.println(b);
x是int类型,b是byte类型,两者相加后赋值给b是byte类型,需要强制转换
注意:
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
上面第三行代码是错误的,因为1.byte与byte(或short,char)进行运算的时候会提升为int,两个int类型相加的结果也是int类型2.b1和b2是两个变量,变量存储的值是变化,在编译的时候无法判断里面具体的值,相加有可能会超出byte的取值范围
byte b4 = 3 + 4;
这行代码没有问题,因为java编译器有常量优化机制,byte的取值范围为-128~127,没有超过byte的范围
**进行混合运算的时候,byte,short,char不会相互转换,都会自动类型提升为int类型,其他类型进行混合运算的是小的数据类型提升为大的
byte,short,char -- int -- long -- float -- double
6.字符和字符串参与运算
ASCII码表中,0对应48,A对应65,a对应97
System.out.println('a' + 1); //98,因为有ASCII码表,a字符对应的是int类型的97
System.out.println((char)('a' + 1)); 输出b
System.out.println("hello"+'a'+1); //任何数据类型用+与字符串相连接都会产生新的字符串,输出helloa1
System.out.println('a'+1+"hello"); 输出98hello
System.out.println(" 5 + 5 = " + (5 + 5)); 输出5 + 5 = 10,括号具有较高的优先级
System.out.println(" 5 + 5 = " + 5 + 5); 输出5 + 5 = 55
7.char字符
char c = 'a';
System.out.println(c);
char c1 = 97; //0 - 65535
System.out.println(c1);
都是输出a,char的数值范围为0-65535
注意:
Java语言中的字符char可以存储一个中文汉字,因为Java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节。中文也是占的两个字节,所以,Java中的字符可以存储一个中文汉字
8.算术运算符
(1)运算符的分类
算术运算符,赋值运算符,比较(关系或条件)运算符,逻辑运算符,位运算符,三目(元)运算符
(2)算数运算符有哪些
+,-,*,/,%,++,--
注意:
a:+号在java中有三种作用,代表正号,做加法运算,字符串的连接符
b:整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型
System.out.println(10 / 3); //整数相除结果只能是整数
System.out.println(10 / 3.0); //如果想得到小数,把其中一个数变成小数,另一个数在运算的时候会自动类型提升
第二个提升为double类型
c:/获取的是除法操作的商,%获取的是除法操作的余数
%运算符
当左边的绝对值小于右边绝对值时,结果是左边 2%5=2
当左边的绝对值等于右边或是右边的倍数时,结果是0 10%5=0
当左边的绝对值大于右边绝对值时,结果是余数 12%5=2
%运算符结果的符号只和左边有关系,与右边无关 13%-5=3
任何一个正整数%2结果不是0就是1可以用来当作切换条件
(3)++,--运算符的作用
自加(++)自减(--)运算
++:自加。对原有的数据进行+1
--:自减。对原有的数据进行-1
注意:a++和++a单独使用没有区别
int a = 3;
int b;
b = a++; //当++在变量后面的时候,会先将变量中的值取出做赋值操作,然后再自身加1
System.out.println("a = " + a);
System.out.println("b = " + b);
输出:a = 4 b = 3
b = ++a; //当++在变量前面的时候,会先自身加1,然后在将结果赋值
注意:
byte b = 10;
b++;
b = b + 1;
第三句会报错,因为b+1是int类型,而赋值给的b是byte类型的。b++不报错是因为底层会将b+1强转byte类型
9.赋值运算符
a:基本的赋值运算符:=
把=右边的数据赋值给左边
int a = 3; //把右边的常量值赋值给左边的变量,左边必须是变量
b:扩展的赋值运算符:+=,-=,*=,/=,%=
+= 把左边和右边做加法,然后赋值给左边。
a += 4; ==> a = a + 4;
注意:
short s=1;s = s+1;
short s=1;s+=1;
第一句:当short与int进行运算的时候,会提升为int类型,两个int类型相加的结果也是int类型,会报错
第二句:s = (short)(s + 1),底层会将s强转为short类型
10.关系运算符
关系运算符有哪些(比较运算符,条件运算符)
==,!=,>,>=,<,<=
注意事项:
无论你的操作是简单还是复杂,结果是boolean类型。
"=="不能写成"="。
11.逻辑运算符
(1)逻辑运算符有哪些
&,|,^,! ^(异或)
&&,|| (短路与,短路或)
(2)注意:
逻辑运算符的结果不是true就是false
逻辑与 & 是并且(and)的意思, 遇false则false
逻辑或 | 是或(or)的意思, 遇true则true
逻辑异或 ^ 两边相同为false,两边不同为true
逻辑非! ,取反
(3)&&与&的区别
a:最终结果一样。
b:&&具有短路效果。左边是false,右边不执行。
&是无论左边是false还是true,右边都会执行
(4)||与|的区别
a:最终的结果是一样
b:||具有短路效果,左边为true,右边不执行
12.位运算符
&(位与),|(位或),^(位异或),~(位取反)
>>(向左移,无符号),>>>(向左移,有符号),<<(向右移)
(1)& 和 |
&和| 的用法
&:有0则0
|:有1则1
6的二进制 110 110 110
3的二进制 011 & 011 | 001
-------------------------------------------------------------------------------
010 (2) 111(7)
(2)^ 和 ~
^ 和 ~的用法
^:相同则0,不同则1
~:按位取反
6的二进制 110 110
3的二进制 011 ^ 011
--------------------------------------------------------------------
101(为5)
00000000 00000000 00000000 00000110 6的原码,反码,补码都是本身
11111111 11111111 11111111 11111001 对6取反
- 00000000 00000000 00000000 00000001 减1
--------------------------------------------------------------
11111111 11111111 11111111 11111000 反码
10000000 00000000 00000000 00000111 原码(-7)
(3)位异或运算符的特点
一个数据对另一个数据位异或两次,该数本身不变。
(4)注意:请自己实现两个整数变量的交换(不需要定义第三方变量)
第一种
//有弊端,有可能会超出int的取值范围
x = x + y; //10 + 5 = 15
y = x - y; //15 - 5 = 10
x = x - y; //15 - 10 = 5
第二种
//不需要第三方变量,通过^来做
x = x ^ y; // 10 ^ 5
y = x ^ y; // 10 ^ 5 ^ 5 y = 10
x = x ^ y; // 10 ^ 5 ^ 10 x = 5
(5)>>(向左移,无符号),>>>(向左移,有符号),<<(向右移)
左移
//左移,向左移动几位就是乘以2的几次幂
System.out.println(12 << 1); //24
System.out.println(12 << 2); //48
右移
//右移,向右移动几位就是除以2的几次幂
System.out.println(12 >> 1); //6
System.out.println(12 >> 2); //3
(6)最有效率的算出2 * 8的结果
System.out.println(2 << 3);
13.三元运算符
格式:(关系表达式) ? 表达式1 : 表达式2;
如果为true就是表达式1的值,如果为false,就是表达式2的值
示例:获取两个数中的最大值
int x = 10;
int y = 5;
int z;
z = (x > y) ? x : y;
示例:比较两个整数是否相同
boolean b = (x == y);
示例:获取三个整数中的最大值
int a = 10;
int b = 20;
int c = 30;
//先比较任意两个数的值,找出这两个数中的最大值
int temp = (a > b) ? a : b;
//用前两个数的最大值与第三个数比较,获取最大值
int max = (temp > c) ? temp : c;
14.键盘录入学习
键盘录入两个数据,获取这两个数据中的最大值
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入第一个整数:");
int x = sc.nextInt(); //将键盘录入的数据存储在x中
System.out.println("请输入第二个整数:");
int y = sc.nextInt(); //将键盘录入的数据存储在y中
int max = (x > y) ? x : y; //获取x和y中的最大值
System.out.println("max = " + max);
15.流程控制语句
分类
顺序结构
选择结构
循环结构
16.顺序结构: 从上往下,依次执行
示例:
System.out.println("Hello World!11111");
System.out.println("Hello World!3333");
System.out.println("Hello World!22222");
System.out.println("Hello World!44444");
17.选择结构
分类:
if语句
switch语句
(1)if语句的格式1
if(比较表达式) {
语句体;
}
注意:
比较表达式无论简单还是复杂,结果必须是boolean类型
(2)if语句的格式2
if(比较表达式) {
语句体1;
}else {
语句体2;
}
注意:
首先计算比较表达式的值,看其返回值是true还是false。
如果是true,就执行语句体1;
如果是false,就执行语句体2;
(3)if语句的格式2和三元的相互转换
三元运算符实现的,都可以采用if语句实现。反之不成立。
什么时候if语句实现不能用三元改进呢?
当if语句控制的操作是一个输出语句的时候就不能。
为什么呢?因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出。
(4)if语句的格式3:
if(比较表达式1) {
语句体1;
}else if(比较表达式2) {
语句体2;
}else if(比较表达式3) {
语句体3;
}
...
else {
语句体n+1;
}
执行流程:
首先计算比较表达式1看其返回值是true还是false,
如果是true,就执行语句体1,if语句结束。
如果是false,接着计算比较表达式2看其返回值是true还是false,
如果是true,就执行语句体2,if语句结束。
如果是false,接着计算比较表达式3看其返回值是true还是false,
如果都是false,就执行语句体n+1。
注意事项:最后一个else可以省略,但是建议不要省略,可以对范围外的错误值提示
(5)switch语句的格式
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
…
default:
语句体n+1;
break;
}
注意:
switch后面的表达式可以接收基本数据类型:byte,short,char,int,引用数据类型可以接收枚举(JDK1.5),String字符串(JDK1.7)
示例:
String name = "rose";
String gender = "妖";
switch (gender) {
case "男士":
System.out.println(name + "是一位" + gender + "喜欢吃饭睡觉打dota");
break;
case "女士":
System.out.println(name + "是一位" + gender + "喜欢逛街购物美容");
break;
default:
System.out.println(name + "是一位" + gender + "打雌性激素维持美貌容颜");
break;
注意:
case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
default可以省略吗?
可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
特殊情况:
case就可以把值固定。
A,B,C,D
break可以省略吗?
最后一个可以省略,其他最好不要省略
会出现一个现象:case穿透。
最终我们建议不要省略
default一定要在最后吗?
不是,可以在任意位置。但是建议在最后。
switch语句的结束条件
a:遇到break就结束了
b:执行到switch的右大括号就结束了
(6)示例:
int x = 2;
int y = 3;
switch(x){
default:
y++;
break;
case 3:
y++;
case 4:
y++;
}
System.out.println("y="+y); ----输出4
int x = 2;
int y = 3;
switch(x){
default:
y++;
case 3:
y++;
case 4:
y++;
}
System.out.println("y="+y); ----输出6
网友评论