本博客将大概介绍Java中数组、方法的基本概念和使用,仅适合基础教学,并不深入研究
从一个简单的例子入手
假如现在教务处的老师有个需求,需要让你设计一个程序,教师输入若干个学生的成绩,让你计算平均分并输出
较为简单的解决办法
上节课我们已经学习了循环,所以我们可以这样做: 首先让教师输入学生数量,用一个int变量cnt接收 然后再让教师循环输入学生的成绩,用一个float型变量score接收, 然后需要一个float类型的变量sum将每次读入的score加起来, 最后输出float类型的平均值avg=sum/cnt 用Java代码来表述大致就是:
Scanner in=new Scanner(System.in);
System.out.println("请输入学生数量");
int cnt=in.nextInt();
float sum=0;
float score;
float avg;
System.out.println("请输入学生分数");
for (int i=1;i<=cnt;i++){
score=in.nextFloat();
sum+=score;
}
avg=sum/cnt;
System.out.printf("平均分为:%.2f",avg);
另外一个问题
现在还有一个需求就是输出平均分之后,再输出分数高于平均分的学生的个数。解决这个问题的难点在于—— 当输入完每个学生的成绩之后我们还不能丢弃它,需要把它保存起来,而如果为每个学生的成绩都单独创建一个变量来保存的话就显得特别麻烦代码特别臃肿。所以接下来就要用到一个新的东西——数组
数组
数据可以存放在变量里,每一个变量有一个名字,有一个类型,还有它的生存空间。如果我们需要保存一些相同类型、相似含义、相同生存空间的数据,我们可以用数组来保存这些数据,而不是用很多个独立的变量。数组是长度固定的数据结构,用来存放指定的类型的数据。 所以上述问题就可以用以下方法来解决
Scanner in=new Scanner(System.in);
System.out.println("请输入学生数量");
int cnt=in.nextInt();
int num=0;
float sum=0;
float[] score=new float[cnt];
float avg;
System.out.println("请输入学生分数");
for (int i=0;i<score.length;i++){
score[i]=in.nextFloat();
sum+=score[i];
}
avg=sum/cnt;
for (float s:score){
if (s>=avg) num++;
}
System.out.printf("平均分为:%.2f,共有%d人超过平均分",avg,num);
数组是对象变量
数组变量与基本类型变量是有一些区别的,它属于对象变量,对象变量的意思就是,它是一遍数据区域的管理者而不是所有者,具体可以通过下面这个例子来理解:
对于基本类型的变量而言,变量中存储的就是“值”,
而对于对象变量来讲,变量中存在的并不直接是数据,而是“引用”,
这里的“引用”可以理解为对一片数据区域的遥控器,所以我们常说对象变量是对象的管理者而不是所有者
//基本数据类型的变量
int a=10;
//将a中的“值”传递给b
int b=a;
b++;
System.out.println(a+" "+b);
//输出:10 11
//对象变量
int[] a={1,2,3,4,5};
//将a的“引用”传递给b
int[] b=a;
b[0]=10;
System.out.println(a[0]);
System.out.println(b[0]);
//输出10 10
解决了上面这个问题之后我们还要面临另外一个问题,假如上述的这代码的使用需求较强,你需要在程序的很多其他地方用到这段代码,那需要用的时候你会怎么办呢,最蠢的办法当然是复制粘贴😅,但是显然这种办法太笨了,会让代码飞速膨胀,所以我们需要用下面这种方式将这代码保存起来,需要的时候再用。
方法(函数)
Java语言中的“方法”(Method)也可被称为“函数”(Function)。对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代码放在一个大括号“{}”当中,并且起一个名字。使用代码的时候,直接找到名字调用即可。 Java方法的大体结构如下
<返回类型> <方法名称>(<参数表>) {
<方法体>
}
<返回类型>是这个函数运行结束时要返回给调用者的数据的类型,函数可以返回基本数据类型、对象或者void。返回void表示这个函数不返回任何值。 <函数名称>是一个Java名字,一样要遵循和变量一样的命名规则。 <参数表>是0个或1个或多个参数定义,用逗号’,’分隔。
所以相应的我们就需要写一个函数,将学生的人数作为传入的参数,取名为getAvg,暂且我们只需要在里面直接输出信息,所以可以把返回类型设置为void
void getAvg(int cnt){
int num=0;
float sum=0;
float[] score=new float[cnt];
float avg;
Scanner in=new Scanner(System.in);
System.out.println("请输入学生分数");
for (int i=0;i<score.length;i++){
score[i]=in.nextFloat();
sum+=score[i];
}
avg=sum/cnt;
for (float s:score){
if (s>=avg) num++;
}
System.out.printf("平均分为:%.2f,共有%d人超过平均分",avg,num);
}
在这个阶段,我们暂且在所有的函数的返回类型前面加上关键字“static”。static表示这个函数属于这个类,而不属于这个类的任何对象,因此我们才可以不制造这个类的对象,而直接从main()函数中调用它。
方法重载
上述方法看来是蛮不错的,但是我们现在还需要另外一个功能,在我们输入学生信息之前,我们要先输入这是哪一门的成绩,最后再将科目名称和平均分一同输出,并且保留原来的方法,那么我们就需要对原来的方法进行一个重载操作
Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同。调用方法时通过传递给它们的不同个数和类型的参数,以及传入参数的顺序来决定具体使用哪个方法。–百度百科
static void getAvg(int cnt,String subject){
int num=0;
float sum=0;
float[] score=new float[cnt];
float avg;
Scanner in=new Scanner(System.in);
System.out.println("请输入学生分数");
for (int i=0;i<score.length;i++){
score[i]=in.nextFloat();
sum+=score[i];
}
avg=sum/cnt;
for (float s:score){
if (s>=avg) num++;
}
System.out.printf(subject+"的平均分为:%.2f,共有%d人超过平均分",avg,num);
}
重载优先级
重载方法的优先级,遵从一下优先序列,char>int>long>double>float>Character
static void show(int data){
System.out.println("this is a int:"+data);
}
static void show(long data){
System.out.println("this is a long:"+data);
}
static void show(float data){
System.out.println("this is a float:"+data);
}
static void show(double data){
System.out.println("this is a double:"+data);
}
show(10);
show(10.0);
|