1、数组的概念
1、数组是相同类型的数据按顺序组成的一种引用数据类型。
2、数组的声明和创建:
//声明一个整型数组
int[] intArray;
//声明一个字符串类型的数组
String strArray[];
//创建数据
intArray=new int[5];
strArray=new String[10];
//声明同时创建
float[] floatArray=new float[4];
//初始化数组
char[] ch=['a','b'];
(1)首先数组没有初始化就会自己创建默认值,在数字数组都是0,比如int类型是0,float类型是0.0,String类型的默认值是null
(2)数组中的下标移除问题(运行时异常)
package com.imooc;
import java.util.Scanner;
public class FloatDemo {
public static void main(String[] args) {
array();
}
public static void array() {
int[] intArray=new int[5];
for(int i=0;i<5;i++) {
intArray[i]=i+9;
}
for(int i=0;i<=5;i++) {
System.out.print(intArray[i]+" ");
}
}
}
运行上面这个代码我们可以看到错误提示
9 10 11 12 13 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at com.imooc.FloatDemo.array(FloatDemo.java:14)
at com.imooc.FloatDemo.main(FloatDemo.java:5)
这个错误提示就很清楚了,当输入第六个值的时候,在吗main方法中出现了数组下标超出边界的异常,这个错误发生在com.imooc的包中的FloatDemo类中的array函数和main函数中的第14行和第5行。
2、增强型for循环
1、foreach循环:用法如下:
int[] array=[1,2,3,4,5,6];
for(int n:array)
System.out.print(n);
2、上面这个就是说把array中的每个数据在for循环中都赋值给n,显示n的值,这个就很有效的防止了下标越界的问题。
3、二维数组
1、二维数组的形式:数据类型 [ ][ ] 数组名 = new 数据类型[m][n];举例:int [ ][ ] arr=new int [5][3]; 也可以理解为“5行3例”
4、方法简介
1、什么是方法?我们之前用的main主方法,也是程序执行的入口。
Scanner sc =new Scanner(System.in);
sc.nextInt(); //从键盘获取int类型值的方法
sc.next(); //从键盘获取字符串的方法
2、所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块。
3、方法名和变量一样,都需要写成驼峰形式,也就是一个单词全部小写,多个单词第一个单词全小写,其他首字母大写。
4.1、无参无返回值方法
1、main方法调用其他方法又两种形式,第一就是使用对象作为方法调用主体,另一种就是使用类名去调用,前者需要使用类去生成一个对象,后者是需要这个方法是静态的,可以直接使用类名作为调用主体,不用新生成对象。
2、不是main方法的方法调用同一个类中的方法就直接调用就可以了。
4.2、无参有返回值的方法;有参有(无)返回值的方法
4.3、数组作为方法的参数
1、数组名也是个对象,指向我们数组中的第一个元素。
package com.imooc;
public class Rectangle {
public void printArray(int[] arr) {
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
Rectangle obj=new Rectangle();
int[] arr1=new int[5];
obj.printArray(arr1);
}
}
4.4、方法重载
1、什么是方法重载?就是方法名相同,方法参数不相同。这里特别要注意,方法重载的两个必要条件就是方法名和方法参数,方法参数的类型不同和数量不同都属于方法参数的不同,但是,方法返回值的类型不同不能作为重载的判断条件。
4.5、基本数据类型的传值
1、我们把变量作为参数传到函数中,实际是根据变量的地址去内存中找到值,把值拷贝一份给了参数,并不是把地址传给参数,所以参数值的改变不会影响给参数赋值的变量。
4.6、可变参数列表
1、比如说像这样的就属于可变参数列表:public void sum(int... n){}
2、使用和变化的方法:int... n表示可以有一个int类型的参数,可以有两个int 类型的参数。。。可以有n个int类型的参数
package com.imooc;
public class ArgsDemo {
public static void sum(int... n) {
int sum=0;
for(int i:n) {
sum=sum+i;
}
System.out.println(sum);
}
public static void main(String[] args) {
sum(1,2,3);
sum(1,2);
}
}
3、使用增强型for循环和可变参数列表,可以让程序更简单。特别注意的是:当可变参数有两个或者两个参数以上的参数,可变参数列表一定是整个参数体中最后一个。所以一个方法中只能有一个可变参数。什么意思,就是下面的代码中,sum函数的参数列表中int... n必须是最后一个,写在int a前面就是错误的,比如下面这样:(因为可变参数列表本来就是可变的,写在前面程序不知道所以的参数中哪些属于可变参数列表中的内容)
public static void sum(int... n,int a) {} //错误写法
package com.imooc;
public class ArgsDemo {
public static void sum(int a,int... n) {
int sum=0;
for(int i:n) {
sum=sum+i;
if(sum>=a)break;
}
System.out.println(sum);
}
public static void main(String[] args) {
sum(5,1,2,3,5);
sum(1,2,1);
int[] a= {1,2,3,4};
sum(9,a); //可以将数组传递给可变参数列表
}
}
4、可以将数组传递给可变参数列表,如上面的代码所示。但是可变参数列表是不能给数组传值的。
4.7、可变参数列表作为方法参数的重载问题
1、当我们使用可变参数列表做为一个方法的重载,那么在参数数量相同的情况下,程序会执行无参数列表的那个方法,还有有可变参数类表的方法?如下图所示:
package com.imooc;
public class ArgsDemo2 {
public int plus(int a,int b) {
System.out.println("没有可变参数列表:"+a+b);
return a+b;
}
public int plus(int... n) {
int c=0;
for(int i:n)
c=c+i;
System.out.println("有可变参数列表:"+c);
return c;
}
public static void main(String[] args) {
ArgsDemo2 ad=new ArgsDemo2();
ad.plus(1,2);
}
}
2、上面代码的执行结果是
没有可变参数列表:3
那么就知道了在同样的条件下,程序选择执行了没有可变参数列表的那个方法的重载。结论就是:可变参数列表的方法是最后被访问的。