一.Java基础入门
Java语言介绍,用途
1995年詹姆斯·高斯林
JavaSE:基本语法+电脑桌面软件
JavaME:手机软件
JavaEE:互联网上网站的服务器
Java开发环境
JDK:Java开发工具。包括JRE和开发环境
JRE:Java运行环境。包括JVM和核心类库
JVM:Java虚拟机,语言的执行者。
Java语言的跨平台性
1)针对不同的操作系统,我们安装的是不同的JVM
2)不同系统上的JVM都可以运行Java语言
3)所以我们的Java语言可以运行在任何操作系统平台上
DOS命令
调出命令行窗口:window + r,然后输入cmd回车
常用命令如下:
盘符: 表示切换盘符
cd 目录 表示进入目录
dir 表示查看当前目录内容
cd… 表示退回上一级目录
cd\ 表示回退上一级目录
cls 表示清屏
exit 表示退出关闭窗口
配置环境变量
JAVA_HOME
PATH
Java入门代码
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}
注释
文档注释: /** */
多行注释: /**/
单行注释: //
关键字
关键字是Java语言特殊使用的单词,有固定的用法和写法.
标识符:是开发者编写代码中使用到的一些单词.
用户使用的标识符不能是关键字.
标识符由字母,数字,下划线,美元符号$组成,不能以数字开头
常量
整数常量
小数常量
字符常量
布尔常量
字符串常量
空常量
二.变量,数据类型
计算机存储单元
计算机是可以用来存储数据的,但是无论内存还是硬盘,计算机存储设备的最小信息单元叫"位(bit)",我们又称之为"比特位",通常用小写字母"b"表示.
而计算机中最基本的存储单位叫"字节(byte)",通常用"B"表示,字节由连续的8个位组成.
存储单位换算
1 B = 8 bit
1 KB = 1024 B
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
变量的介绍
变量:在程序运行过程中可以改变的量.
声明变量:程序向计算机申请一块存储空间,以便存放对应的值.
声明变量的格式:
数据类型 变量名;
数据类型 变量名 = 初始值;
数据类型:对数据的归类.
变量名:用户使用的标识符
标识符由[字母,数字,下划线,美元符号$]构成,不能以数字开头,不能使用关键字.
8种基本数据类型
Java数据类型有两种:基本数据类型和引用数据类型
八种基本数据类型(四类八种):
整数类型:byte,short,int,long
小数类型:float,double
字符类型:char
布尔类型:boolean
标识符
标识符:是开发者编写代码中使用到的一些单词.
标识符命名规则:
- 必须由大小写英文字母(a-zA-Z), 数字(0-9), 下划线(_), 美元符($) 组成
- 不能以数字开头
- 不能是Java中的关键字.
Java语言标识符的命名规范
写代码必会遇到各种神坑!!!
所以Java开发领域的前辈大神们总结出了可以避免遇到各种坑的经验.
其中一个与标识符有关的防坑经验如下:如果一个标识符由多个单词组成,例如 mynumberscore
把每个单词的首字母大写,这种写法叫做"大驼峰"命名法
例如 类名:MyNumberScore , Student
把第一个单词首字母小写,其余单词首字母大写,这种写法叫做"小驼峰"命名法
例如 变量名和方法名: myNumberScore , student
数据类型转换
自动类型转换
1.常量赋值给变量
2.自动类型转换
取值小的类型自动转换为取值范围大的类型.也就是小范围到大范围变量是自动转换的.满足byte->short->int->long->float->double,其中char类型的变量可以直接自动转换给int类型的变量.
强制类型转换
数据类型 变量名 = (数据类型) 被转换数据值
浮点型转换成整形,直接截断小数点,保留整数部分,可能造成数据丢失
大范围类型转换成小范围类型的变量,可能造成数据损失
表达式的自动类型提升
1.范围小的类型向范围大的类型提升,byte,short,char运算时是直接提升为int的.
2.表达式的最终类型由表达式中的最高数据类型决定
ASCII码表
字符 | 数值 |
---|---|
‘0’ | 48 |
‘9’ | 57 |
‘A’ | 65 |
‘Z’ | 90 |
‘a’ | 97 |
‘z’ | 122 |
三.运算符
算术运算符
±*/%
赋值运算符
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | a = 10;将10赋值给变量a |
+= | 加后赋值 | a += b;等于a = a + b;将a+b的值赋值给变量a |
-= | 减后赋值 | a -= b;等于a = a - b;将a-b的值赋值给变量a |
*= | 乘后赋值 | a *= b;等于a = a * b;将a × b赋值给变量a |
/= | 除后赋值 | a /= b;等于a = a / b;将a ÷ b赋值给变量a |
%= | 取余后赋值 | a %= b;等于a = a % b;将a ÷ b的余数赋值给变量a |
自增,自减运算符
假设有 int k=1; int f=0;
++ 表示自增,两种用法
f = ++k; 表示变量先自增1,k值为2,再使用2这个值 给f,所以k是2,f是2
f = k++; 表示先使用值1给f,值1使用之后变量k再自增1,所以k是2,f是1
– 表示自减,两种用法
f = --k; 表示变量先自减1,k值为0,再使用0这个值 给f,所以k是0,f是0
f = k–; 表示先使用值1给f,值1使用之后变量k再自减1,所以k是0,f是1
自增自减规律总结:
在前:先运算,再使用值 在后:先使用值,再运算
一句话: 在前先运算,在后后运算.
关系运算符
也称比较运算符,运算结果为布尔常量.
> 大于 例如 2>1 结果是 true
>= 大于等于 例如 2>=1 结果是 true < 小于 例如 1<2 结果是 true
<= 小于等于 例如 1<=2 结果是 true
== 等于 (注意:不要写成=,一个=是赋值运算) 例如 3==3 结果是 true
!= 不等于 例如 1!=2 结果是 true
逻辑运算符
逻辑 | 运算符 |
---|---|
与 | & |
或 | | |
非 | ! |
异或 | ^ |
短路与 | || |
短路或 | && |
短路逻辑运算符符号有2个, 分别是 && 和 ||
&& 且(并且) 功能同 & || 或(或者) 功能同 |
不同之处在底层执行原理:
一个false且谁结果都是false, 所以 false && 谁 运算不会运算右侧的谁,提高性能.
一个true或谁结果都是true, 所以 true || 谁 运算时不会运算右侧的谁,提高性能.
一句话总结:短路运算时: false&&右侧不执行,true或右侧不执行;其余情况也是左右都执行;
实际开发中都用 &&和|| ,几乎不使用 &和|
三元运算符
三元(三目)运算符可以根据条件来选取一个值.
语法格式:
布尔值 ? 值1 : 值2; 其中 ?和:是固定格式
解释:根据布尔值条件,为true时选取值1使用,为false时选取值2使用;
注意:值1和值2可以是任何数据类型;三元运算符运算结果就是这种数据类型的值.(值1和值2类型必须保持一致)
数据输入
Scanner工具类
1.导入工具类(告诉我们的程序,我现在准备要使用Scanner这个工具类了) import java.util.Scanner;
2.创建对象(创建一台扫描器,扫描系统输入) Scanner sc = new Scanner(System.in);
3.扫描输入数据(等待用户输入数据时,扫描器就可以扫描取得用户输入的数据)
int k = sc.nextInt(); //扫描用户输入的一个整数,遇到回车或空格时扫描结束,并返回扫描到的整数
String s = sc.nextLine();//扫描用户输入的一行字符串,遇到回车时扫描结束,并返回扫描到的字符串
分支语句
if语句
格式一
格式:
if(布尔条件) 条件语句;
只有当布尔条件为true时,条件语句才会执行;
注: 当条件语句大于一条时,必须用大括号括起来,实际开发中,条件语句无论几条,都推荐用大括号括起来.
if(布尔条件){
条件语句1;
条件语句2;
}
格式二
格式:
if(布尔条件){
满足条件的语句;
}else{
不满足条件的语句;
}
解释:
当布尔条件为true时,执行满足条件的语句;
当布尔条件为false是,执行不满足条件的语句;
用途:满足条件时执行一种语句,不满足条件时执行另一种语句的场景.
注意:else可以省略,省略之后就是格式一
格式三
格式:
if(条件语句1){
满足条件1的语句;
}else if(条件语句2){
满足条件2的语句;
}else if(...){
...
}...
else if(...){
...
}else{
所有条件都不满足的语句;
}
解释:
当布尔条件1为true时,执行满足条件1的语句;
当布尔条件1为false时,并且当布尔条件2为true时,执行满足条件2的语句;
当布尔条件1为false时,并且当布尔条件2为false时,执行所有条件都不满足的语句;
用途:判断条件大于两种有多种情况时的场景.
注意: if(){}必须有一个,else{}只能有一个或者零个,其中 else if(){} 可以有任意个;
switch语句
格式:
switch(判断值){
case 目标值1:
条件语句1;
break;
case 目标值2:
条件语句2;
break;
...
default:
默认条件语句;
break;
}
解释:
判断值是一个表达式,表达式的结果值类型只能是byte,short,char,int,String; 常使用int类型
表达式:最终结果是一个值的数学运算.
例如: 假设有 int a=1;则表达式举例: a , a+1, a++ , a-- , a/2
case 目标值: 目标值只能是常量,类型和判断值必须一致; 如果目标值匹配到判断值,则该case的条件语句执行;
break: 代码一旦执行了某个switch中的一个break,则结束该switch结构.
default: 如果所有目标值都不匹配判断值,则会执行default的默认条件语句.
注意:
default 放在 case前后都可以,default执行顺序是的所有case之后,实际都放在最后位置,因为default语句是switch结束前的最后一个语句,所以default中的break可以省略.
多个case执行从上向下执行.
switch语句的穿透性
如果一个case匹配执行,且没有break,则会继续向下直接执行所有case语句,直到遇到break来结束switch…这情况叫做switch语句的case穿透.
循环结构
for循环
格式:
for (初始化;条件判断;步进) {
循环体;
}
解释:
1) 初始化语句 声明变量或变量赋值语句 例如 int i=1; j=0;
2) 条件判断 值为布尔类型的表达式, 为true则执行循环体;为false则结束for循环结构体 例如 i<=5
3) 循环体 重复执行的任意程序语句 例如输出语句 System.out.println(i);
4) 步进 变量赋值 语句 例如 i=i+1; i+=1; i++; i–; i=i+2; i+=2;
执行流程:
1) 初始化 首先执行一次初始化
2) 条件判断 布尔值 为true则执行循环体;为false则结束for循环结构体
3) 循环体 重复执行的任意程序语句, 循环体执行之后则执行步进
4) 步进 变量赋值 语句, 步进执行之后必执行条件判断
注意:
初始化语句只能执行一次;
只有条件判断为true时才执行循环体,循环体之后必是步进,步进之后必是条件判断;
只有条件判断为false时才能结束循环(所有循环结束都只有这一条路);
其它了解:
for循环中的 初始化,条件判断,步进都可以为空;
实际开发条件判断不会写为空,因为条件判断不写会认为是true,然后一直永不停止的重复执行循环体,这被称为无限循环(死循环); 开发中出现死循环就等于代码出错了,要避免死循环现象发生!
例如:
for(;;){
System.out.println("我会一直输出,永不停止");//死循环一直执行下去
}
使用场景:已知循环结束条件的使用场景
while循环
while循环和for循环一样,作用也是重复执行某个代码块(循环体).
格式:
while (条件判断) {
循环体;
}
执行流程
1)条件判断,如果为false直接结束while结构,如果为true则执行循环体;
2)循环体执行完必执行条件判断
注意:
只有条件判断为true时才执行循环体,循环体之后必是条件判断;
只有条件判断为false时才能结束循环(所有循环结束都只有这一条路);
使用场景:未知循环结束条件的使用场景
do_while循环
do_while和while循环非常相似,唯一的区别是 do_while会先执行一次循环体之后,再做条件判断.
格式:
do{
循环体
}while(条件判断);
执行流程
1)条件判断,如果为false直接结束while结构,如果为true则执行循环体;
2)循环体执行完必执行循环条件
注意:
只有条件判断为true时才执行循环体,循环体之后必是条件判断;
只有条件判断为false时才能结束循环(所有循环结束都只有这一条路);
break和continue关键字
break: java的一个关键字,可以出现在 条件语句switch和所有循环结构中;
条件语句switch结构中,表示结束switch条件结构的执行.
循环语句for, while, do while结构的循环体中,表示结束所在循环结构的执行.
continue: java的一个关键字,出现在所有循环结构中;
循环语句for,while,do while结构的循环体中,表示结束所在循环本次(本层)的执行.
区别:
break:执行效果等效于条件判断为false,结果是直接结束循环;
continue:执行效果等效于循环体执行完毕.结果是执行循环体结束时的下一步.
for的循环体执行中遇到continue,则执行步进
while循环体执行中遇到了continue,则执行条件判断
随机数生成器
Random工具类
Random是一个随机数生成器工具.
使用步骤(固定用法)
1.导包(使用idea工具且配置了自动导包,以后所有导包都可以省略了)
import java.util.Random;
2.创建随机数生成器
Random r = new Random();
3.随机生成一个整数
int n = r.nextInt(number);//随机生成一个[0,number-1] 即 0到number-1 的整数
例如 r.nextInt(10)+1; 会随机生成一个 [0,9]+1=[1,10] 之间的整数
例如 r.nextint(6)+5; 会随机生成一个 [0,5]+5=[5,10] 之间的整数
数组
数组的声明定义
数组是存储数据的容器.
数组的特点是:数组中数据个数固定,容器中数据类型必须一样;
数组声明(定义)格式有2种:
1) 数据类型[] 变量名称; 例如 int[] arr1; double[] arr2; String[] arr3;
2) 数据类型 变量名称[]; (不推荐使用) 例如 int arr1[]; double arr2[]; String arr3[];
解释:
[]:表示这个变量是个数组
数据类型: 用来指明这个数组中可以存放的数据类型
变量名称: 使用一个变量来代表这个数组数据.
例如: int[] arr1;表示声明一个变量 arr1,它是一个数组,这个数组中只能存放int类型的元素.
数组的赋值初始化
数组赋值(初始化)格式有2种:
1)静态初始化格式: 数据类型[] 变量名称 = new 数据类型[]{元素1,元素2,元素3};
简写格式: 数据类型[] 变量名称 = {元素1,元素2,元素3};
例如 int[] arr1 = new int[]{1,2,3};
可以简写为 int[] arr1 = {1,2,3};
2)动态初始化格式: 数据类型 变量名称 = new 数据类型[length];
例如 int[] arr1=new int[3];
解释:
new:表示创建,为数组开辟内存空间
int:数组的数据类型
[]:代表这是一个数组
length: 3代表数组的长度
数组的动态初始化只是声明了数组中元素的类型和个数.并未真的赋值,真正的赋值是在后续程序运行中动态进行赋值的.
注意:
1)静态初始化[]中不能写长度值,系统会自动判断设置长度值length;动态初始化[]中必须写长度值;
2)数组动态初始化时,所以元素没有赋值,但是系统会给每种类型的元素赋予默认值.
3)我们可以获取每个数组的长度length属性 例如 arr1.length;可以得到数组arr1的元素个数(长度)
数组元素的每种数据类型默认值:
数字类型默认值都是0
byte,short,int,long 默认值都是0
float,double 默认值都是 0.0
字符类型默认值是空格字符
char 默认值是 ’ ’
布尔类型默认值是false
boolean 默认值是false
除了八种基本数据类型,其余的引用数据类型默认值都是null
比如:String 默认值是 null;
数组元素的访问格式
变量名称[index]
例如 int[] arr = new int[]{1,2,3};
访问 arr[0]是1 , arr[1]是2 , arr[2]是3 .
注意index只能是 0,1,2
注意: 数组的索引index 取值只能是 [0,length-1] .超出范围代码会报错:数组下标索引越界异常
数组的遍历操作
int[] arr = {1, 2, 3};
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
方法
方法的基本使用
Java方法:可以重复执行的代码片段.(简单的理解就是给某一段代码起个名字叫做方法) 优点:提高代码复用性.
方法声明定义格式(重点确定 返回值和参数):
public static 返回值类型 方法名(参数){
方法体;
}
方法的调用执行格式(重点确定 方法名和参数值):
无返回值: 方法名(参数值); // 本质上等效一段代码
有返回值: 数据类型 变量名 = 方法名(参数值); //本质上等效一个值
注意: 参数值 位置可以是常量,或者变量;实际开发中一般使用变量.
解释:
public: 方法是公共的,谁都可以调用.
static: 方法是静态初始化的,不用new对象就可以调用.
返回值类型:方法体代码执行结果值类型,特别的void表示方法体执行完毕之后没有返回值.
方法名:方法的一个名称,使用小驼峰命名格式的标识符.
参数:本质是声明变量,用接收方法体执行时要使用的值.多个参数声明之间用逗号,分割.参数放在小括号内.
方法体:可重复执行的代码片段,放在大括号中.
如果返回值类型不是void,就必须有 return 结果值;
如果返回值类型是void,可以不写return,或者只写return;
注意:
实参和形参的区别:
实参:调用方法时实际传递的变量;
形参:方法定义时声明的变量;
实参与形参的数据类型必须一致.但是变量名称没有任何关系.
方法调用时都是把实参值传递给形参,但又有所不同(重点记忆):
如果是八种基本数据类型:实参传递的是值,形参接收的是值.
如果是引用数据类型:实参传递的是对象的地址,形参接收的是对象的地址.
方法重载
方法重载(overload):
1.在同一个类中
2.方法名相同
3.参数的个数,类型,顺序不同
4.与返回值类型无关.
值传递
方法调用时, 实参和形参的区别:
实参:调用方法时实际传递的变量叫做实际参数;
形参:方法定义时声明的变量叫做形式参数;
实参与形参类型必须一致,名称没有关系.
方法调用都是把实参值传递给形参,但是又有所不同:
基本数据类型变量保存值;
引用数据类型变量保存对象地址;
不同数据类型值特点:
八种基本数据类型变量保存和传递的都是值;
引用数据类型变量保存和传递的都是对象的地址;
简化版: 基本数据类型变量就是个值,引用数据类型变量就是个地址.
方法值传递的底层原理:
每个方法都有独立的栈内存来保存变量,每个方法的栈变量互不影响.但是所有方法都共用一个堆内存.所以方法改变堆对象时会互相影响.
底层原理简化版(重点记忆):
方法调用,传基本类型互不影响,传引用对象会有影响.
可变参数
JDK5的时候,多了一个新的特性叫做可变参数。
如果一个方法的参数是可变参数,那么可以在该参数位置传递任意个数据。
可变参数格式:
修饰符 返回值类型 方法名(参数类型... 参数名) {
方法体;
return 返回值;
}
- 在调用可变参数的方法时,可以向可变参数位置传递任意个数据
- 可变参数的本质就是数组,所以可以将可变参数当成数组去使用
- 因为可变参数的本质是数组,所以调用可变参数的方法时,也可以向可变参数位置传递数组。
注意:
1. 一个方法中最多只能有一个可变参数。
2. 方法中可变参数必须在最后一个位置。