课前回顾:
1.Java的环境:
jvm:运行Java程序的,运行的是编译生成的.class文件
跨平台性:一个应用程序,可以在不同的操作系统上运行,需要安装不同版本的jvm
jre:运行Java程序的,包含了jvm
jdk:开发工具包,包含了jvm以及开发工具包
2.环境变量
JAVA_HOME
3.注释:对代码进行解释说明
单行: //
多行: /**/
文档: /**内容*/
4.关键字:java提前定义好的,具有特殊含义的小写单词,在高级记事本中颜色特殊
5.开发三步骤:
编写:
public class 类名{
public static void main(String[] args){
System.out.println("内容");
}
}
编译:
javac 文件名.java
运行:
java 文件名
6.常量
整数常量 小数常量 字符常量(单引号中必须有且只能有一个内容) 字符串常量 布尔常量 空常量
7.变量:
int i = 10;
作用:一次存储一个数据
数据类型:
基本类型:
整型: byte short int long
浮点型:float double
字符型:char
布尔型:boolean
引用类型:
数组 类 接口 注解 枚举
今日重点:
1.要知道变量的注意事项
2.知道什么时候发生自动类型转换(不用我们手动去做)
3.知道怎么强制类型转换(需要我们手动处理)
4.会使用所有的运算符
第一章.变量
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1个字节 | -128 至 127 定义byte变量时超出范围,废了 |
短整型 | short | 2个字节 | -32768 至 32767 |
整型 | int(默认) | 4个字节 | -231 至 231-1 正负21个亿 |
长整型 | long | 8个字节 | -263 至 263-1 19位数字 |
单精度浮点数 | float | 4个字节 | 1.4013E-45 至 3.4028E+38 |
双精度浮点数 | double(默认) | 8个字节 | 4.9E-324 至 1.7977E+308 |
字符型 | char | 2个字节 | 0 至 216-1 |
布尔类型 | boolean | 1个字节 | true,false |
1.变量的介绍以及使用
// 转义字符
/*
\ 代表的是转义字符
*/
public class Demo01Var{
public static void main(String[] args){
/*
\n 代表的是换行
*/
char c1 = '\n';
System.out.print("哈哈哈");
System.out.print(c1);
System.out.print("哈哈哈");
System.out.print(c1);
/*
\t 制表符 相当于tab键
*/
System.out.println("hah"+'\t'+"haha");
/*
在java中表示路径怎么表示?
E:\Idea\io
在java中两个反斜杠代表一个反斜杠
\\
*/
String path = "E:\\Idea\\io";
System.out.println(path);
char c2 = '\'';
System.out.println(c2);
}
}
2.变量使用时的注意事项
1.变量不初始化(第一次赋值)不能直接使用
2.在同一个作用域(一个大括号就是一个作用域)中,不能定义重名的变量
3.不同的作用域之间的变量不要随便互相访问
小作用域中能访问大作用域中提前定义好的的变量
大作用域中不能直接访问小作用域中的变量
public class Demo02VarNotice{
public static void main(String[] args){
int i;
i = 10;
System.out.println(i);
//int i = 20;//错误 在同一个作用域中不能定义重名的变量
System.out.println(i);
int j = 100;
{
System.out.println(j);
int x = 10000;
}
//System.out.println(x);
}
}
3.练习
需求:变量去描述一个人
人: 姓名 年龄 性别 身高 体重
public class Demo03Person{
public static void main(String[] args){
//姓名
String name = "和珅";
//年龄
int age = 30;
//性别
char sex = '男';
//身高
int height = 175;
//体重
double weight = 140.0;
System.out.println(name);
System.out.println(age);
System.out.println(sex);
System.out.println(height);
System.out.println(weight);
}
}
第二章.标识符
1.概述:我们自己给类,方法,变量取得名字
2.硬性规定(必须遵守)
- 标识符可以包含`英文字母26个`、`0-9数字` 、`$(美元符号)`和`_(下划线)`。int a1_b = 10;
- 标识符不能以数字开头。int a1 = 10 int 1a = 100(错误)
- 标识符不能是关键字。int staic = 10(错误) int staticpublic = 100
3.软性建议(建议遵守规则):
给类取名:每一个单词首字母都大写(大驼峰式) public class DemoTest
给方法取名字: 从第二个单词开始往后(包括第二个单词)首字母大写(小驼峰式)
给变量取名字: 从第二个单词开始往后(包括第二个单词)首字母大写(小驼峰式)
取名字的时候最好要:见名知意
第三章.数据类型转换
1.什么时候会发生数据类型转换:
等号左右两边数据类型不一样
2.按照取值范围大小来排序(从小到大排序)
byte short char->int->long->float->double
1.自动类型转换
1.表示形式:
取值范围大的数据类型 变量名 = 取值范围小的数据类型
2.怎么转:
将小的类型自动转成大的类型
public class Demo04DataType{
public static void main(String[] args){
/*
等号左边是long型的
等号右边是int型的
相当于将取值范围小的类型赋值给取值范围大的类型
会发生自动类型转换
*/
long num1 = 100;
/*
等号左边是double型
等号右边是int型
相当于将int型的数据赋值给了double型的变量
将取值范围小的类型赋值给取值范围大的类型
发生了自动类型转换
*/
double num2 = 1000;
System.out.println(num2);
/*
小类型和大类型做运算
小类型也会自动转成大类型->会自动提升
*/
double num3 = 10+2.5;
System.out.println(num3);
}
}
2.强制类型转换
1.什么时候需要强转
取值范围小的数据类型 变量名 = 取值范围大的数据类型->报错
2.怎么强转?
取值范围小的数据类型 变量名 =(取值范围小的数据类型) 取值范围大的数据类型
public class Demo05DataType{
public static void main(String[] args){
/*
等号右边为long型
等号左边为int型
相当于将取值范围大的类型赋值给取值范围小的类型,需要强转
*/
int num1 = (int)100L;
System.out.println(num1);
/*
等号右边是double型
等号左边是float型
相当于将取值范围大的类型赋值给取值范围小的类型,需要强转
*/
float num2 = 2.5F;
System.out.println(num2);
}
}
3.强转的注意事项
1.不要随机(故意)写成强转的形式(除非不得已),有可能会出现精度损失以及数据溢出现象
2.byte,short如果等号右边是常量,没有超出取值范围,不会报错(jvm已经针对此种情况做了优化,jvm自动强转了)
byte,short如果等号右边有变量参与,会自动提升为int型,需要手动强转
3.char
如果等号右边是常量,不用强转(jvm自动转了)
如果等号右边有变量参与,也会自动提升为int型,需要强转
char类型一旦提升为int,会自动去码表中查询这个字符对应的int值->ASCII码表
char类型的数据只要是参与运算,都会被提升为int型做运算
如果ASCII码表中没有字符对应的int值,会去Unicode的码表中查询字符对应的int值->万国码
public class Demo06DataTypeNotice{
public static void main(String[] args){
/*
等号右边是double型
等号左边是int型
相当于将取值范围大的类型赋值给取值范围小的类型,报错了,需要强转
*/
int i = (int)2.9;
System.out.println(i);
/*
数据溢出
int型占内存4个字节
1个字节占多少个2进制位 8个
int型能表示的二进制位最多是32位二进制
100亿转成二进制:36位二进制
将36位二进制的数硬给最多能存32位二进制的int型,多出来4位,将100亿对应二进制
的前4位干掉,剩下的二进制对应的十进制就是1410065408
*/
int num = (int)10000000000L;
System.out.println(num);//1410065408
}
}
public class Demo07DataTypeNotice{
public static void main(String[] args){
byte b = 10;
/*
byte型的sum等号右边有变量参数,此时自动提升为int型,需要手动强转
byte = byte + int
byte = int+int
*/
byte sum = (byte)(b+1);
System.out.println(sum);
System.out.println("==========华丽的分割线==========");
char c = 'a';
/*
char result = c+1
变量c代表的'a'自动提升为int型 'a'--> 97
char result = c+1 = 97+1=98
(char)98--> b
*/
char result = (char)(c+1);
System.out.println(result);
char result01 = 98;
System.out.println(result01);
int result02 = 'a';
System.out.println(result02);
int result03 = '中';
System.out.println(result03);//20013
}
}
第四章.运算符
1.算数运算符
+
-
*
/ -> 取的是整数部分(商) ->如果是两个整数相除,取商,如果被除数和除数有一个为小数,结果就是小数
%(模) -> 取的是余数部分
public class Demo08SuanShu{
public static void main(String[] args){
int i = 10;
int j = 20;
//推荐使用
int sum = i+j;
System.out.println(sum);
//不推荐
System.out.println(i+j);
//为了方便先直接放到输出语句中
System.out.println(i-j);
System.out.println(i*j);
int x = 10;
int y = 3;
int result01 = x/y;
System.out.println(result01);
int result02 = x%y;
System.out.println(result02);
}
}
+:
数和数之间用+ 此+代表就是运算符号,加法
如果和字符串之间用+,代表的是字符串连接符号,直接往后拼接,不运算(任何类型遇到字符串都会变成字符串)
public class Demo09SuanShu{
public static void main(String[] args){
int i = 10;
int j = 20;
System.out.println(i+""+j);//1020
System.out.println(i+j+"");//30
System.out.println(""+j+i);//2010
System.out.println(""+(j+i));//30
String s = (i+""+j);
System.out.println(s);//1020
int x = 100;
int y = 200;
int sum = x+y;
System.out.println("x与y相加之和为:"+sum);
}
}
2.自增自减运算符(也算算数运算符的一种)
1.自增 ++
自减 --
2.注意:
a.++ -- 必须和变量一起使用 i++ ++i
b.++ -- 都是变化1
3.使用:
单独使用:++ -- 自身单独成为一句
符号在前还是在后,都是直接运算
混合使用:和赋值语句以及输出语句混合使用
符号在前: 先运算,再使用运算后的值
符号在后: 先用原来的值,用完之后再运算
4.注意:
开发时我们用的只有单独使用
平时不要瞎玩儿
public class Demo10ZiZengZiJian{
public static void main(String[] args){
int i = 10;
//i++;
++i;
System.out.println(i);
System.out.println("=======");
int j = 10;
//int result = ++j;
int result = j++;
System.out.println(result);
System.out.println(j);
System.out.println("=======");
int c = 100;
c = c++;
System.out.println(c);
System.out.println("=======");
int x = 10;
int y = 20;
/*
-9+19
*/
int result02 = x++ - --y + y++;
System.out.println(result02);//10
}
}
练习:
求出三位数中的每一位的数据
比如: 364 分别拿出3 6 4
public class Demo11Test{
public static void main(String[] args){
int number = 364;
int bai = number/100;
int shi = number/10%10;
int ge = number%10;
System.out.println("百位为:"+bai);
System.out.println("十位为:"+shi);
System.out.println("个位为:"+ge);
}
}
3.赋值运算符
基本赋值运算符:
=:赋值符号,将等号右边的赋值给等号左边的变量
复合赋值运算符
+=
int i = 10;
i+=1; --> i = i+1
i+=2; --> i = i+2
-=
*=
/= : 如果两个整数相除,取整数部分 除数和被除数有一个为小数,那么结果就是小数
%= : 取余数部分
注意:复合赋值运算符中,如果是byte short的话,不会出现错误,不用手动强转,(jvm自动强转)
public class Demo12FuZhi{
public static void main(String[] args){
int i = 10;
i+=2;//i = i+2
System.out.println(i);
byte b = 1;
b+=1;//b = b+1
//b = b+1;
System.out.println(b);
}
}
4.关系运算符(比较运算符)
1.关系运算符结果都是boolean型 都是用于做判断条件使用
== : 判断符号前后的数据是否相等,如果相等结果为true,否则为false
> : 判断符号前面的是否大于符号后面的数据,如果大于返回true,否则返回false
< : 判断符号前面的是否小于符号后面的数据,如果小于返回true,否则返回false
>= : 判断符号前面的数据是否大于或者等于符号后面的数据,如果大于或者等于返回true,否则返回false
<= : 判断符号前面的数据是否小于或者等于符号后面的数据,如果小于或者等于返回true,否则返回false
!= : 判断符号前面的数据是否不等于符号后面的数据,如果不等于返回true,否则返回false
public class Demo13Compare{
public static void main(String[] args){
int i = 10;
int j = 20;
int k = 10;
//== : 判断符号前后的数据是否相等,如果相等结果为true,否则为false
boolean result01 = (i==j);
System.out.println(result01);
//> : 判断符号前面的是否大于符号后面的数据,如果大于返回true,否则返回false
boolean result02 = (i>k);
System.out.println(result02);
//< : 判断符号前面的是否小于符号后面的数据,如果小于返回true,否则返回false
System.out.println(i<j);
//>= : 判断符号前面的数据是否大于或者等于符号后面的数据,如果大于或者等于返回true,否则返回false
System.out.println(i>=k);
//<= : 判断符号前面的数据是否小于或者等于符号后面的数据,如果小于或者等于返回true,否则返回false
System.out.println(i<=j);
// != : 判断符号前面的数据是否不等于符号后面的数据,如果不等于返回true,否则返回false
System.out.println(i!=k);
}
}
5.逻辑运算符
1.结果:都是boolean型
2.作用:连接关系运算符的, 或者连接多个结果为boolean型结果的表达式
&(与,并且):有假则假,如果符号前后有一个结果为false,结果就是false
|(或):有真则真,如果符号前后有一个结果为true,结果就是true
^(异或):符号前后结果一样,返回false 符号前后结果不一样,返回true
true^true--> false
false^false ->false
true^false -> true
false^true -> true
!(非,取反):真亦假 假亦真
非true就是false 非false 就是true
&&(双与):有假则假,如果符号前后有一个结果为false,结果就是false
||(双或):有真则真,如果符号前后有一个结果为true,结果就是true
public class Demo14LuoJi{
public static void main(String[] args){
int i = 10;
int j = 20;
int k = 10;
// &(与,并且):有假则假,如果符号前后有一个结果为false,结果就是false
boolean result01 = (i>j)&(j<k);
System.out.println(result01);//false
// |(或):有真则真,如果符号前后有一个结果为true,结果就是true
boolean result02 = (i<j)|(j<k);
System.out.println(result02);//true
/*
^(异或):符号前后结果一样,返回false 符号前后结果不一样,返回true
true^true--> false
false^false ->false
true^false -> true
false^true -> true
*/
boolean result03 = (i>j)^(j<k);//false ^ false
System.out.println(result03);//false
/*
!(非,取反):真亦假 假亦真
非true就是false 非false 就是true
*/
boolean result04 = !(i==k);
System.out.println(result04);
/*
定义一个变量,表示分数,判断这个分数是否在1-100之间
数学写法:1<=score<=100
java写法:score>=1 & score<=100
*/
int score = -1;
boolean result05 = (score>=1) & (score<=100);
System.out.println(result05);
}
}
&& 和 & 以及|| 和|区别
&:如果符号前后是boolean表达式,是逻辑运算符
如果符号前后是数字,是位运算符
如果符号前面为false,jvm还会判断符号后面的表达式
&&:就是一个纯的逻辑运算符
有假则假,如果符号前面的为false,符号后面不看了(短路效果)
|:如果符号前后是boolean表达式,是逻辑运算符
如果符号前后是数字,是位运算符
如果符号前面为true,jvm还会判断符号后面的表达式
||:就是一个纯的逻辑运算符
有真则真,如果符号前面为true,jvm后面不看了(短路效果)
注意:开发时如果用到逻辑运算符的话,我们首先选用&& ||
6.三元运算符
1.格式:
boolean表达式?表达式1:表达式2
2.执行流程:
a.先走boolean表达式,判断
b.如果是true,执行?后面的表达式1
c.否则,执行:后面的表达式2
6.1练习1
需求:小明考完试了,判断小明的分数是否及格?
分析:
1.定义一个分数,随意赋值
2.判断如果分数>=60,返回及格
3.否则,返回不及格
public class Demo15SanYuan{
public static void main(String[] args){
//定义一个变量,表示分数
int score = 59;
String result01 = (score>=60)?"及格":"不及格";
System.out.println(result01);
}
}
6.2练习2
需求:
一座寺庙里住着两个和尚,已知他们的身高分别为150cm、210cm,请用程序实现获取这两个和尚的最高身高。
//定义两个变量分别表示两个和尚的身高
int heShang1 = 150;
int heShang2 = 210;
int result02 = (heShang1>heShang2)?heShang1:heShang2;
System.out.println(result02+"CM");
6.3 练习3
需求:
一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、170cm,请用程序实现获取这三个和尚的最高身高。
步骤:
先用前两个和尚身高进行比较,获取较大的值
然后再和第三个和尚比较,再拿较大的值
public class Demo15SanYuan{
public static void main(String[] args){
//定义三个变量分别表示三个和尚的身高
int heShang1 = 150;
int heShang2 = 210;
int heShang3 = 170;
int temp = (heShang1>heShang2)?heShang1:heShang2;
int result02 = (temp>heShang3)?temp:heShang3;
System.out.println(result02+"CM");
}
}
第五章.进制的转换(了解)
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | a或A |
11 | 1011 | 13 | b或B |
12 | 1100 | 14 | c或C |
13 | 1101 | 15 | d或D |
14 | 1110 | 16 | e或E |
15 | 1111 | 17 | f或F |
16 | 10000 | 20 | 10 |
3.1 十进制转成二进制
辗转相除法(除以2取余数)
3.2 二进制转成十进制
8421规则
3.3 二进制转成八进制
将二进制分开(3位为一组)
3.4 二进制转成十六进制
二进制分为4个为一组
第六章.位运算符(了解)
1代表true 0代表false
我们要知道计算机在存储数据的时候都是存储的数据的补码,而计算的也是数据的补码
1.正数二进制最高位为0;负数二进制最高位是1
2.正数的原码,反码,补码一致
如:5的源码,反码,补码为:
0000 0000 0000 0000 0000 0000 0000 0101->二进制最高位是0,因为是正数
3.负数的话原码,反码,补码就不一样了
反码是原码的基础上最高位不变,其他的0和1互变
补码是在反码的基础上+1
如:-9
原码:1000 0000 0000 0000 0000 0000 0000 1001
反码:1111 1111 1111 1111 1111 1111 1111 0110
补码:1111 1111 1111 1111 1111 1111 1111 0111
(1)左移:<<
**运算规则**:左移几位就相当于乘以2的几次方
**注意:**当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位
2<<2 等于8
相当于:2*(2的2次方)
-2<<2 等于-8
相当于:-2*(2的2次方)
(2)右移:>>
快速运算:类似于除以2的n次,如果不能整除,向下取整
9>>2 等于 2
相当于:9除以(2的2次方)
-9>>2 等于-3
相当于:-9除以(2的2次方)
(3)无符号右移:>>>
运算规则:往右移动后,左边空出来的位直接补0,不管最高位是0还是1空出来的都拿0补
正数:和右移一样
9>>>2 等于 2
相当于:9除以(2的2次方)
负数:右边移出去几位,左边补几个0,结果变为正数
-9>>>2
结果为:1073741821
笔试题:8>>>32位->相当于没有移动还是8
8>>>34位->相当于移动2位
(4)按位与:&
小技巧:将0看成为false 将1看成true
运算规则:对应位都是1才为1,相当于符号左右两边都为true,结果才为true
1 & 1 结果为1
1 & 0 结果为0
0 & 1 结果为0
0 & 0 结果为0
比如: 5&3 结果为1
(5)按位或:|
运算规则:对应位只要有1即为1,相当于符号前后只要有一个为true,结果就是true
1 | 1 结果为1
1 | 0 结果为1
0 | 1 结果为1
0 | 0 结果为0
比如: 5|3 结果为:7
(6)按位异或:^
运算规则:对应位一样的为0,不一样的为1
1 ^ 1 结果为0 false
1 ^ 0 结果为1 true
0 ^ 1 结果为1 true
0 ^ 0 结果为0 false
比如: 5^3 结果为6
(7)按位取反
运算规则:~0就是1
~1就是0
~10 -> 结果为-11
第七章.运算符的优先级(了解)
提示说明:
(1)表达式不要太复杂
(2)先算的使用(),记住,如果想让那个表达式先运行,就加小括号就可以了
i<(n*m)