Java 方法基础&数组
在下萌新,写得不好请见谅。若发现哪里错了,或者不完整还望指正。最近准备考试中课本上的知识点就没怎么整理,放暑假再慢慢整理。
1 方法的格式等基础知识:
1.1 方法:
-
使用方法的认知:
在其他某些语言里,方法被称为过程(procedure)或函数(function)。这些语言中,带返回值的方法称为函数,返回值类型为void被称为过程。 -
对方法的优点:
代码的重复使用与共享:例如在Test类下成功定义完一个方法max之后,就可以在该类里用方法名进行重复调用。哪怕创建了另外的类(在同一包下可以使用Test.max调用Test类下定义好的方法),如果不在同一包下就要按照文件目录进行导包。 -
定义方法与声明变量的细微差别:
定义是指被定义的项是什么,而声名通常是指为被声明的变量开辟内存空间来储存数据。 -
使用方法注意事项:
4.1 方法应该定义在类当中,但不可以在方法里再定义方法,不能嵌套。
4.2 方法定义前后顺序无所谓。
4.3 方法定义后在没被调用前不会执行。
4.4 若方法存在返回值,那就必须写上"return 返回值",不能不写。并且return后面的返回值必须和方法的返回值类型对照一致。
4.5 对于一个void没有返回值的方法,最后一行可以不写return,写了后面也不可以有返回值。只能写"return ;"
4.6 一个方法里可以有多个return,但需要保证同一时间只能有一个被执行。
1.2 格式:
修饰符 返回值类型 方法名 (参数类型 参数名称 , ...){
//方法体
}
方法头由修饰符,返回值类型,方法名,参数类型以及参数名称构成
public static int max(int number1,int number2){
return number1 > number2 ? number1 : number2;
}
/*
修饰符:public static ; 返回值类型:int 方法名:max
参数类型:小括号里的int 参数名称:number1,number2
方法体:return number1 > number2 ? number1 : number2;
方法头:public static int max(int number1,int number2)
*/
注:定义在方法头中的参数称为形式参数。
1.3 方法的调用:
方法调用总共有三种方式:1.单独调用 2.打印调用 3.赋值调用
- 单独调用:
//单独调用的形式
方法名(参数);
- 打印调用:
//示例打印调用形式
System.out.println(方法名(参数));
- 赋值调用:
//示例赋值调用形式
int number = 方法名(参数);
1.4 方法调用图解:
注:该图中的形式参数为方法头中的a,b。实际参数是15,20。
1.5 对比有参数(返回值)与无参数(返回值):
有参数:小括号当中有内容,方法需要一些数据才能完成任务。
无参数:小括号中留空,方法不需要数据就可以完成自己的任务。
有无返回值对比图:
注意事项:有返回值的方法可以用打印调用,赋值调用,单独调用。但是无返回值的方法只能使用单独调用,不可以使用赋值调用以及打印调用。
1.6 方法的重载(overload)
- 方法重载(overload):
多个方法的名称一样,但是参数列表却不一样。 - 要点:
在进行方法的重载时,必须保证重载的方法的方法头里参数列表和原方法的参数列表不一样。即使全都一样,参数的排列方式也必须要有所改变。 - 方法重载的优点:
让程序更清楚,更具可读性。执行同样功能,但参数不同的方法可以使用同一个方法名。 - 方法重载相关因素:
1.参数个数 2.参数类型 3.参数列表排列顺序。
public static int sum(int number1 ,double number2 ){
return (int)(number1+number2);
}//模板
public static int sum(int number1 ,int number2 ){
return number1+number2;
}//方法的重载类型1,参数类型不同
public static int sum(int number1 ,double number2 , int number3){
return (int)(number1+number2+number3);
}//方法重载类型2,参数个数不同
public static int sum(double number1 ,int number2 ){
return (int)(number1+number2);
}//方法重载类型3,参数排列顺序不同
- 方法重载无关因素:1.与参数名称无关 2.与方法的返回值类型无关。
public static int sum(int number1 ,double number2 ){
return (int)(number1+number2);
}//原型
public static int sum(int x ,double y ){
return (int)(number1+number2);
}//这样写是错误的,因为方法重载与参数名称没有关系。
public static long sum(int number1 ,double number2 ){
return (long)(number1+number2);
}//同样是错误的,因为容易混乱。程序调用时不知道该调用原方法还是这个方法。
2 数组
1.概念:
把数组比作糖罐子,每一个元素比作一颗糖。就像一个糖罐子里有很多糖一样,数组里也有很多元素。糖罐子是糖的集合,数组就是对应元素的集合。
多维数组概念:以二维数组为蓝本,一维数组是装满糖的糖罐子。那二维数组就是把这些糖罐子统一放在了一个箱子里,而这个箱子就是二维数组。
2. 特点:
-
数组是一种引用的数据类型
-
数组当中的多个数据类型必须统一
-
数组的长度在运行期间不可改变
3.初始化
在内存中创建一个数组,并向其中赋予一些默认值。
- 数组的动态初始化
动态初始化的格式:
数据类型[] 数组名称 = new 数据类型[数组长度];
int arrayStudent = new int[300];
动态初始化的特点:在创建数组时,直接指定数组当中的元素个数
- 数组的静态初始化
静态初始化的格式:
格式1:数据类型[] 数组名称 = new 数据类型[] {元素1, 元素2, 元素3, ...};
格式2:数据类型[] 数组名称 = {元素1, 元素2, 元素3, ...};(省略格式)
int arrayStudent = new int[] {1, 2, 3, ...};
静态初始化的特点: 1.创建数组时,不指定数组个数,而是指定数组的内容。
2.虽然没有高诉长度,但是根据元素个数还是可以推算数组长度的。
4.访问数组进行元素获取
注:直接打印数组名称,得到的是数组对应的:内存地址哈希值。
int[] num = new int[5];
System.out.println(num);
运行结果:[I@723279cf
- 数组成员访问:
访问格式:数组名称[索引值]
索引值:就是一个int数字。
注:
索引值从零开始,到数组长度-1为止。
int[] num = new int[8];
该数组从num[0]开始,最多访问到num[7]。
如果强制访问num[8],比如System.out.println(num[8]);
就会出现:ArrayIndexOutOfBoundsException(中文:数组索引越界异常) 异常。
- 赋值:
每一个数组成员就和一般变量的初始化(赋值)相同。
注:
动态初始化的时候,其中的元素会有一个默认值。[o 0(零)]
整数类型:默认为0。
浮点类型:默认为0.0。
字符类型:默认为’\u0000’ (’\u’是Unicode的意思,'0000’是16进制字符类型的默认值,这是一个不可见字符,打印时看不见)。
布尔类型:默认为false。
引用类型:默认为null。
特殊:数组与数组之间可以使用地址赋值,把一个数组变成另外一个(除名字以外)完全相同的数组。
int[] num1 = new int[b];
int[] num2 = num1;
注:
事实上静态初始化也会有默认值,只不过系统马上把默认值替换为了大括号里的值。(就像你在吃早饭之前是空腹,哪怕你(系统)吃(替换)得再快,也不能否认你吃之前是空腹(有默认值)的事实一样。)
Java内存划分(特殊)
总纲:Java内存需划分为5个部分。
- 栈(Stack):
存放的都是方法中的局部变量。方法的运行一定要在栈中运行。
局部变量:方法的参数或者方法内部的变量。
作用域:一旦超出作用域,立刻从栈内存内消失。 - 堆(Heap):
凡是new出来的东西,都在堆里面。堆内都有一个16进制地址值。
堆内存里面的数据都有默认值。规则:
整数类型:默认为0。
浮点类型:默认为0.0。
字符类型:默认为’\u0000’
布尔类型:默认为false。
引用类型:默认为null。(所有的引用类型变量都可以赋值为null值,但是其中什么都没有) - 方法区(Method Area):
储存.class相关信息,包含方法的信息。 - 本地方法栈(Native Method Stack):
与操作系统相关。 - 寄存器(pc Register):与CPU相关。
- 一个数组的内存图:
X数组补充知识:
X.1常见问题-空指针异常:
int[] num = null;
System.out.println(num[0]);
//这两段代码执行后会出现 NullPointerException(空指针异常) 的异常。
原因:忘了new
解决:补上new
注意事项:数组一定要在new初始化之后才可以使用其中的元素,如果只赋值了一个null,没有new一下进行创建就会发生上面的异常。
X.2获取数组长度:
数组长度获取方法:数组名称.length
int[] num = new int[3];
int number = num.length;
System.out.println(number)
输出结果:3
注:数组一旦创建,程序运行期间不可改变。
X.3数组的遍历输出:
遍历数组概念:就是对数组中的每个元素进行逐一,挨个儿处理。默认的方式是打印输出。
int[] num = {1, 2, 3, 4};
for(int i=0 ; i < num.length ; i++){
System.out.println(num[i]);
}
输出数组里的内容。
X.4数组作为方法参数-传递地址:
//无返回值的数组为参数的方法
public static void printArray(int[] array){
for(int i=0 ; i < array.length ; i++){
System.out.println(array[i]);
}
}
返回值类型:只是进行打印,不用计算并返回确定的数值,也没有结果,所以用void
方法名称:printArray
参数列表:数组
//有返回值的数组为参数的方法
public static int sumArray(int[] array){
int sum=0;
for (int i=0 ; i < array.length ; i++){
sum = sum +array[i];
}
return sum;
}//简单运用方法
注:数组作为方法参数时,往方法的小括号里传参,传递的实际上时数组的地址值。
X.5数组作为方法返回值-返回地址:
/*
此程序可以用于多个数相加(仅限于int类型的数字)。若要拓展功能,可以进行方法的重载。使此程序能作用的范围变大。还可以加入switch语句,实现简单的计算器功能。某种意义上来说,我这也是个计算器?虽然功能及其简略。。。
*/
import java.util.Scanner;
public class Demo01 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请指定数组长度:");
int length = input.nextInt();
int[] array = new int[length];
int[] testArray = arrayAssignment(array);
int sum = sumArray(testArray);
System.out.println("最后计算的总和为:"+sum);
input.close();
}
public static int sumArray(int[] array){
int sum=0;
for (int i=0 ; i < array.length ; i++){
sum = sum +array[i];
}
return sum;
}
/*
下面这个方法就是返回值为数组,参数为数组,返回值类型也是数组的方法
*/
public static int[] arrayAssignment(int[] array){
Scanner input = new Scanner(System.in);
int[] number = new int[array.length];
System.out.print("请为数组赋值:");
for (int i=0 ; i < array.length ; i++){
number[i] = input.nextInt();
}
return number;
}
}
注:
1.一个方法可以有多个参数,但是只能有一个或者没有返回值,不可以有多个返回值。
2.任何数据类型都能作为方法的参数类型,或者返回值类型。
3.数组作为方法的参数,返回值类型,返回值时都是传的地址值。