---恢复内容开始---
函数与数组
一、函数
1.1 函数的概述
函数的概念是在日常的使用过程中被提出来的,如果我们在编写程序的过程中发现有一段代码在程序中多次使用,我们可以把这段代码封装成独立的小程序,这段小程序就叫做函数,使用的时候调用它就行了,减小了代码量,提高了代码的复用性。
1.2 函数的格式
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) { 执行语句; return 返回值; } 返回值类型: 运行这段程序得出的一个运算结果,结果类型,如果函数没有返回值则用void:来表示该函数没有返回值。 函数名:仅仅是一个标识符,可以随意起名字。 形式参数:是一个变量,用于存储调用函数传递进来的实际参数。 实际参数:传递给形式参数的具体数值。 返回值:返回给调用者(若函数的返回值类型为void则没有返回值,若定义了返回值类型却没有return返回值或者返回值的数据类型跟定义的返回值的数据类型不同,则程序会报错)。 |
定义函数的步骤:
1:先确定函数的形参列表(看有几个变量参与函数运算)
2:再看返回值类型,是否有运算结果(返回值)
3:最后定义运算语句。
案例:定义一个函数用来获取2个整数中的较大的数。
1.由案例得该函数由两个变量参与运算,而且数据类型为整型。
2.较大的数的数据类型为整型,所以返回值类型为整型。
3.通过if语句来比较,找出最大值
怎么调用函数:
使用函数名再跟上要传入的实参列表,如果方法有返回值,可以定义一个变量来接收返回值。
具体代码如下:
运行结果:
注意:main方法是程序的入口由虚拟机调用,方法和方法之间不能嵌套,方法之间通过调用来使用。
方法什么时候执行完毕:
当执行完return语句,或者执行到方法末尾的花括号时方法结束。
该类中包含了两个方法,main方法和getMax方法。main方法由java虚拟机调用,并且main方法的写法是固定的。Main方法可以调用其他方法。
当调用getMax方法时,变量i的值传递给方法中的x,j的值传递给方法中的y,并开始执行getMax方法中的语句,执行return,并返回运算结果。getMax方法运行完毕。
1.3 函数的特点
1. 定义函数可以将功能代码进行封装
2.定义函数可以提高代码的复用性。
3.函数只有被main函数或其他函数调用才能执行。
4.函数都会返回一定的值,若返回值为空,则函数的返回值类型为void,return语句可省略不写;若返回值不为空,则函数的返回值类型,就是函数的返回值的数据类型。
5.函数不能嵌套函数,函数与函数是平级的关系,只能调用另一个函数,而非嵌套。
1.4 函数的应用
案例1. 画矩形
案例2. 比较两个数是否相等
注意:
- 函数中只能调用函数,不能定义函数,没有定义函数之前,不能调用函数。
- 输出语句只能对有具体返回结果的函数的进行打印。
- 返回值类型是void的函数,是不可以被输出语句打印的。
1.5 函数的重载
函数重载的定义:在一个类中有一个以上的同名函数,他们的参数列表不同(参数的个数或者参数的数据类型不同),我们把这种现象称作函数的重载,函数的重载和返回值类型无关,返回值类型可以相同也可以不同。
函数重载的意义:为了增强方法的阅读性,优化程序设计。
案例1: 九九乘法表
二、数组
2.1 数组的概述
在前面的学习中,我们学习了一些基本的数据类型和变量,众所周知,变量是一个容器,只能存储一个数据,但我们如果想存储一连串同种类型的数据又该怎么做?这时候数组的概念就诞生了,数组是专门用来存储多个同种数据类型的数据的。其实数组也是一个容器,只不过这个容器的功能比变量要强大多了。
如果需要存储大量的数据,例如如果需要读取100个数,那么就需要定义100个变量,显然重复写100次代码,是没有太大意义的。如何解决这个问题,Java语言提供了数组(array)的数据结构,是一个容器可以存储相同数据类型的元素,可以将100个数存储到数组中。
2.2 数组的定义
格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
注意:给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。创建数组之后不能修改数组的大小。可以使用length 属性获取数组的大小。数组的好处就是数组中的每个元素都有从0开始顺序分配的下标,可以通过数组的下标来获取数组中的元素。
2.3 数组初始化
格式一:先定义数组的结构再初始化
示例:int[] arr = new int[5];
arr[0]=1;
用户没有初始化的元素,系统默认初始化置0,与变量相对比,变量必须用户自己初始化。
格式二:边定义数组的结构,边初始化
示例:int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
定义了数组的长度为4,初始化了数组中个元素的值。
int i = arr.length(); 该语句用于获取数组的长度。
2.4 数组中常见的异常
1. 一数组角标越界异常:,注意:数组的角标从0开始。
public static void main(String[] args) { int[] x = { 1, 2, 3 }; System.out.println(x[3]); //java.lang.ArrayIndexOutOfBoundsException } |
2. 空指针异常:
public static void main(String[] args) { int[] x = { 1, 2, 3 }; x = null; System.out.println(x[1]); // java.lang.NullPointerException } |
2.5 数组的内存分析
案例分析:
创建数组时,首先会在栈内存中创建名为arr的局部变量,此变量保存的是堆内存中数组元素的首地址,数组运算按下表顺序依次排列,找到了第一个元素,就可以通过地址叠加找到数组中的其他元素。
用new关键字创建的实体都是保存在堆内存中,然后在栈内存中定义一个局部变量指向它。
Jvm有垃圾回收机制,当堆内存的实体没有局部变量来指向它,或者调用该实体的程序执行网,jvm就会把这些实体视为垃圾,启动垃圾回收机制回收,这和c语言有很多的区别,c语言是不会自动回收不用的内存空间的。
2.6 数组的常见操作
操作1 遍历
遍历需要使用数组的length属性函数来获取数组的长度。
操作2 获取最大值
2.7 数组元素的排序与查找方式
案例1 直接排序
案例二 冒泡排序
案例3 折半查找(二分法)
案例4 数组翻转
2.8 二维数组
二维数组:实质就是存储是一维数组,只不过一维数组里面存储的是另外一些一维数组的地址
数组定义:
数组类型[][] 数组名 = new 数组类型[一维数组的个数][每一个一维数组中元素的个数];
疑问: 为什么a.length = 3, a[0].length = 4?
数组的初始化:
静态初始化:
int [][] a = new int[][]{ {12,34,45,89},{34,56,78,10},{1,3,6,4} };
动态初始化:
二维数组常见的操作:
- 遍历二维数组
- 对二维数组求和
class Demo3 { // 定义一个遍历二维数组的功能函数 public static void printArr2( int [][] a ){ // 1. 拆开二维数组 for ( int i = 0 ; i < a.length ; i++ ) { // 2. 拆开一维数组获取数据 for ( int j = 0 ; j < a[i].length ; j++ ) { System.out.print( a[i][j]+" ," ); } }
} // 定义一个函数计算二维数组中的元素的累加和 public static long getSum( int [][] a ){ // 0. 定义一个结果变量 long sum = 0L; // 1. 拆开二维数组 for ( int i = 0 ; i < a.length ; i++ ) { // 2. 拆开一维数组获取数据 for ( int j = 0 ; j < a[i].length ; j++ ) { sum+=a[i][j]; } } return sum; }
// 统计二维数组中元素的个数 public static int getDataCount( int [][] a ){ // 0. 记录元素个数 int count = 0; // 1. 拆开二维数组 for ( int i = 0 ; i < a.length ; i++ ) { // 2. 拆开一维数组获取数据 for ( int j = 0 ; j < a[i].length ; j++ ) { count++; } } return count; } public static void main(String[] args) {
int [][] a = new int[][]{ {23,4,5},{2},{4,5,78,56,90} }; printArr2( a ); System.out.println(); System.out.println("累加和是: "+getSum( a ) ); System.out.println("统计元素个数: "+getDataCount( a ) ); System.out.println("Hello World!");
} } |
---恢复内容结束---