一、概述
-
JAVA语言是美国Sun公司(Stanford University Network)在1995年推出的高级变成语言。
-
2009年Oracle甲骨文公司收购Sun公司,并于2011年发布Java7版本
-
DOS命令
Win+R,cmd //启动dos > D: //切换盘符 > cd \目录\ //切换目录 > cd .. //返回上一级目录 > dir //查看当前文件夹内容 > cls //清屏 > exit //退出
二、开发环境搭建
1. Java虚拟机——JVM
- JVM (Java Virtual Machine)
- 是运行所有java程序的假想计算机,是java程序的运行环境
- 跨平台特性
2. JRE和JDK
- JRE (Java Runtime Environment):是Java程序运行时的环境,包含JVM和运行时所需要的核心类库
- JDK (Java Development Kit):是Java程序开发工具包,包含JRE和开发人员使用的工具
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9PZ2HJAk-1678240645854)(C:\Users\LQN\AppData\Roaming\Typora\typora-user-images\image-20230301175104134.png)]
三、HelloWorld入门程序
- Java程序开发三步骤:编写、编译、运行
- javac.exe:编译器
- java.exe:解释器
javac HelloWorld.java -> HelloWorld.class
java HelloWorld
- 步骤:
- 编写.java源程序
- 编译源程序成.class的java字节码文件
- JVM运行
- 源代码编写
//第一行的类名必须和所在的文件名称完全一致
//public class 后面代表定义一个类的名称,类是Java当中所有源代码的基本组织单位
public class HelloWorld{
//第二行内容是万年不变的固定写法,代表main方法,是程序执行的起点
public static void main(String[] args){
System.out.println("Hello,World!"); //打印输出语句
}
}
- 注释
//单行注释
/*
多行注释
*/
-
关键字
keywords
完全小写的字母
-
标识符
类的名字、方法的名字、变量的名字
命名规则:- 可以包含英文字母(区分大小写)、0-9数字、$(美元符号)、_(下划线)
- 不能以数字开头
- 不能是关键字
命名规范:
- 类名:首字母大写,后面每个单词首字母大写(大驼峰式)
- 变量名:首字母小写,后面每个单词首字母大写(小驼峰式)
- 方法名:同变量名
四、常量
- 常量:在程序运行期间,固定不变的量
- 字符串常量:用双引号引起来的部分
- 整数常量
- 浮点数常量
- 字符常量:用单引号引起来的单个字符
- 布尔常量:true、false
- 空常量:null
public class Const01{
public static void main(String[] args){
System.out.println("ABC"); //字符串常量
System.out.println("");
System.out.println(20); //整数常量
System.out.println(-30);
System.out.println(3.14); //浮点数常量
System.out.println(-2.5);
System.out.println('A'); //字符常量
System.out.println('5');
System.out.println(''); //报错!两个单引号中间必须有且仅有一个字符,不能没有
System.out.println(true); //布尔常量
System.out.println(flase);
System.out.println(null); //报错!空常量不能直接打印输出
}
}
五、数据类型
- Java的数据类型分类:
- 基本数据类型:整数、浮点数、字符、布尔
- 引用数据类型:字符串、类、数组、接口、Lambd
数据类型 | 关键字 | 内存占用 |
---|---|---|
字节型 | byte | 1个字节 |
短整型 | short | 2个字节 |
整型 | int | 4个字节 |
长整型 | long | 8个字节 |
单精度浮点数 | float | 4个字节 |
双精度浮点数 | double | 8个字节 |
字符型 | char | 2个字节 |
布尔类型 | boolean | 1个字节 |
- 默认类型:整数(int)、浮点(double)
- 字符串不是基本类型,而是引用类型
六、变量
- 程序运行期间,内容可以发生改变的量
- 数据类型 变量名 = 数据值;
public class Variable {
public static void main(String[] args){
byte b = 100;
short s = 1000;
int i = 123456;
long l = 12345678900L;
double d = 8.5;
boolean bool = false;
float f = 5.5F;
char c = 'A';
System.out.println(b);
}
}
七、数据类型转换
-
自动转换:将取值范围小的类型自动提升为 取值范围大的类型
范围小的类型向范围大的类型提升, byte、short、char 运算时直接提升为 int 。
byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double
-
强制转换:将 取值范围大的类型 强制转换成 取值范围小的类型
数据类型 变量名 = (数据类型)被转数据值;
-
浮点转成整数,直接取消小数点,可能造成数据损失精度
-
int 强制转成 short 砍掉2个字节,可能造成数据丢失
-
boolean类型不能发生数据类型转换
-
对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char)
- 如果没有超过左侧的范围,编译器补上强转
- 如果右侧超过了左侧范围,纳闷直接编译器报错
-
在给变量进行赋值的时候,如果左侧的表达式当中全都是常量,没有任何变量,那么编译器javac将会直接将若干个常量表达式计算得到的结果。
short result = 5 + 8; //等号右边全都是常量,没有任何变量参与运算
编译之后,得到的.class字节码文件当中相当于直接就是:
short result = 13;
右侧的常量结果数值,没有超过左侧范围,所以正确。
这称为“编译器的常量优化”。
当时一旦表达式当中有变量参与,就不能进行这种优化了。(会报错) -
s += 1 就是 s = (short)(s + 1)
八、ASCII编码表
( American Standard Code for Information Interchange 美国标准信息交换码)
字符 | 数值 |
---|---|
0 | 48 |
9 | 57 |
A | 65 |
Z | 90 |
a | 97 |
z | 122 |
Unicode码表:万国码
九、运算符
-
算数运算符:+ - * / % ++ –
-
+ 符号在字符串中的操作:
符号在遇到字符串的时候,表示连接、拼接的含义
“a”+"b"的结果是“ab”,连接含义
public class HelloWorld{
public static void main(String[] args){
System.out.println("5+5="+5+5);
//输出5+5=55
}
}
-
任何数据类型和字符串进行连接的时候,结果都会变成字符串
-
赋值运算符:= += -= *= /= %=
-
比较运算符:== >= <= != > <
-
比较运算符,是两个数据之间进行比较的运算,运算结果都是布尔值 true 或者 false
-
逻辑运算符
&& 短路与 1. 两边都是true,结果是true 2. 一边是false,结果是false 短路特点:符号左边是false,右边不再运 || 短路或 1. 两边都是false,结果是false 2. 一边是true,结果是true 短路特点: 符号左边是true,右边不再运算 ! 取反 1. ! true 结果是false 2. ! false结果是true -
逻辑运算符,是用来连接两个布尔类型结果的运算符,运算结果都是布尔值 true 或者 false
-
三元运算符:数据类型 变量名 = 布尔类型表达式?结果1:结果2
十、方法
-
方法:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。
-
方法的定义:
修饰符 返回值类型 方法名 (参数列表){ 方法体 return 返回值; }
- 修饰符: 目前固定写法 public static
- 返回值类型: 目前固定写法 void
- 方法名:为我们定义的方法起名,满足标识符的规范,用来调用方法
- 参数列表: 目前无参数
- return:方法结束。因为返回值类型是void,方法大括号内的return可以不写
public static void methodName() { System.out.println("这是一个方法"); }
-
方法的调用:在主方法main中来调用我们自己定义好的方法
public static void main(String[] args) { //调用定义的方法method method(); } //定义方法,被main方法调用 public static void method() { System.out.println("自己定义的方法,需要被main调用运行"); }
public class HelloWorld { public static void main(String[] args) { System.out.println(sum(5,3)); } public static int sum(int a,int b){ return a+b; } }
-
注意事项:
- 方法必须定义在一类中方法外
- 方法不能定义在另一个方法的里面
-
定义方法:
- 明确返回值类型
- 明确参数列表
-
返回值类型,必须要和 return 语句返回的类型相同,否则编译失败 。
-
方法重载:
(overload)
指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返 回值类型无关。
参数列表:个数不同,数据类型不同,顺序不同。
重载方法调用:JVM通过方法的参数列表,调用不同的方法。
十一、JShell脚本工具
- JShell脚本工具是JDK9的新特性
- 当我们编写的代码非常少的时候,而又不愿意编写类,main方法,也不愿意去编译和运 行,这个时候可以使用JShell工具
C:\Users\LQN>jshell
| 欢迎使用 JShell -- 版本 11.0.8
| 要大致了解该版本, 请键入: /help intro
jshell> System.out.println("Hello,World!");
Hello,World!
jshell> int a = 10
a ==> 10
jshell> int b=20
b ==> 20
jshell> int result=a+b;
result ==> 30
jshell> System.out.println("结果是:"+result);
结果是:30
jshell> int a=3;a=(1>2?1:0);System.out.println(a);
a ==> 3
a ==> 0
0
jshell> /exit
| 再见
C:\Users\LQN>
十二、流程控制
-
顺序结构:根据编写的顺序,从上到下运行
-
选择结构:
-
单if语句
if(关系表达式){ 语句体; }
-
if…else
if(关系表达式) { 语句体1; }else { 语句体2; }
-
if…else if…else
if (判断条件1) { 执行语句1; } else if (判断条件2) { 执行语句2; } ... }else if (判断条件n) { 执行语句n; } else { 执行语句n+1; }
-
switch
switch(表达式) { case 常量值1: 语句体1; break; case 常量值2: 语句体2; break; ... default: 语句体n+1; break; }
-
-
switch语句中,表达式的数据类型,可以是byte,short,int,char,enum(枚举),JDK7后可以接收字符串。
-
case的穿透性:在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运 行,直到遇到break,或者整体switch结束。
-
循环结构:
-
for
for(初始化表达式①; 布尔表达式②; 步进表达式④){ 循环体③ }
-
while
初始化表达式① while(布尔表达式②){ 循环体③ 步进表达式④ }
-
do…while
初始化表达式① do{ 循环体③ 步进表达式④ }while(布尔表达式②);
do…while循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成false,也依然会循环一次。
-
-
在已知循环次数的时候使用推荐使用for,循环次数未知的时推荐使用while
-
跳出语句
- break:终止switch或者循环
- continue:结束本次循环,继续下一次的循环
-
死循环:也就是循环中的条件永远为true,死循环的是永不结束的循环。例如:while(true){}。
-
嵌套循环:是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。总 共的循环次数=外循环次数*内循环次数
十三、开发工具IntelliJ IDEA
-
IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写。所以,需要有JRE运行环境并配置好环境变量。
-
所谓包,就是文件夹,用来对类文件进行管理。
-
out 目录是存储编译后的.class文件
-
src 目录是存储我们编写的.java源文件
-
常用快捷键:
快捷键 功能 Alt+Enter 导入包,自动修正代码 Ctrl+Y 删除光标所在行 Ctrl+D 复制光标所在行的内容,插入光标位置下面 Ctrl+Alt+L 格式化代码 Ctrl+/ 单行注释 Ctrl+Shift+/ 选中代码注释,多行注释,再按取消注释 Alt+Ins 自动生成代码,toString,get,set等方法 Alt+Shift+上下箭头 移动当前代码行 Ctrl+空格 补全代码 psvm 自动补全main函数 sout System.out.println(); Ctrl+Shift+F10 执行 5.fori for (int i = 0; i < 5; i++) {}
十四、数组
-
容器:是将多个数据存储到一起,每个数据称为该容器的元素。
-
数组概念: 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致。
-
数组的初始化:
-
动态初始化(指定长度)
-
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
int[] arr = new int[3];
int[] arr; arr = new int[3];
-
使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值
整数类型(0)、浮点类型(0.0)、字符类型(‘\u0000’)、布尔类型(false)、引用类型(null)
-
-
静态初始化(指定内容)
-
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};
int[] arr = new int[]{1,2,3,4,5};
int[] arr; arr=new int[]{1,2,3,4,5};
-
数据类型[] 数组名 = {元素1,元素2,元素3…};
int[] arr = {1,2,3,4,5};
-
-
-
数组的访问
-
直接打印数组名称,得到的是数组对应的内存地址哈希值
-
索引: 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始到“数组的长度-1”,这个自动编号称为数组索引 (index),可以通过数组的索引访问到数组中的元素。
-
数组名[索引]
-
数组名.length
-
-
特点:
- 数组是一种引用数据类型
- 数组当中多个数据,类型必须统一
- 数组的长度在程序运行期间不可改变
-
Java的内存划分
- 栈(Stack):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。一旦超出作用域,立刻从栈内存当中消失。
- 堆(Heap):存储对象或者数组,new来创建的,都存储在堆内存当中,堆内存里面的东西都有一个地址值:16进制。堆内存里面的数据都有默认值。
- 方法区(Method Area):存储可以运行的.class文件,包含方法的信息。
- 本地方法栈(Native Method Stack):JVM在使用操作系统功能的时候使用。
- 寄存器(pc Register):给CPU使用。
-
常见问题:
- 数组索引越界异常( ArrayIndexOutOfBoundsException)
- 数组空指针异常(NullPointerException)
-
数组遍历
数组的索引是 0 到 lenght-1
public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
-
获取最值元素
public static void main(String[] args) { int[] arr = { 5, 15, 2000, 10000, 100, 4000 }; int max = arr[0]; for (int i = 0; i < arr.length; i++) { if (arr[i] > max) max = arr[i]; } System.out.println("数组最大值是: " + max); }
-
数组反转
public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; for (int min = 0, max = arr.length ‐ 1; min <= max; min++, max‐‐) { //利用第三方变量完成数组中的元素交换 int temp = arr[min]; arr[min] = arr[max]; arr[max] = temp; } // 反转后,遍历数组 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
-
数组作为方法参数和返回值
-
数组作为方法参数传递,传递的参数是数组内存的地址。
public static void main(String[] args) { int[] arr = { 1, 3, 5, 7, 9 }; printArray(arr); } public static void printArray(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
-
数组作为方法的返回值,返回的是数组的内存地址
public static void main(String[] args) { int[] arr = getArray(); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } public static int[] getArray() { int[] arr = { 1, 3, 5, 7, 9 }; return arr; }
-
-
方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.
-
一个方法只能有0或者1个返回值,不能有多个返回值
十五、面向对象
=编写中