方法&数组的定义和简单使用
方法的定义
方法即封装的一段特殊功能的代码。写代码时总会有一段或多段代码需要重复使用,比如功能菜单的打印,字符串的对比等,每使用一次便从重新写一遍即麻烦也无意义。将其封装,使用的时候只调用一个代称,这样就简单实用很多,也会增加代码的可读性,这样的封装的部分叫方法(也可以叫函数)。
每个程序必须拥有的main() 方法:
public static void main(String[] args) {
}
方法的定义:
修饰符 返回值类型 方法名(形参列表) {
方法中语句;
return 返回值;
}
修饰符,一般是对方法的访问权限、类型等的说明,比如main方法中的public指明该方法的访问权限是公开的,是公共方法,所有人(方法、类)都可以访问调用的,static说明该方法是静态方法;
返回值类型,顾名思义,就是说明该方法的返回值类型,return后跟的返回值的类型要和返回值类型保持一致,例如返回值类型为int,则返回值也必须是int类型的数据。方法也可以没有返回值,那么返回值类型为void,例如main方法;方法的返回值要么没有,要么只有一个
方法名,即该方法的名称,调用时需要用到,自定义,要符合标识符的规则,最好遵循命名规范,增加代码的可读性。
形参列表,该方法要传入的形参,方法逻辑中用到的一些数据,可能会发生变化,这样的数据可以考虑定义为形参,可以没有,可以有多个。
用例:
//打印三角形
public class App1 {
public static void main(String[] args) {
// 调用方法
// 通过方面名进行调用
// friedRiceWithEgg();
// 方法调用时,给形参传的值,称为实参(实际参数)
// 有几个形参,就需要几个实参,传参时,个数/类型/顺序要保持一致
// friedRiceWithEgg2("双黄蛋", "黑米饭");
printGraph2(10);
}
// 注意自定义的方法位置
// 无参无返回值
public static void friedRiceWithEgg() {
System.out.println("bbq, 大厨故意欺负我,没有食材,怎么做饭");
}
// 打印图型(三角),注意方法名的命名规范,养成良好的编程习惯,这在将来都是加分项
public static void printGraph() {
for(int i = 1; i <= 5; i++) {
for(int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
// 蛋炒饭, 鸡蛋和米可能不一样,公鸡蛋/草鸡蛋/双黄蛋。。。 隔夜米/刚蒸出来/白米饭/黑米饭。。。。
// 有参数,无返回值的方法
// 形参(形式参数)列表,形参需要外部传值
// 方法中会涉及一些可变的东西,针对这种情况,我们用形参来表示
public static void friedRiceWithEgg2(String egg, String rice) {
System.out.println("倒入2两油,加热到7成热度");
System.out.println("倒入鸡蛋:" + egg);
System.out.println("将鸡蛋炒熟");
System.out.println("倒入米饭:" + rice);
System.out.println("继续翻炒,然后出锅");
}
// 形参的类型,根据实际业务定义
public static void printGraph2(int row) {
for(int i = 1; i <= row; i++) {
for(int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
递归(了解理解)
递归即方法自己调用自己形成循环。比如计算n的阶乘:
public static int factorial (int n ){
//在大括号中只有一句要执行的代码时,可省略大括号
//但个人不建议在长代码中换行使用,容易少大括号还不容易找到哪里少了
if(n == 1) return 1;
else return n * factorial(n - 1);
}
f(n)
n * f(n -1)
(n - 1) * f(n- 2)
(n - 2) * f(n - 3)
2 * f(1)
方法重载
定义:再一个类中可以创建多个方法,这些方法可以具有相同的名字,但具有不同的参数和不同的定义。返回值不能作为重载的条件!
//以下三种都是方法重载
public static int add(int a,int b){
return a+b;
}
public static float add(float a,int b){
return a+b;
}
public static float add(int a,float b){
return a+b;
}
数组的定义
数组是一组能够储存相同数据类型的变量的集合。
定义方法:数据类型[] 数组名 = new 数据类型[数组长度],例如:
int[] mun = new int[3]
//或者先声明
int[] mun;
//再定义
mun = new int[3]
赋值:在定义时直接初始化,或者利用循环输入:
int[] mun = new int[]{1,2,3};
//简写
int[] mun = {1,2,3};
//获取数组长度
int len = num.length;
//输入:
Scanner c=new Scanner(System.in);
for(int i = 0;i < 3;i++) int[] mun[i] = c.nextInt();
这里提一下java的输入:
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner cin=new Scanner(System.in);
int a=cin.nextInt();//输入一个整数
System.out.println(a);
double b=cin.nextDouble();//输入一个双精度的浮点数
System.out.println(b);
String str=cin.next();//输入一个单词,遇到分号则输入终止
System.out.println(str);
String str2=cin.nextLine();//输入一行,中间可有多个空格
System.out.println(str2);
}
}
通过下标访问对应的数据,下标是从0开始的,即第一个数据储存在[0]的位置:
int[0] | int[1] | int[2] |
---|---|---|
1 | 2 | 3 |
数组的遍历
方式一:for循环
方式二:for增强循环forearch
//例如现有数组mun
//方式一for循环
int len = mun.length
for(int i = 0;i < len;i++){
System.out.println(mun[i]);
}
//方式二:for增强循环forearch JDK1.5后新增
for(int x:mun){//int是数组类型
//将mun中的元素依次取出来赋给x
System.out.println(x);
}
数组使用异常
空指针异常(NullPointerException):如果对象未正确初始化或为NULL时尝试使用,则将抛出Null Pointer Exception。例如只定义的数组却没有进行初始化,这时候如果直接访问使用它比如.length,那么就会抛出Null Pointer Exception。
数组越界异常(ArrayIndexOutOfBoundsException):顾名思义,就是当我们访问的数组时超出的数组定义的范围,例如定义int[] mun = new int[5],在访问mun[5]时就会抛出数组越界异常。
多维数组
JAVA中并没有真正意义上的多维数组,是以数组中的元素还是数组的形式表现出来的。
//定义
int[][] num = new int[3][3];
//赋值
num = {{1,2,3},{4,5,6},{7,8,9}};
//或输入
Scanner c=new Scanner(System.in);
for(int i = 0;i < 3;i++)
for(int j = 0;j < 3;j++)
//num[i][j]表示第个元素数组中第j个元素,可以理解为二维数组中的第i行第j列的元素
num[i][j] = c.nextInt();