Day1—配置环境变量
jvm、jre和jdk
三者是包含关系
jvm是Java虚拟机,java程序都是在这上面执行的,也是java跨平台的关键
jre是java运行时环境,jre包含了jvm,因此他可以运行class文件,自身包含了class文件运行的必要库
jdk是java开发工具包,包括了java的开发工具和编译工具,也包含了jre
环境变量
配置环境变量path的目的是为了让程序可以跨文件夹执行,这一点在window系统上无法体现,但在服务器的Linux系统上配置环境变量就变得方便了许多
idea配置
idea开发工具安装完成后需要在设置中修改三处,目的是为了规范开发
- text file encoding全部改成utf-8
- 设置 IDE的换行符号是unix 而不是windows
- 设置禁止使用制表符tab,如果要使用则用4个空格代替tab
java工程文件创建
java工程文件的层级是
- 工程Project
- 模块/项目Module
- 软件包Package,命名一般是公司域名反写.项目名.包名,要求一律小写
- java类Class,书写各种方法代码的地方,命名规范首字母大写
- 软件包Package,命名一般是公司域名反写.项目名.包名,要求一律小写
- 模块/项目Module
idea代码简写
psvm
,等价于public static void main(String[] args) {}
sout
,等价于System.out.println()
,如果是变量后面加,自动输出变量,即a.sout
等价于System.out.println(a)
fori
,等价于 for (int i = 0; i < ; i++) {}
,在数组后面加.for
或.fori
可以自动遍历数组,即nums.for
等价于for (int i : nums){}
,nums.fori
等价于for (int i = 0; i < nums.length; i++){}
.var
,在new
对象后或者方法后加会自动补全变量名和变量类型,比如new Scanner().var
等价于Scanner scanner =new Scanner()
,scanner.nextInt().var
等价于int i = scanner.nextInt()
Day2—数据类型和运算符
基础数据类型
Java的数据类型和JavaScript不同,前者是强数据类型语言,后者是弱数据类型语言
数据类型 | 关键字 | 内存占用 | 取值范围 | 备注 |
---|---|---|---|---|
字节型 | byte | 1个字节 | -128到127 | |
短整型 | short | 2个字节 | -32768到32767 | |
整形(默认) | int | 4个字节 | $-2^{31} 到2^{31} -1$ | |
长整型 | long | 8个字节 | $-2^{63} 到2^{63} -1$ | 数字结尾需要加L |
单精度浮点型 | float | 4个字节 | 1.4013E-45到3.4028E+38 | 数字结尾需要加F |
双精度浮点型(默认) | double | 8个字节 | 4.9E-324到1.7977E+308 | |
字符型 | char | 2个字节 | 0到$2^{16} -1$ | |
布尔型 | boolean | 1个字节 | true,false |
具体可分为整形、浮点型、字符型和布尔型,其中整数默认是整型,小数默认是双精度
之所以整形要分多个类型是因为取值范围不同所占的内存大小也不同,需要根据具体情况选择数据类型声明
Java的数据类型最高位是符号位,0为正1为负
数据类型转换
隐式转换
当取值范围小的数据类型转到取值范围大的数据类型的时候会自动进行数据类型转换,类型转换的顺序为byte->short->int->long->float->long
需要注意的是byte
、short
、char
都会先隐式转为int
然后再进行计算
强制类型转换
当内存占用大的数据类型转到内存占用小的数据类型就需要强制转换
格式为int n = (int)3.14
这种强制类型转换是直接裁掉多余的比特位,因此双精度浮点数转到整形会直接舍弃小数部分只保留整数部分
控制台输入输出
输出
System.out.printIn("Hello World")
是控制台输出语句
System.out.printf("%s World","Hello")
,其中%s
是占位符,在输出时会使用后面的字符串代替前面的占位符
输入
Java输入需要先创建一个Scanner
对象,Scanner scanner = new Scanner(System.in)
然后定义一个变量接受控制台输入的数值即可,int age = scanner.nextInt()
接受的是整型,String name = scanner.next()
接受的是字符串,在遇到空格和回车的时候结束录入,String name = scanner.nextLine()
,接受的也是字符串,但是只在遇到回车时结束录入,nextLine()
和next()
混用会导致回车保留然后被nextLine()
读取
位运算符
按位与&
,按照比特位比较,对应位都为1则结果为1,
按位或|
,对应位只要有一个是1则结果是1
按位异或^
,对应位相同则为0,不同则为1
按位取反~
,原来是1则为0
算数左移<<
,数据补码存储,符号位一起移动,低位补0,高位舍弃,相当于整体乘2向下取整
算数右移>>
,数据补码存储,符号位一起移动,负数高位补1,正数高位补0,低位舍弃,相当于整体除2向下取整
无符号右移>>>
,数据补码存储,符号位一起移动,无论正负高位补0,低位舍弃
Day3—流程控制
随机数
和JavaScript不太一样,java中的随机数Random
和Scanner
用法差不多
使用Random random = new Random()
来定义一个随机数变量,然后用random.nextInt(n)
来获得0~n-1的随机数
Switch
java中的分支选择语句可以匹配多种数据类型
比如byte
、short
、int
、char
、枚举类型
、String类型
在JDK12之后出现了增强体switch,格式是
switch(变量){
case 1 -> {语句}
case 2 -> {语句}
case 3 -> {语句}
default -> {语句}
}
这种写法不需要写break也不会出现穿透,而且如果case后面语句只有一条连大括号也可以省略
day4—数组
数组的定义
动态
格式为数据类型[] 数组名 = new 数据类型[长度]
静态
格式为数据类型[] 数组名 = new 数据类型[]{元素1,元素2...}
,有多少元素长度就是多少
静态简写
格式为数据类型[] 数组名 = {元素1,元素2...}
,有多少元素长度就是多少
数组常见异常
下标越界
ArrayIndexOutOfBoundsException
,数组下标超出范围
空指针异常
NullPointerException
,数组也是一种引用数据类型,当给数组直接赋值为null时仍进行操作就会报错
数组输出
Java数组无法像JS那样直接输出,需要自己写循环遍历输出每个数组的值,究其原因是因为数组类在继承的时候没有重写Object类中的toString方法
但是Java中提供了数组工具类,其中就有输出数组的方法,使用方法为Arrays.toString(数组名)
Day5—方法(函数)
函数也叫做方法,作用是减少代码冗余,提高复用,语法和JavaScript稍有不同
方法定义格式
修饰符 返回值类型 方法名(参数列表){
方法体;
[return 返回值]
}
方法重载
两个方法名字相同的情况下会报错,但是当方法名相同参数不同时则为方法重载
这里参数不同指的是,参数类型、参数顺序和参数数量,和参数名字无关
和返回值类型也无关
public static void printLine()
和public static void printLine(int size)
就是重载,而public static void printLine(int size)
和public static void printLine(int b)
不是方法重载
方法重载后,当调用方法时会自动根据参数匹配相应的方法
快速将代码抽取封装成方法
在idea中选中想要抽取成方法的代码,按ctrl+alt+m
可以自动抽取方法,并且可以自动匹配同类代码替换成调用模式