Java基础语法篇

目录

 1.变量和常量

 2.基本数据类型

 3.强制转换

 4.运算符

 5.if语句

 6.switch...case...default语句

 7.for循环

 8.while循环

 9.do...while循环

 10.三种循环的区别

 11.死循环

 12.跳转控制语句

 13.Scanner键盘录入

 14.Random随机数

 15.数组(Array)

 16.Java中的内存分配:

 17.方法

 18.二维数组

 19.java中的内存分配


 

 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操作一下吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值