目录
1.变量和常量
1.变量和常量
变量的定义:其值可以被改变的量称为变量
变量的命名规范:采用驼峰式命名规则,比如allName,firstStudentName
变量又分为 : 局部变量和成员变量
局部变量是:存在于方法中的变量(可以是main方法,也可以是其他方法)
成员变量:类中方法外的变量
注意:当我们定义的变量在另一个方法中想要使用的时候,可以把变量从局部变量提到成员变量的位置,因此本类中的任意方法都可以访问的到该变量
public class Test(){
int a = 10;//a是成员变量
public static void main(String [] agrs){
int b = 20;//b是局部变量
}
public void show(){
int c = 30;//c这里也是局部变量
}
}
2.基本数据类型
整数类型:byte 、short 、 int 、long
浮点类型:float、double
字符型:char
布尔类型:boolean 结果:true / false
3.强制转换
当把一个高精度的变量的值赋值给一个低精度的变量时,就必须使用强制类型转换,但可能丢失精度(类似于把一个大桶里面的水放到小桶里面,会出现多的水洒了)
public class Test{
public static void main(String [] args){
int a = (byte)23.45;
System.out.println(a);//23
}
}
例如:上方的代码进行了一个强制转换,就造成了精度的丢失。
4.运算符
+ | 加 |
---|---|
- | 减 |
* | 乘 |
/ | 除 |
! | 非 |
% | 取余 |
| | 或 |
& | 与 |
|| | 双或 |
&& | 双与 |
+= | 将等式左右两边的值相加,然后赋值给左边 |
---|---|
-= | 将等式左右两边的值相减,然后赋值给左边 |
*= | 将等式左右两边的值相乘,然后赋值给左边 |
/= | 将等式左右两边的值相除,然后赋值给左边 |
5.if语句
if(布尔表达式){
语句序列;
}
先看布尔表达式,为true(真)时则执行语句序列,为false(假)时则跳出该语句。
if...else语句
if(布尔表达式){
语句序列1;
}else{
语句序列2;
}
先看布尔表达式,为true(真)则执行下面的语句序列1,为false(假)则执行语句序列2
if...else...if语句
if(布尔表达式1){
语句序列1;
}else if(布尔表达式2){
语句序列2;
}
先看布尔表达式,为true则执行下面的语句序列1,然后跳出循环,若为false则执行布尔表达式2,然后判断布尔表达式2,如果是true则执行下面的语句序列2,如果是false就跳出循环。
6.switch...case...default语句
switch(表达式){
case 1:
语句1;
case 2 :
语句2;
case 3:
语句3;
default:
语句4;
}
先看表达式,用表达式里面的值去匹配下面的语句,如果没有匹配到,就执行default下面的语句。
7.for循环
for (初始化语句;条件判断语句;条件控制语句){
循环体语句;
}
执行流程:
1.执行初始化语句
2.执行条件判断语句
如果是true就继续执行
如果是false就结束执行
3.执行循环体语句
4.执行条件控制语句
5.回到2.继续执行
8.while循环
while (条件判断语句){
循环体语句;
条件控制语句;
}
执行流程:
1.执行初始化语句
2.执行条件判断语句,看结果是true还是false
如果是false,就结束循环
如果是true,就继续执行
3.执行循环体语句
4.执行条件控制语句
5.回到2.继续
9.do...while循环
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句)
执行流程:
1.执行初始化语句
2.执行循环体语句
3.执行条件控制语句
4.执行条件判断语句,看结果是true还是false
如果结果是true,就继续执行,
如果是结果是false,就停止执行
5.回到2继续
10.三种循环的区别
for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行) (类似于:先动脑子再动手)
do...while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断) (类似于:先动手,在动脑子,所以没人喜欢,用的少)
三种循环的场景:
明确循环次数,推荐使用for循环。
不明确循环次数,推荐使用while循环
do...while循环,很少使用(了解即可)
11.死循环
//for死循环格式:
for(;;){
}
//while死循环格式:
while(true){
}
//do...while死循环格式
do{
}while(true);
12.跳转控制语句
continue:跳过某次循环体内容的执行
注意:使用是基于条件控制,在循环内部使用
需求:模拟电梯上行的过程1-24层,4层不停
break:终止循环体内容的执行,结束整个循环
注意:break语句只能在循环和switch中进行使用
注意:
break和continue只能跳出、跳过自己所在的那一层关系,如果想跳出、跳过指定的一层就可以加入标号(loop)
标号名:while(true){
switch(表达式){
Case 1:
Break 标号名;
}
}
13.Scanner键盘录入
1.导包(idea中会自动导包的,直接创建Scanner对象即可)
import util.java Scanner
2.创建键盘录入对象
Scanner 变量名 =new Scanner(System.in);
3.接收数据
int a = 变量名.nextInt();
注意:其中a是可以更换的,仅仅是定义了一个int类型的变量名称而已
nextInt也是可以更换的,具体要看接收的是什么类型的数据,
如果是字符串类型的,就可以用nextLine
具体类型具体分析
注意:只要nextInt,next,nextdouble方法在nextLine前面时,就会跳过nextline的输入
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
14.Random随机数
作用:用于产生一个随机数
步骤:
1.导包(导包的动作必须出现在类定义上面,同样idea可以自动导包)
import java.util.Random
2.创建对象(这个式子中r是变量名,可以变,其他的都不允许变)
Random r = new Random();
3.获取随机数
int number =r .nextInt(10);
注意事项:
1.获取数据的范围:[ 0,10),包括0,但不包括10,要想包括10,必须将括号内的数字改为11
2.上面的这个格式里面,number是变量名,可以变,数字10可以变,其他的都不允许变
15.数组(Array)
格式一:数据类型 [ ] 变量名
例子:int[ ] array
数组初始化 :
Java中的数组必须先初始化(赋值),然后才能使用。
所谓初始化:就是在内存中,为数组容器开辟空间,并将 数据存入容器中的过程。
数组的动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
格式:数据类型[] 变量名 = new 数据类型[数组长度];
范例:int [ ] arr = new int[3];
注意:打印数组变量名,出现的是数组在内存中的地址值,
数组元素的访问:
数组变量访问方式 (访问的是地址值)
格式: 数组名
数组内部保存的数据的访问方式:
格式:数组名[索引]
例如:array[0];
索引是数组容器中空间的编号
特征1:索引是从0开始的
特征2:索引是连续的
特征3:索引逐一增加,每次加一
作用:访问数组容器中 的空间位置
数组在创建完毕后,即使没有赋值,也可以取出,但取出的元素都是默认初始化值
整数类型(byte,short,int long)的数组的默认值为0
浮点类型(float,double)的数组默认值为0.0
布尔类型(boolean)的数组默认值为false
字符类型(char)的数组默认值为空字符
引用数据类型(String)的数组默认值为null
16.Java中的内存分配:
栈内存:方法运行时,进入的内存,局部变量都存放于这块内存当中
堆内存:new出来的内容都会进入堆内存中,并且会存在地址值(有new就会进堆)
方法区:字节码文件(.class文件)加载时进入的内存,字节码文件中的主方法会被JVM调用进栈内存
本地方法栈:调用操作系统相关资源
寄存器:交给cpu去使用
数组初始化之静态初始化:
静态初始化:初始化时,就可以指定数组要存储的元素,系统还会自动计算出该数组长度
格式:数据类型[ ]变量名 = new 数据类型[ ] {数据1,数据2,数据3};
案例:int [ ] arr = new int [ ]{1,2,3};
简写格式:int [ ] arr = {1,2,3};
两种初始化的区别对比:
动态初始化:手动指定数据长度,由系统给出默认初始化值 int [ ] array = new int [5];
静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度
int [ ] array = {1,2,3,4,5};
动态初始化的使用场景:(明确元素的个数)
只明确元素个数,不明确具体数值,推荐使用动态初始化
静态初始化的使用场景:(明确具体元素)
需求中已经明确了要操作的具体数据,直接静态初始化即可
ArrayQuestion:
使用数组过程中常见的两个问题:
1.Exceptioninthread"main"java.lang.ArrayIndex**OutOfBoundsException:**数组索引越界问题发生这个问题的原因是:我们访问了超出不存在的索引(简单的来说就是访问的索引不存在)
2.Exceptioninthread"main"java.lang.**NullPointerException:空指针异常产生的原因:数组已经不在指向堆内存的数据了,我们还使用数组名去访问元素
数组获取最值的操作:
思路:
1.定义一个变量,用于保存最大值 (或最小值)
2.去数组中第一个数据作为变量的初始值
3.用for循环实现遍历,然后与数组中剩余的数据**逐个比对**,每次比对将最值保存到变量中
4.循环结束后打印变量的值
数组元素求和:
1.先创建一个Scanner录入对象
2.定义一个求和变量 = 0, int sum = 0;
3.定义一个动态初始化数组
4.用for循环实现键盘录入的多次循环,并在for循环之中,把键盘录入的值赋值给数组
5.再次定义一个for循环,然后实现数组的遍历,并将遍历的值逐个累加
6.最后,写一个输出语句,进行结果输出
17.方法
方法就是一段具有独立功能的代码块,不调用就不执行。
方法每调用一次,里面的代码逻辑就执行一次
方法的定义格式:
修饰符 返回值类型 方法名(参数类型 参数1,参数类型,参数2){
方法体
return 返回值;
}
注意:方法与方法之间是平级关系,不可以嵌套使用。
格式解释:
1.修饰符:目前记住public static就行
2.返回值类型:用于限定返回值的数据类型的
如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
3.方法名:是为了方便我们调用方法的名字的(自己随便起)
4.参数类型:用于限定调用方法时传入的数据的类型
5.参数名:用于接收调用方法的名字
6.方法体:完成功能的代码
7.return:结束方法,并把返回值带给调用方法者
形参:形式参数,是指方法定义中的参数
实参:实际参数,方法调用中的参数
方法注意事项:
1.方法不能嵌套定义
(方法与方法之间是平级关系,如果要再次定义方法,需要在类中主方法之外定义)
2.方法的返回值类型为void,表示该方法没有返回值,没有返回值的方法可以省略return语句不写
如果要编写return,后面不能跟具体的数据
3.return语句下面,不能编写代码,因为永远执行不到,属于无效的代码
(return语句,执行到return语句就停止了,所以下面的语句执行不到)
方法重载的概念:
在同一个类中,定义了多个同名的方法,但每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系。
简单记:同一个类中,方法名相同,参数类型不同的方法
参数不同:个数不同,类型不同,顺序不同
注意:识别方法之间是否是重载关系,只看方法名(相同)和参数(不同),跟返回值无关
18.二维数组
二维数组的概念:(二维数组就是存储着一维数组的数组)
二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组容器
二维数组的动态初始化:
(最常用的) 格式1:数据类型[][]变量名 = new 数据类型 [m] [n]
m表示这个二维数组,可以存放多少个一维数组(m代表二维数组中一维数组的个数)
n表示每一个一维数组,可以存放多少个元素(n代表一维数组中元素的个数)
感觉有点连环套的感觉
范例:int [] [] arr = new int [2] [3];
这表示了该数组可以存放2个一维数组,每个一维数组中可以存放3个int类型元素
格式2:数据类型 变量名[] []
范例:int arr [] [];
格式3:数据类型 [] 变量名 [];
范例: int [] arr [];
注意:二维数组存储一维数组的时候,存储的是一维数组的内存地址
如果想输出二维数组中的一维数组的值,如下操作:
System.out.println(int [ ][ ]arr =new int[3] [4]);
二维数组的静态初始化:
格式:数据类型[][]变量名 = new 数据类型[][]{{元素1,元素2},{元素3,元素4}};
简化格式:数据类型[][] 变量名 ={{元素1,元素2},{元素3,元素4}};
int [ ][ ] array = {{1,2,3},{4,5},{6,7,8}};
二维数组的遍历:(双重for循环)
实现思路:
1.遍历二维数组,取出里面的每一个一维数组(用for循环实现)
2.在遍历过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素(在第一步的for循环中再次嵌套一个for循环)
3.在输出二维数组里面的内容时,输出二维数组需要满足输出二维数组的格式,例如
System.out.println(arr [ i ] [ j ] );
19.java中的内存分配
栈内存:方法运行时,进入的内存,局部变量都存放于这块内存当中
堆内存:new出来的内容都会进入堆内存,并且会存在地址值(有new就会进堆)
方法区:字节码文件(.class)文件加载时进入的内存
1.首先我们完成编译的文件是一个(.java)类型的文件,需要通过jvm(虚拟机)编译转换成(.class)的字节码文件,然后才能够被展示给我们看
2.该类的字节码文件加载进入方法区
3.因为字节码文件中存有编译的代码,首先就是main方法,因此main方法同样存在于字节码文件中
4.因为jvm的调用,将main方法自动调用到栈内存中执行
5.main方法被调用到栈内存后会开辟出一个区域
6.同时main方法下还有定义的局部变量,因为方法运行时局部变量存在于栈内存中,因此局部变量会在栈内存中的main方法开辟出的区域里面再次开辟一个区域
7.同时new出来的内容会进入堆内存,并且在堆内存中开辟一块区域(如果是数组的话,会根据数组大小,将区域分割成等几份)
8.通过new关键字在堆内存开辟空间后并产生地址值,因为new的长度是长度为3的数组,所以会划分出3个小格子,每个格子都有自己的索引和默认初始化值
9.堆内存中将地址值付给main方法中的变量
10.栈内存中根据main方法下编写的代码,将代码在main方法开辟的区域中执行。
11.栈内存的代码执行完之后就会弹栈消失,释放内存,堆内存的代码执行完毕之后同样也会弹出,也会释放内存,最后方法区里面的代码弹出消失,最后释放内存
最后,恭喜你能够看到这里!
心动不如行动,赶紧打开IDEA操作一下吧