JAVA循环嵌套 方法的定义与重载 数组 数组异常 练习
和前一天一样,循环嵌套,方法和数组都属于实操出真知的类型,尤其是方法的定义与调用是java的重中之重,这些在日后还是得面对不同类的题型多加练习 Day04
循环嵌套
在大循环内,如果每次循环都是相似同带有重复性的操作,就可以使用循环简化操作。可以使处理循环问题更加灵活。嵌套的可以是分支结构的语句,也可以是循环语句。
格式
for(初始化语句1;循环条件表达式1; 初始化变量1 的自增){
循环体语句
for(初始化语句2; 循环的条件表达式2;初始化变量2的自增*){
循环体语句;
}
}
执行流程:
- 初始化语句1
- 判断条件表达式1 如果是false 结束整个循环
- 如果是true就初始化语句2
- 判断条件表达式2如果是false就结束整个循环,完成初始化变量1的自增
- 如果是true就执行循环体语句,完成初始化变量2的自增,完成初始化变量1的自增
- 完成初始化变量1的自增,再返回第六步重复之前操作以此类推
举例
打印三角形 5行 第一行1颗星,第二行2颗星…第5行五颗星
package Chating;
public class Ex {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {//外循环控制行数。i的初始值为1,需求是要5行,所以i自增后至多小于等于5
for (int j = 0; j < i; j++) {//内循环表示每行打印的*星数,打印的多少j跟着行数i变
System.out.print("*");
}
System.out.println();//每打印一行星后换行
}
}
}
方法
具有特定功能可以重复调用的代码段
一些代码段要经常使用,每次都写一遍效率太低,用大括号括起来 再起个名字,之后可以直接通过名字来调用代码段
特点:提高了代码的复用性封装性,简化了代码的思维难度
方法的定义
格式:
修饰符 返回值类型 方法名称(参数列表) {
方法体语句;
return 返回值;
}
修饰符:这里先写Public static
返回值类型:方法执行后会产生数据返回给调用者,这里表示的是返回数据的数据类型(填int 返回的就是整数,填String返回的就是字符串)如果不需要返回值 填void即可
方法名称 :名字是合法的标识符即可
参数列表:我们定义方法是要完成功能,比如要计算两个整数的和,那在调用该方法时。需要从外部传入两个整数类型的数据在这个变量的容器中,这里的参数列表就表示将要传递进来的数据类型
方法体语句:即调用者想要完成的功能
return返回值:要返回给调用者的最终结果,如果没有返回值,可以单写一个return表示该方法的结束
参数列表:
- 形式参数: 在方法定义的时候使用,来接收调用该方法时传递的参数。需要加上数据类型,相当于定义了一个变量,只有变量的声明,没有进行赋值,
- 实际参数: 在方法调用的时候使用,即传递给被调用方法的值,不能加上数据类型的参数,也就是对变量进行赋值,使用逗号隔开,顺序必须和定义方法的时候形式参数的顺序一致
方法的调用
方法调用的三种格式 :直接调用 打印调用 赋值调用
直接调用:没有的返回的结果 单纯的使用方法
打印调用:把方法的返回值写入输出语句打印出来
赋值调用:把方法的结果赋值给变量,这个变量可以重复使用
方法定义的注意事项:
- 方法的顺序无所谓
- 方法中不能嵌套定义
- 方法定义后必须调用才能执行,自身不会执行
- 如果方法有返回值 必须加上return+返回值
- return后的“返回值”,必须和方法名称前面的“返回值类型”保持对应
- 如果没有返回值 则可省略return 返回值类型为void
举例
需要计算两个整数的和的方法
package Chating;
public class Ex {
public static void main(String[] args) {
getSum(2,8);//调用getSum()方法
System.out.println("-------------------------");//分割线
System.out.println(getSum2(2,8));//打印调用
}
public static void getSum(int a,int b) {//需求是录入两个整数 所以形参都是int类型的a,b
int sum = a + b;//两个整数相加
System.out.println(a+"与"+b+"的和为"+sum);//因为是输出语句结果没有返回值,所以之前返回值类型是void
}
public static int getSum2(int a,int b) {//需要的返回值类型是int,之前返回值类型是int
int sum = a + b;
return sum;//返回值类型是int
}
}
方法的重载
在同一类中,方法名相同,参数列表(参数列表 类型 个数 顺序 不同)不同,与返回值无关
只要记住一个方法名称 就能实现相似的多个功能
举例
package Chating;
public class Ex {
public static void main(String[] args) {
System.out.println(getSum(2,8));
//方法名相同,参数列表(参数列表 类型 个数 顺序 )不同
System.out.println(getSum(2.2,8.8,1.1));
//方法名都是getSum(),参数列表 类型是double,个数是3个,都不同
}
public static int getSum(int a,int b) {
int sum = a + b;
return sum;
}
public static double getSum(double a,double b,double c) {
double sum = a + b + c;
return sum;
}
}
数组
就是一个储存相同类型数据的容器
定义的格式
元素的数据类型[] 数组名 = new 元素的数据类型[数组容器的大小];
举例
package Chating;
public class Ex {
public static void main(String[] args) {
//元素的数据类型[] 数组名 = new 元素的数据类型[元素的个数];
int[] arr = new int[3];
System.out.println(arr);
}
}
- [ : 表示打印的是一个一维数组
- I:表示数组中的元素的数据类型 I代表int类型
- @: 表示一个普通的间隔符
- 15db9742:是数组的内存地址
数组初始化
给数组申请内存空间,并给该空间里每个元素位置储存数据的过程
初始化的分类:
- 动态初始化:在定义数组时候就划分了内存空间 除了初始值(默认为0,无值为null)其余什么都没有,在程序的运行过程中,才知道每个元素被赋予什么值,一般运用在知到数组中要放什么数据,但是只知道数组中应该存储的元素的个数
- 静态初始化 在定义数组时就确定了值 比如 人的性别 国籍等一般不会改变的值
动态初始化格式:
元素的数据类型[] 数组名 = new 元素的数据类型[元素的个数]
元素的赋值的方式:
数组名[元素的索引] = 元素值;
索引:代表每个元素在数组中的位置,这个位置从0 开始 到元素个数-1
元素要一个一个赋值
如果没有给元素赋值,这个元素也是有默认值,默认值是0
静态初始化格式:
元素的数据类型[] 数组名 = new 元素的数据类型[]{元素1,元素2,元素3…}
每个元素的数据类型前后一致
元素的个数,取决于大括号中元素的个数
简化的格式:
元素的数据类型[] 数组名 = {元素1,元素2,元素3…}
举例
动态初始化
package Chating;
public class Ex {
public static void main(String[] args) {
//数组的动态初始化
//需求 定义数组 五人制足球
String[] player = new String[5];
//第一个人
player[0] = "萨拉赫";
//第二个人
player[2] = "马内";
//第三个人
//第四个人
player[3] = "菲尔米诺";
//第五个人
player[4] = "奥里吉";
//取出数组中元素的值 数组名[索引]
System.out.println(player[0]);
System.out.println(player[1]);
System.out.println(player[2]);
System.out.println(player[3]);
System.out.println(player[4]);
}
}
静态初始化
package Chating;
public class Ex {
public static void main(String[] args) {
//静态初始化
//定义一个数组 存储 3个同学的考试分数
int[] count = new int[] {98,76,82};//在数组创建的过程就已经赋值了
System.out.println(count[0]);
System.out.println(count[1]);
System.out.println(count[2]);
System.out.println("===============================");
int[] c = {98,76,82};
System.out.println(c[0]);
System.out.println(c[1]);
System.out.println(c[2]);
}
}
数组的异常
索引越界异常
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
at com.ujiuye.demo.Demo15.main(Demo15.java:6)
产生原因大多为:要获取到的索引值超出了数组的范围
空指针异常
Exception in thread “main” java.lang.NullPointerException
at com.ujiuye.demo.Demo16.main(Demo16.java:8)
空:null,一旦一个引用数据类型变量被赋值为空,他就不再记录堆内存中的某个地址
空指针异常原因大多为:当引用类型变量不再指向任何位置的时候,你还用这个变量,就会抛出空指针异常