01、函数的概述
一、函数
定义在类中,具有特定功能的一段小程序
二、格式
修饰符 返回值类型 函数名(参数类型 形式参数1 , 参数类型 形式参数2.…){
执行语句;
return 返回值;
}
三、解释
1.修饰符:public static
2.返回值类型:这段程序最终返回的结果的数据类型。
3.函数名:其实就是函数的名称,方便调用。
4.参数类型:其实就是数据类型
5.参数
a.形式参数:就是接收实际参数的变量。
b.实际参数:实际参与运算的那个变量。
6.执行语句:就是按照正常的逻辑完成的功能代码。
7.返回值:就是程序的结果。
8.return 返回值: 将来在哪里调用这个函数,那么,return就把结果返回到哪里
02、函数的定义和调用
一、main是主函数,默认被jvm调用了
二、写一个函数,用于求两个int类型的数的和
public class SumFunction {public static int sum(int num1, int num2) {return num1 + num2;}public static void main(String[] args) {int a = 10;int b = 20;int result = sum(a, b);System.out.println("两数之和为:" + result);}
}
注意:
A:函数与函数是平级关系,不能嵌套定义。
B:函数只有被调用才执行。
三、函数的调用:具有明确返回值的函数的调用
A:单独调用。一般是没有意义的。 事例:sum(x,y);
B:输出调用。因为,我可能还需要对结果进行计算。所以,不够好。
事例:System.out.printIn(sum(x,y))
C:赋值调用。推荐方式。
首先看函数,返回值类型是什么,我们就应该用什么类型接收。
事例:
int sum = sum(xy);
System.out.println(sum);
03、求两个数中的最大值
用函数来做:
A:先用if--else来做。
public class MaxNumberIfElse {public static int findMax(int num1, int num2) {if (num1 > num2) {return num1;} else {return num2;}}public static void main(String[] args) {int a = 10;int b = 20;int max = findMax(a, b);System.out.println("两个数中的最大值是:" + max);}
}
B:用条件运算符来做。
public class MaxNumberTernaryOperator {public static int findMax(int num1, int num2) {return num1 > num2? num1 : num2;}public static void main(String[] args) {int a = 10;int b = 20;int max = findMax(a, b);System.out.println("两个数中的最大值是:" + max);}
}
总结下:那个是形参,那个是实参
04、函数的调用过程图解
在函数中定义的变量,和实际传递过来的没有关系。
A:在main函数中,调用方法sum(x,y);。
B:然后走到sum函数中,将实参传递过来。
C:然后执行函数中的语句。
D:将结果return到main函数中调用sum0函数的地方。
05、函数是什么结束的
一、函数是怎么开始的?
被JVM虚拟机调用,调到main0函数中,从而来被执行。
二、函数是怎么结束的?
函数其实是有关键字return让他结束的。
注意:void类型的的数,其实最后一行,默认有一个return;
06、比较两个int类型的数据是否相等
需求:比较两个int类型的数据是否相等
思路:
A:返回值类型:boolean
B:参数列表:int a,int b
Demo:
方式1:用if--else来做
public class CompareIntIfElse {public static boolean compare(int a, int b) {if (a == b) {return true;} else {return false;}}public static void main(String[] args) {int num1 = 10;int num2 = 10;boolean result = compare(num1, num2);System.out.println("两个数是否相等:" + result);}
}
方式2:用条件运算符来做
public class CompareIntTernaryOperator {public static boolean compare(int a, int b) {return a == b? true : false;}public static void main(String[] args) {int num1 = 10;int num2 = 10;boolean result = compare(num1, num2);System.out.println("两个数是否相等:" + result);}
}
方式3:直接return a==b
public class CompareIntDirect {public static boolean compare(int a, int b) {return a == b;}public static void main(String[] args) {int num1 = 10;int num2 = 10;boolean result = compare(num1, num2);System.out.println("两个数是否相等:" + result);}
}
07、输出一个长方形的函数
需求:根据给定的行数和列数输出一个*组成的长方形。
思路:
返回值类型:void
参数列表:int rows,int cols
public class PrintRectangle {public static void printRectangle(int rows, int cols) {for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {System.out.print("*");}System.out.println();}}public static void main(String[] args) {int rows = 5;int cols = 8;printRectangle(rows, cols);}
}
08、函数重载
在很多时候,我们的功能可能是相同的,但是,参数可能不同如果起不同的名字,当然是可以的。但是,又由于函数的名字 -- 见名知意,所以,很多时候,我们必须用一个有意义的名字。在这种情况下,Java就提供了一种机制:函数重载。
特点:
函数名相同,参数列表不同(个数,对应的数据类型)。
与返回值类型无关。
注意:
永远建议,写的什么类型的形式参数,你就应该用什么类型的实际参数调用。
如果实际类型是小的,形式类型是大的,可以这样写,程序不报错。反之不行。
09、数组的概述
先用Demo演示,后画图做讲解。
两个引用变量指向同一个堆内存空间。
int0 arr = (1,2,3};
arr[0]= 1;
arr[1]= 2;
arr[2] = 3;
int[ arr1 = arr;
arr1[1]= 10;
System.out.printin(arr1]);//10
System.out.printin(arr1[2]); //3
10、数组的内存图解
一、Java中对内存分五块:
栈: 变量,或者方法的执行
堆: 所有new出来的
方法区: 方法,String常量池,静态区(面向对象讲)
本地方法区: 跟系统相关的方法
寄存器: 由CPU执行。
堆:new建立的实例都存放在堆内存中
1、每一个new出来的东西都有地址值。
本身是一个十进制,显示的时候是一个16进制的数据。
2、每一个实例中的内存都有默认值。
整数:0;
浮点数:0.0;
字符型:"u000';
布尔型:false。
3、会在不确定的时间内被垃圾回收器回收。
栈:当数据使用完毕(超出了它的作用域),它就自动从内存中消失。
局部变量:定义在方法中或者方法声明上的形式参数都叫局部变量。
11、数组的定义方式
方式1:数据类型[] 变量名 = new 数据类型[个数或者长度];
方式2:数据类型 变量名[] = new 数据类型[个数或者长度];
方式3:数据类型[] 变量名 = new 数据类型(元素1,元素2,元素3...);
方式4:数据类型[] 变量名 = { 元素1,元素2,元素3...};
12、数组的常见问题
A:数组越界异常。你访问了不存在的索引。
ArrayindexOutOfBoundsException
B:空指针异常。一个实例(对象)已经不存在了,你还去访问它的内容。
NullPointerException
把一个nul赋值给一个引用类型数据,其实就是让这个引用类型的变量不再指向堆内存的数据,这样的话,原本指向的内容就是垃圾了。
13、数组操作:遍历
数组遍历:获取数组中的所有元素。
把数据存储起来就是为了使用,而要使用数组中的数据,就必须通过索引。
如果数组太长,我们没办法一个个的去数为此,Java提供了一个属性:length
格式:数组名.length
例题:写功能(函数)完成数组的遍历
public class TraverseArray {public static void traverseArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();}public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5};traverseArray(array);}
}
14、数组操作:获取最值
获取数组中的最大值。
思路:
1、需要进行比较,并定义变量。记录住每次比较后较大的值;
2、对数组中的元素进行遍历取出,和变量中记录的元素进行比较,如果遍历到的元素大于变量中记录的元素,就用变量记录住该大的值;
3、遍历结束,该变量记录的就是最大值。
public class FindMaxInArray {public static int findMax(int[] arr) {if (arr.length == 0) {return Integer.MIN_VALUE;}int max = arr[0];for (int num : arr) {if (num > max) {max = num;}}return max;}public static void main(String[] args) {int[] array = {5, 8, 3, 12, 7};int maxValue = findMax(array);System.out.println("数组中的最大值是:" + maxValue);}
}
15、数组操作:基本查找
根据给定的值,去找它在数组中的位置(索引)。
16、二维数组概述及内存图
索引的别名:角标,下标,编号。建议叫索引。
二维数组: 每一个元素其实是一个一维数组。
格式:
int[][] arr = new int[3][2];
解释:
定义了名称为arr的二维数组,二维数组中有3个一维数组,每一个一维数组中有2个元素一维数组的名称为别为:arr[0],arr[1],arr[2]给第一个一维数组的索引为1的元素赋值,写法是arr[0][0]= 10;
17、二维数组的定义格式
方式1:
int[][] arr = new int[3][2];
规则的矩形。
方式2:
int[][] arr = new int[3][];
非规则的矩形。
解释:
二维数组中有三个一维数组每个一维数组都是默认初始化值null,可以对这三个一维数组分别进行初始化
arr[0]= new int[3];
arr[1] = new int[l];
arr[2]= new int[2];
方式3:
int[][] arr ={{1,4,3},{9,3,7,5}.(2,1}};
18、二维数组的遍历
思路:
A:二维数组的每一个元素是一维数组获取到每一个一维数组。
B:一维数组的遍历我们讲过了。
arr.length:获取二维数组的长度,其实也就是一维数组的个数。
arr[x].length:获取的是每一个一维数组的长度。
arr[x][y]:获取的是二维数组的元素。
19、二维数组的应用
某个商场,每个月都有销售额。每个季度也有销售额,年终还得有销售额。
例题:已知某个商场每月的销售额,求该商场每个季度的销售额以及年终销售额。
public class StoreSales {public static void main(String[] args) {int[][] monthlySales = {{10000, 12000, 15000}, // 第一季度每月销售额{18000, 20000, 16000}, // 第二季度每月销售额{14000, 13000, 17000}, // 第三季度每月销售额{22000, 25000, 23000} // 第四季度每月销售额};int[] quarterlySales = new int[4];int annualSales = 0;for (int i = 0; i < monthlySales.length; i++) {int quarterSales = 0;for (int j = 0; j < monthlySales[i].length; j++) {quarterSales += monthlySales[i][j];}quarterlySales[i] = quarterSales;annualSales += quarterSales;}System.out.println("第一季度销售额:" + quarterlySales[0]);System.out.println("第二季度销售额:" + quarterlySales[1]);System.out.println("第三季度销售额:" + quarterlySales[2]);System.out.println("第四季度销售额:" + quarterlySales[3]);System.out.println("年终销售额:" + annualSales);}
}