part1
一、JDK安装
- JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
-
二、环境变量配置
打开系统环境变量设置,在系统变量里配置JAVA_HOME变量,变量值为JDK中bin文件的安装目录。
-
三、检查是否安装成功
-
Part2
一、第一个java程序
打开文件名拓展
打开一个记事本,编写第一个Java程序:
public class HelloWorld{public static void main(String[] args){System.out.println("HelloWorld!");}}
保存为HelloWorld.java
- 使用cmd命令行进入这个文件所在目录,假如保存在D:/javacode中,d:→cd javacode
- 编译java文件:javac HelloWorld.java,产生HelloWorld.class文件
运行字节码文件:java HelloWorld(java后的是类名,不是字节码文件名,也不是源文件名)
二、Java源文件命名规则
Java大小写敏感,要区分大小写
- 一个java文件中最多只能有一个public类,如果文件里有public类,则源文件名与public类名要一致
- 源文件扩展名必须为.java
程序编译后,一个类生成一个class字节码文件,为了提高可读性,通常建议一个java源文件中只定义一个类,不同的类使用不同的源文件定义
三、常用DOS命令
cd 进入一个目录
- cd .. 进入父目录
- dir 查看本目录下的文件
- cls 清除屏幕命令
- 上下键 查找敲过的命令
-
四、注释
单行注释://
- 多行注释:/ 内容 /,多行注释不能嵌套
文档注释:/* 内容 /
/***类说明*@author 孙*@version 1.0*/
五、标识符命名规范
大小写敏感,只能字母(包括汉字)、下划线、美元符$开头
- 类名:每个单词的首字母大写,GoodMan
- 方法和变量:“驼峰原则”,第一个单词小写,第二个单词开始首字母大写,eatFood()
java采用Unicode字符集,汉字和英文字母一样是普通字符
六、Java修饰符
Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:
访问控制修饰符 : default, public , protected, private
- 非访问控制修饰符 : final, abstract, static, synchronized
七、Java关键字
| 类别 | 关键字 | 说明 | | —- | —- | —- | |
访问控制 | private | 私有的 | | | protected | 受保护的 | | | public | 公共的 | | | default | 默认 | | 类、方法和变量修饰符 | abstract | 声明抽象 | | | class | 类 | | | extends | 扩充,继承 | | | final | 最终值,不可改变的 | | | implements | 实现(接口) | | | interface | 接口 | | | native | 本地,原生方法(非 Java 实现) | | | new | 新,创建 | | | static | 静态 | | | strictfp | 严格,精准 | | | synchronized | 线程,同步 | | | transient | 短暂 | | | volatile | 易失 | | 程序控制语句 | break | 跳出循环 | | | case | 定义一个值以供 switch 选择 | | | continue | 继续 | | | default | 默认 | | | do | 运行 | | | else | 否则 | | | for | 循环 | | | if | 如果 | | | instanceof | 实例 | | | return | 返回 | | | switch | 根据值选择执行 | | | while | 循环 | | 错误处理 | assert | 断言表达式是否为真 | | | catch | 捕捉异常 | | | finally | 有没有异常都执行 | | | throw | 抛出一个异常对象 | | | throws | 声明一个异常可能被抛出 | | | try | 捕获异常 | | 包相关 | import | 引入 | | | package | 包 | | 基本类型 | boolean | 布尔型 | | | byte | 字节型 | | | char | 字符型 | | | double | 双精度浮点 | | | float | 单精度浮点 | | | int | 整型 | | | long | 长整型 | | | short | 短整型 | | 变量引用 | super | 父类,超类 | | | this | 本类 | | | void | 无返回值 | | 保留关键字 | goto | 是关键字,但不能使用 | | | const | 是关键字,但不能使用 | | | null | 空 |
part3
一、变量分类和作用域
注:java变量必须初始化后才能使用,否则会报错。
| 类型 | 声明位置 | 从属于 | 生命周期(作用域) |
|---|---|---|---|
| 局部变量 | 方法或语句块内部 | 方法或语句块 | 从声明位置开始,直到方法或语句块执行结束 |
| 成员变量 (实例变量) |
类内部,方法外部 | 对象 | 对象创建,成员变量也跟着创建,对象消失,成员变量也跟着消失 |
| 静态变量 (类变量) |
类内部,static修饰 | 类 | 类被加载,静态变量就存在;类被卸载,静态变量就消失 |
public class Test{int year = 2021;//成员变量static int month = 7;//类变量public static void main(String[] args){int age = 23;//局部变量,属于main方法System.out.println(age);}}
二、常量和final
public class Test{public static void main(String[] args){final double PI = 3.1415926;//赋值后就不能再改变//PI = 3; //报错,常量只能初始化一次System.out.println(PI);}}//用final修饰的PI为符号常量,而3、3.1415926、a这种为字符常量
三、数据类型
java是强类型的语言,每个变量必须声明其数据类型。数据类型可分为两大类:基本数据类型和引用数据类型。
注:引用类型都是占用4个字节,记录的是引用对象的地址。
1.整型变量
public class Test{public static void main(String[] args){byte f = 100;//byte范围为-128~127int a = 10;//十进制int b = 05;//八进制int c = 0x15;//十六进制int d = 0B15;//二进制System.out.println(PI);}}
java语言的整型常数默认为int型,有如下两种特殊情况:
- 如果直接将一个较小的整数值(在byte、short类型的表示范围内)赋给byte或short变量,系统会自动把这个整数值当作byte或short类型处理。
如果使用一个巨大的整数值(超过int表示范围),java不会自动把这个数值当作long类型处理,声明long型常量可以在数值后加l或L。
long a = 5555555;//编译成功,在int范围内(21亿)//long b = 555555555555;//不加L编译错误,超过int表示的范围long b = 555555555555L;//正确
2.浮点型
浮点型数据都是有误差的,float的精确到小数点后7位,一般常用double类型。
- 浮点数值默认为douuble类型,声明float类型需加后在f或F,不能直接赋值给float类型,否则会报错。
- float、double类型不适合使用在不允许舍入误差的金融领域,如果需要不舍入误差的数值计算,需要使用BigDecimal类。
浮点数是不精确的,尽量不要直接进行比较。
float f = 3.14f;//float f = 3.14;//报错double d1 = 3.14;//小数类型赋值double d2 = 3.14e2;//科学计数法赋值float d3 = 0.1f;double = 1.0/10;System.out.println(d3 == d4);//结果为false
3.字符型
java用char表示Unicode字符集中的字符,占2个字符,可以表示65536个字符,字符编码’\u0000’~’\uFFFF’。
char a = 'a';char b = '中';char c = '\u0061';//a的Unicode字符编码
转义字符 | \b | 退格 | | —- | —- | | \n | 换行 | | \r | 回车 | | \t | 制表符tab | | \“ | 双引号 | | \‘ | 单引号 | | \\ | 反斜杠 |
4.boolean类型
boolean类型只有两个值,flase和true,不能使用0和非0来代表,和c语言不同。占用1个或4个字节,一般是4个字节,在数组中为1个字节。
boolean flag = true;if(flag){true分支}else{flase分支}//不要这样写:if(flag = true),新手才这样写,老鸟的写法是if(flag)或if(!flag)。
5.数值中使用下划线分隔
Java7中引入了一个新功能:可以在整型数值和浮点数类型中自由使用下划线,更直观地分辨数字的位数。
long a = 0B1000_0000_0000_0000;double pi = 3.14_15_92_65_36;
6.使用var定义局部变量
为了简化局部变量的声明,Java10开始支持使用var定义局部变量:var相当于一个动态类型,使用var定义的局部变量的类型由编译器自动推断,定义变量时分配了什么类型的初始值,则该变量就是什么类型。使用var定义的变量不仅可以是基本类型,也可以是字符串等引用类型。
注:Java中的var和Javascript中的var截然不同,Javascript本质上是弱类型语言,使用var定义的变量无明确类型;而java是强类型语言,使用var定义的变量仍然有明确的类型。因此,在使用var定义局部变量时,必须在定义变量的同时指定初始值,否则编译器无法推断该变量的类型。var a = 20;//a的类型是intvar b = 3.14;//b的类型是doublevar d;//错误,无法推断d的类型var s = "hello";//s的类型是String
通常来说,如果局部变量的初始值类型很容易确定,此时可以使用var定义局部变量。对于以下两种情况应避免使用var定义:
变量的类型不易判断 ——比如变量的初始值是经过复杂的方法调用得到的。
局部变量的使用范围很大,随着使用范围的扩大,后面的代码就更难判断该变量的类型了。
四、运算符

注:“+”字符串连接符,只要“+”两侧的操作数有一个是字符串类型(String类),系统会将另外一个操作数转换成字符串类型后进行连接。String a = "3";int b = 4;System.out.println(a+b);//结果为字符串"34",不是数值7char c1 = 'a';char c2 = 'b';System.out.println(c1+c2);//结果为数值,char类型本质是数值运算System.out.println(""+c1+c2);//小技巧,通过加一个空字符串快速将运算变为字符串连接
五、数据类型的转化
1.自动类型转化

自动类型转化是指容量小的类型可以自动转化为容量大的类型。实线表示无数据丢失的自动转化,虚线表示转化时可能有精度的损失。
整型常量默认为int类型,可以直接赋值给byte、short、char,无需类型转化,只需不超过其表数范围即可。int a = 2345;long b = a;int c = b;//报错,long型不能转化为int型byte d = 100;byte e = 12345;//报错,超过了byte的范围
2.强制类型转化
语法:(type)value,可以将大容量变量类型转化为小容量变量类型,但往往会溢出,造成数据丢失。
double a = 3.14;int b = (int) a;//b的值为3,浮点数强制转化为整数,丢失小数部分(不会四舍五入)
3.表达式类型的自动提升
当一个算术表达式中包含多个基本类型的值时,整个表达式的数据类型会自动提升。
所有的byte类型、short类型、char类型都将提升为int类型。
- 整个表达式的数据类型自动提升到与表达式中最高等级操作数相同的类型。

byte a = 5;short b = 3;b = a + b;//错误,表达式类型自动提升到int,则右边表达式的类型为int,将int类型赋值给short类型出错
4.类型转化时常见错误和问题
- 操作比较大的数时,要留意是否会溢出,尤其是整数时。 ```java int money = 10_0000_0000;//10亿 int years = 20; int total = money * years;//错误,返回的值为负数,值溢出了
//方法1:错误,因为money years后还是int型,已经溢出了,再把这个值赋给long变量仍为负数 long total = money years; //方法2:先把其中一个操作数转化为long型 long total = money ((long)years);//整个表达式的类型会自动提升为long型 //方法3 long total = 1L money * years;
- long类型后缀加大写L,小写l容易和1搞混。float类型后缀加F。```java//计算人一生的心跳次数long num = 100 * 60 * 24 * 365 * 80;//溢出,值为负long num = 100L * 60 * 24 * 365 * 80;//正确
六、使用Scanner类获取输入
import java.util.Scanner;public class HelloWorld {public static void main(String[] args) {Scanner s = new Scanner(System.in);int a = s.nextInt();//获取整数输入float b = s.nextFloat();//获取浮点数输入String a = s.nextLine();//读取字符串s.close();//scanner用完之后要关闭,不然会浪费系统资源}}
/* 在读取了整数后,接着读取字符串:如果在通过nextInt()读取了整数后,再接着读取字符串,读出来的是回车换行:"\r\n",因为nextInt仅仅读取数字信息,而不会读取回车换行"\r\n".所以,如果在业务上需要读取了整数后,接着读取字符串,那么就应该连续执行两次nextLine(),第一次是取走回车换行,第二次才是读取真正的字符串*/import java.util.Scanner;public class HelloWorld {public static void main(String[] args) {Scanner s = new Scanner(System.in);int i = s.nextInt();System.out.println("读取的整数是"+ i);String rn = s.nextLine();//用来读取换行回车"\r\n"String a = s.nextLine();System.out.println("读取的字符串是:"+a);s.close();}}
