Day01.[环境变量,HelloWorld,变量,常量]
2023年2月23日,算是第一天学习,感觉还好,效率很高。
第一章.Java语言前言
1.Java的介绍
1.计算机编程语言:电脑能看懂的语言,我们用过编写计算编程语言,让计算机识别,帮我们去做事儿
2.Java之父: 詹姆斯 高斯林
3. 1995:诞生
1996:JDK1.0
1998:JDK1.2
J2SE J2EE J2ME
2004:JDK1.5
JavaSE JavaEE
2014:JDK1.8
3.Java常用版本(主流):JDK8
2.字节
1.概述:计算机存储的最小单元,用byte代表字节或者用B
8个二进制(bit)位是一个字节
2.存储单元换算
8bit = 1byte
1024byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
3.dos命令
命令 | 说明 |
盘符名: | 切换盘符 (盘符名,不区分大小写) |
dir | 查看当前目录下的内容 |
cd 文件夹名称 | 进入到指定文件夹里面 |
cd 文件夹名\文件夹名 | 进入到多级文件夹中 |
cd.. | 退到上一级 |
cd\ | 直接退到根目录 |
cls | 清屏 |
exit | 退出dos命令窗口 |
mkdir 文件夹名 | 创建单级文件夹 |
mkdir 文件名\文件夹名 | 创建多级文件夹 |
del 文件名 | 删除指定文件 |
del *.后缀名 | 批量删除指定的文件 |
rd 文件夹名字 (文件夹必须是空的) | 删除文件夹 |
小结:
1.快速进入到指定的位置
选中要进入的目录路径--> 打cmd->回车
2.如何补全文件名或者文件夹名
tab键
3.按上下箭头->找到之前打过的命令
第二章.Java所需环境
1.Jvm和跨平台
1.JVM(Java Virtual Machine ):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境之一,也是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在JVM之上。
java程序运行之前需要先编译,编译生成一个字节码文件(.class结尾的文件),jvm运行就是运行的这个.class文件
2.跨平台:跨越不同的操作系统,java程序可以在不同的操作系统上运行,需要jvm的支持
3.jvm和跨平台的关系:一个java代码想要在不同的操作系统上运行,就需要不同版本的jvm的支持
2.JDK和JRE
1.JRE(Java Runtime Environment):java程序运行时所需要的环境,包含`JVM` 和运行时所需要的`核心类库
2.JDK(Java Development's Kit):是Java程序开发工具包,包含`JRE` 和开发人员使用的工具
3.环境变量的配置
1.对着"此电脑",右键 -> 属性--> 高级系统设置 -> 环境变量
2.在"系统变量"中点击"新建"
3."变量名":JAVA_HOME
"变量值":jdk bin 路径的上一级路径
4.找到"path",点击"编辑"
添加:%JAVA_HOME%\bin
第三章.HelloWorld
开发三步骤
编写 编译 运行
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld");
}
}
//编译: javac HelloWorld.java
//运行: java HelloWorld
2.注释
对代码进行了解释说明,不参与编译和运行
分类:单行注释: //
多行注释: /* */
文档注释:/** */ 说明书
3.注意事项
1.如果这个类不是public,那么源文件名可以和类名不一致。
如果这个类是public,那么要求源文件名必须与类名一致。
最好类名要和文件名保持一致。
2.一个源文件中可以有多个类,编译后会生成多个.class字节码文件。但是一个源文件只能有一个 public的类。
3.main不是必须在public的类中,但是基本上main习惯上都在public类中。
第四章.命名规范
标识符:在程序中开发人员(我自己),自己定义的名字,就是标识符
26个字母区分大写小写,0-9的数字,下划线 _和 $,不能是关键字,不能是数字开头
命名规则(驼峰,骆驼命名法):
类的名字:首字母大写,后面每个单词首字母大写
HelloWorld BeiJingShiChangPingQuHuiLongGuan
方法的名:首字母小写,后面每个单词首字母大写
sayHello queryName
变量的名:首字母小写,后面每个单词首字母大写
常量的名:所有的字母全部大写
MAX_AGE
关键字
关键字:java提前定义好的,具有特殊含义的小写单词
2.常量
1. 概述: 在代码运行的过程中,值不会发生改变的数据,叫常量
2. 分类:
整数常量: 所有的整数
小数常量: 所有带小数点的 2.5 2.0
字符常量: 带单引号的 '' 单引号中必须有且只能有一个内容
'a' 算
'A' 算
'中' 算
'' 不算
'11' 不算
' ' 算
' ' 不算
字符串常量: 带双引号的 "" 双引号中随意
"" 算
"柳岩" 算
"翠儿" 算
"涛" 算
" " 算
布尔常量 :true false -> 都是用在判断上
空常量: null 代表的是数据不存在 不能直接使用,也不能直接被打印
输出二进制数据 0B开头
输出八进制数据 0开头
输出十六进制数据0X开头
Day02.[变量 数据类型转换 运算符 ]
第一章.变量
数据类型 | 关键字 | 内存占用 | 取值范围 |
字节型 | byte | 1个字节 | -128 至 127 定义byte变量时超出范围,废了 |
短整型 | short | 2个字节 | -32768 至 32767 |
整型 | int(默认) | 4个字节 | -2^31^ 至 2^31^-1 正负21个亿 |
长整型 | long | 8个字节 | -2^63^ 至 2^63^-1 19位数字 |
单精度浮点数 | float | 4个字节 | 1.4013E-45 至 3.4028E+38 |
双精度浮点数 | double(默认) | 8个字节 | 4.9E-324 至 1.7977E+308 |
字符型 | char(无符号类型) | 2个字节 | 0 至 2^16^-1 |
布尔类型 | boolean | 1个字节 | true,false |
1.概述:在代码的运行过程中,值会发生改变的数据,叫变量
2.作用:一次可以存储一个数据
3.定义:(三要素)
a.数据类型 变量名 = 值;
b.数据类型 变量名;
变量名 = 值
4.数据类型:基本数据类型和引用数据类型
基本数据类型:4类8种
整型: byte short int long
浮点型:float double
字符型:char
布尔型:boolean
引用数据类型:
类 数组 接口 注解 枚举
d.在变量中,String不属于基本类型,String本身是一个类,所以属于引用类型,但是定义和基本类型一样
String 变量名 = ""
6.变量类型按照取值范围从小到大排序
byte short char -> int -> long -> float -> double
取值范围大的叫大类型(相对的)
取值范围小的叫小类型(相对的)
/*
long
由于我们直接写一个整数,默认类型为int
所以我们定义long型时,数后面习惯加一个L
*/
long num4 = 10000L;
System.out.println(num4);
/*
float
由于我们直接写一个小数,默认类型为double型
所以我们定义float型变量时,习惯上给小数后面加F
*/
float num5 = 2.5F;
num5 = 3.5F;
System.out.println(num5);
// 转义字符 \
\n 代表的是换行
System.out.print("床前明月光");
System.out.print("\n");
\t 制表符 相当于tab键
System.out.println("hah"+'\t'+"haha");
用char类型表示一个'
char c = '\'';
System.out.println(c);
在java中,如何去表示一个路径
\\ 代表 \ 将后面的\转义成了普通的\
原码 反码 补码
计算机在存储数据的时候都是存储的数据的补码,而计算的也是数据的补码
1.正数二进制最高位为0;负数二进制最高位是1
2.正数:
原码,反码,补码一致
如:5的源码,反码,补码为:
0000 0101->二进制最高位是0,因为是正数
3.负数:
反码是原码的基础上最高位不变,其他的0和1互变
补码是在反码的基础上+1
如:-9
原码:0000 1001
反码:1111 0110
补码:1111 0111
第二章.数据类型转换
1.什么时候发生数据类型转换?
当等号左右两边类型不一致时
2.类型转换有哪些方面:
自动类型转换:将小类型自动提升为大类型
强制类型转换:将大类型强制转成小类型
3.按照取值范围从小到大排列数据类型
byte short char -> int-->long->float->double
声明变量时:大类型可以直接赋值给小类型,小类型不可以直接赋值给大类型。
1.自动类型转换
1.什么时候发生:
取值范围大的数据类型 变量名 = 取值范围小的数据类型 -> 小类型会自动提升为大类型
2.取值范围小的类型遇到取值范围大的类型,也会自动类型转换,小类型会自动提升为大类型
2.强制类型转换
1.什么时候需要强制类型转换
取值范围小的数据类型 变量名 = 取值范围大的数据类型 -> 会报错
2.怎么强转:
取值范围小的数据类型 变量名 = (取值范围小的数据类型)取值范围大的数据类型
public class Demo08DataType{
public static void main(String[] args){
/*
2.5默认类型为double型
num1是int型
将double型赋值给了int型->将取值范围大的类型赋值给了取值范围小的类型->报错需要强转
*/
//int num1 = 2.2;
int num1 = (int)2.9;
System.out.println(num1);
}
}
强转的注意事项
1.强转容易出现精度损失,数据溢出现象
2.byte short如果等号右边是整数常量,没有超出byte,short的取值范围,不用强转(jvm优化)
byte short如果等号右边有变量参与,结果再赋值给byte,short型的变量,此时,byte short会自动提升为int
需要手动强转
3.char类型如果参与运算,自动提升为int型
char类型一旦被提升为int型,就会自动去码表中查询字符对应的int值-->ASCII码表
a--97
z--122
A--65
Z--90
0--48
9--57
如果在ASCII码表中找不到字符对应的int值,会自动去unicode码表(万国码)
第三章.运算符
+(加法)
-(减法)
*(乘法)
/(除法)
%(模->取余)
负数取余数,以前面的符号为准
(-5%3)=-2 (5%-3)=2
+
作用1:运算符号
作用2:字符串拼接 -> 任何类型遇到字符串都会变成字符串 直接往后拼
++ --
1.只能和变量一起使用 i++ ++i
2.使用:
单独使用:自增自减自己独立成为一句
i++;
符号在前在后都是先运算,再使用运算后的值
混合使用:自增自减和其他语句混合使用了(赋值语句,输出语句)
a.符号在前: 先运算,然后再使用运算后的值
b.符号在后: 先用原来的值,使用完毕自身再计算
基本赋值运算符
= : 将等号右边的数据赋值给等号左边的变量
复合赋值运算符
+=:
int i = 10;
i+=1 -> i = i+1
-=
*=
/= : 如果是两个整数,取整数部分,如果有一个为小数,结果就带小数点
%= : 取余数
int i = 10;
i%=3 -> i = i%3
注意:byte short 如果是复合赋值运算,不需要手动强转(jvm自动转了)
关系运算符(比较运算符)
1.作用:专门用于比较条件,结果都是boolean型
2.分类
== > < >= <= !=
逻辑运算符
1.作用: 连接关系运算符 结果为boolean型
2.都有啥:
&&(与):有假则假 符号前后有一个结果为false,结果就是false
||(或):有真则真 符号前后有一个结果为true,结果就是true
^(异或):符号前后结果相同为false,结果不同为true
false^false false
true^true false
false^true true
true^false true
!(非):非true就是false 非false就是true
|:如果符号前后为比较运算符,这个符号就是逻辑元素符,有真则真
如果符号前后为数字,这个符号是位运算符
||(短路或):有真则真,如果符号前面为true,后面不看了
需求:定义一个变量x,随意给值,判断x是否在1-100之间
1<=x<=100 数学写法
x>=1 && x<=100 java正确写法
三元运算符
1.格式
boolean表达式?表达式1:表达式2
2.执行流程
先走boolean表达式,如果是true,走?后面的表达式1,否则走:后面的表达式2
左移:<<
2<<2 等于8
相当于:2*(2的2次方)
右移:>>
无符号右移:>>>
运算规则:往右移动后,左边空出来的位直接补0,不管最高位是0还是1空出来的都拿0补
按位与:&
按位或:|
按位异或:^
按位取反:~
运算规则:~0就是1
~1就是0
Day03.[流程控制]
第一章.IDEA的使用
破解
新建 工程 Project(empty project)-- 模块 Module--src下新建包Package--包名 com.atguigu.名字 --新建class类
里面放的都是java文件
工程 Project下 有out文件 里面放class文件
out路径是专门存放idea自动编译生成的.class文件的
1.快捷键
快捷键 | 功能 |
Alt+Enter | 导入包,自动修正代码(重中之重) |
Ctrl+Y | 删除光标所在行 |
Ctrl+D | 复制光标所在行的内容,插入光标位置下面 |
Ctrl+Alt+L | 格式化代码 |
Ctrl+/ | 单行注释 |
Ctrl+Shift+/ | 选中代码注释,多行注释,再按取消注释 |
Alt+Shift+上下箭头 | 移动当前代码行 |
第二章.键盘录入_Scanner
1.概述:Java自带的一个类
2.作用:通过键盘录入的形式,将数据放到程序中参与运行
3.怎么使用:
a.导包: import java.util.Scanner -> 为了找到我们要用得Scanner
b.创建对象: Scanner 名字 = new Scanner(System.in)
c.调用方法,真正实现键盘录入: 名字.方法名()
nextInt()->键盘录入一个整数(int)
nextDouble() -> 键盘录入一个小数(double)
next()->键盘录入字符串
Scanner 中的next()和nextLine()区别:
next() 遇到空格就结束了
nextLine()遇到回车才结束录入
第三章.switch(选择语句)
1.switch基本使用
1.格式:
switch(变量){
case 目标值1:
执行语句1;
break;
case 目标值2:
执行语句2;
break;
case 目标值3:
执行语句3;
break;
...
default:
执行语句n;
break;
}
2.switch中能写什么类型的数据:
byte short int char 枚举类型(jdk5是新增),String类型(jdk7新增)
2.case的穿透性
1.什么时候会发生case的穿透性:
switch中没有break时
2.如果没有break,case会一直往下穿透执行,直到遇到了break或者switch代码结束了
3.default放在哪里都是最后一个比较。
第四章.分支语句
1.格式:
if(boolean表达式){
执行语句1
}else if(boolean表达式){
执行语句2
}else if(boolean表达式){
执行语句3
}...else{
执行语句n
}
Day04.循环_数组
第一章.循环语句
1.for循环
1.格式:
for(初始化变量;比较;步进表达式){
循环语句
}
2.while循环
1.格式:
初始化变量
while(比较){
循环语句
步进表达式
}
3.do……while循环
1.格式
初始化变量;
do{
循环语句
步进表达式
}while(比较);
2.特点:
至少循环一次
4.循环的区别
1.for循环:在for循环中的初始化变量,外面使用不了,随着for循环的结束而失去作用
2.while:初始化的变量不会随着循环的结束而失去作用
3.do...while:初始化的变量不会随着循环的结束而失去作用,至少执行一次
4.确定次数推荐用for,不确定次数推荐用while
5循环控制关键字
(1).break
a.在switch中,代表结束switch语句
b.在循环中,直接结束循环
(2).continue
a.结束本次循环,进行下一次循环
第三章.Random随机数
1.概述:Random也是Java提前定义好的类
2.作用:可以在指定的范围内随机一个数
3.使用:
a.导包:import java.util.Random
b.创建对象: Random 对象名 = new Random()
c.调用方法: 对象名.方法名
nextInt():在int的取值范围内随机一个数
nextDouble():在0.0到1.0之间随机一个小数
4.在指定范围内随机一个数
nextInt(int n) : 从0-(n-1)之间随机一个数
nextInt(10) : 在0-9之间随机一个数
nextInt(100): zai 0-99之间随机一个数
第四章.数组的介绍以及定义
3.特点:
a.数组可以存储基本数据类型,还可以存储引用数据类型
b.定长(数组定义的时候规定多长,后续不能改变)
3.定义:
动态初始化:
a.数据类型[] 数组名 = new 数据类型[数组的长度]->推荐
int [] x =new int [3]
c.动态初始化每一部分是啥意思:
数据类型:规定数组中能存什么类型的数据
[]:代表的是数组,一维数组
数组名:见名知意
new:代表的是将数组创建出来
数据类型:要和等号前面的数据类型保持一致
[数组的长度]:数组的最大容量,规定数组最多能存多少个数据
静态初始化:
简化形式: 数据类型[] 数组名 = {元素1,元素2,元素3...}->推荐
4.动态初始化和静态初始化的区别:
动态初始化:创建的时候只给了长度,但是没有往里面存我们想要存的元素
静态初始化:创建的时候就直接往里存了我们想要存的元素,根据存的元素个数可以推算出来数组的长度
5.动态初始化和静态初始化的使用时机:看时机
动态初始化:当我们定义的时候只知道元素的类型和个数,但是不知道要存什么元素
静态初始化:当我们定义的时候已经知道了存什么元素了,就可以用静态初始化了
第五章.操作数组
1.获取数组的长度
格式:
数组名.length
2.length不是方法,只是数组的一个属性,仅此而已
3..格式:
数组名[索引值] = 元素值 -> 将等号右边的元素中,存储到等号左边数组指定的索引位置上
比如: arr[0] = 100 ->将100存储到了数组arr的0索引上
4.获取元素
格式:
数组名[索引值]
注意:
如果我们数组中没有存储我们想要存储的元素,数组中的元素就都是默认值
数组中的元素是有默认值的
整数 : 0
小数 : 0.0
字符 : '\u0000'
布尔 : false
引用 : null
第六章.操作数组时两个常见的问题
1.数组索引越界异常-> ArrayIndexOutOfBoundsException
出现的原因:
操作的索引超出了数组的索引范围
2.空指针异常-> NullPointerException
出现的原因:
当一个引用类型的数据为null,然后还在继续操作
Day05.二维数组,方法
1.1二维数组的定义格式
1.概述:数组中套着多个一维数组
2.定义:
动态初始化:
数据类型[][] 数组名 = new 数据类型[m][n];--> 推荐
数据类型 数组名[][] = new 数据类型[m][n];-->不推荐
数据类型[] 数组名[] = new 数据类型[m][n];-->不推荐
m:代表的是二维数组的长度(二维数组中最多能有多少个一维数组)
n:代表的是每一个一维数组的长度
int[][] arr2 = new int[3][]; //代表每一个一维数组没有真正创建出来 所以每一个一维数组都是null
静态初始化:
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}}
简化:数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}}
1.2方法的使用
1.方法的概述:方法就是功能,将来开发一个功能就需要定义一个方法
2.好处:好处大大的(可维护性高,复用性高)
3.方法的定义(通用的格式)
修饰符 返回值类型 方法名(参数列表){
方法体;
return 结果;
}
无参无返回值方法->最简单
有参无返回值方法
无参有返回值方法
有参有返回值方法
4.无参无返回值方法定义格式:
public static void 方法名(){
方法体
}
调用方式:在其他方法中:方法名();
5.注意:
a.void代表没有返回值,有了void 方法体中不用写return 结果
b.方法之间是平级关系,不能互相嵌套
c.方法不调用不执行的
d.方法的执行顺序只和调用顺序有关
e.main方法是jvm自动调用
1.3形式参数和实际参数区别
形式参数(形参):在定义方法的时候形式上定义的参数,没有给具体值
实际参数(实参):在调用方法的时候给参数赋予的具体的值
Day06.方法的重载_面向对象
第一章.方法的重载
1.概述:
方法名相同,参数列表不同的方法
2.什么是参数列表不同呢?
a.参数个数不同
b.参数的数据类型不同
c.参数数据类型的位置不同
3.判断两个方法是否为重载方法,不用看哪里(和什么无关)
a.和参数名字无关
b.和返回值类型无关