java之方法与数组
主要知识点:
- 什么是方法
- 方法的格式与属性
- 方法的特点
- 一维数组的简介,声明和初始化
- 数组分配内存空间
- 二维数组
- 操作数组的工具类-Arrays
- 什么是方法
方法是一组为了实现特定功能代码块的集合。方法的主要功能有两个:
- 结构化代码:将代码按照功能进行组织,是代码结构比较清晰,容易阅读和修改,也就是程序的可维护性强。
- 减少代码的重复:一个固定的功能,可能在程序中多次使用,在使用的时候需要调用写好的方法,而不用重复书写对应的功能代码。
方法在书写的时候需要注意以下两点:
- 逻辑严谨:方法实现的一个完整的功能,所以在书写的时候要考虑到各种的情况,并且对每一种情况给出相应的处理。
- 通用性强(可重复利用):方法实现的是一种功能,在实现的时候,可以根据需要,使方法具备一定的通用性,除非必要,否则不要写专用的方法。
总结:方法是一段可以重复使用的代码段,程序中完成独立功能的一段代码的集合。
- 方法的格式与属性
定义格式:
修饰符 返回值类型 函数名(参数类型 形式参数 1 ,参数类型 形式参数 2 , …) {
执行语句;
return 返回值;
}
方法里的属性
访问权限控制符:访问控制符限定方法的可见范围,或者说方法被调用的范围,方法的访问控制符有四种,public protected 默认的 private。后面详细介绍吧。
形式参数:在方法被调用的时候用于接收外界输入的数据。
实参:调用方法时实际传给方法的数据。
返回值:方法执行完毕后返回给调用它环境的数据。
返回值类型:事先约定的返回值的数据类型,如无返回值,必须给出返回类型 void。
如何函数的返回值类型是void时,return语句可以省略不写,系统会帮你自动加上。
return的作用:结束函数,结束功能。
参数列表(参数的类型 ,参数的个数,参数的顺序)只要有一个不一样,那么这个参数列表就不一样,对于方法而言,即使是同名也不是同一个方法。
方法签名:方法名和方法的参数列表(能区别方法)。
java语言中调用方法:对象名.方法名(实参列表)。
实参的数目、数据类型和次序必须和所调用方法声明的形参列表匹配。
主函数:
- 保证该类的独立运行。
- 因为它是程序的入口。
- 因为它在被jvm调用。
方法定义名称是为了什么呢?
- 为了对该功能进行标示,方便于调用。
- 为了通过名称就可以明确函数的功能,为了增加代码的阅读性。
重载:在一个类中,如果出现了两个或者两个以上的同名方法,只要他们的参数个数,或者参数的类型不同,即可称之为方法的重载。
如何区分重载:当方法同名时,只看参数列表,和返回值类型没有关系。
存在的原因:屏蔽了一个对象的同一类方法由于参数不同所造成的差异。
示例:
public void a(int a){} public int a(){} public void a(int a,String s){}
- 方法的特点
特点:它可以实现独立的功能,必须定义在类的里面,它只有被调用才会执行,它可以被重复使用,方法结束后方法里的对象失去引用。
如何定义一个函数?
函数其实就是一个功能,定义函数就是实现功能,通过两个明确来完成。
- 明确该功能的运算结果,其实就是在明确这个函数的返回值类型。
- 在实现该功能的过程中是否有未知的内容参与了运算,其实就是在明确这个函数的参数列表(参数类型&参数个数)
注意:函数中只能调用函数,不能定义函数。
可变参数:
从java1.5开始出现了可变参数,这是对java方法和数组的拓展。
方法中可以接受的参数不再是固定的个数,而是随着具体的需求传递多少来决定的。
定义格式: 返回值类型 方法名(参数类型 ... 形式参数){ }
可变参数的特点:只能出现在参数列表的最后。
... 位于变量类型和变量名之间,有无空格都可以。
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
- 一维数组的声明和初始化
数组的简介:
数组(Array)是java语言中一种基本的数据存储结构,用于存储同一类型的一个容器。
好处:可以对该容器中的数据进行编号,从0开始,数组用于封装数据,就死一个具体的实体。
java数组:必须先声明数组,再给该数组分配内存。数组对应在内存中一段连续空间。
数据元素必须是相同数据类型,也可以是引用数据类型,但是同一个数组中的元素必须是同一类数据类型。
一维数组:可以理解为一列多行,类型相同的数据,其中每个数据被称为数组元素。数组的长度一旦确定,就不能改变,也就是说,数组是定长的。
java语言声明数组的时候不能指定其长度(元素的个数)。
int a[5] //非法
初始化:java中的数组必须先初始化才可以使用,所谓初始化就是为数组的数组元素分配内存,并且为每个数组元素赋值。
数组初始化的两种方式:
静态初始化:初始化时由我们自己指定每个数组元素的初始值,有系统决定需要的数组长度,
格式:数组名 = new 数组类型[]{元素1,元素2,元素3...元素n};
简化语法:数组名 = {元素1,元素2,元素3...元素n};
动态初始化:初始化时由我们指定数组的长度,由系统为数组元素分配初始值。
格式:数组名 = new 数组类型[数组长度];
注意:不能静态和动态初始化同时使用,也就是说不能同时指定数组的长度和元素。
- 数组分配内存空间
Java内存的划分
- 寄存器:cpu涉及的区域。
- 存储函数的地方。
- 本地方法区:是和系统相关的代码储存区域。
- 栈内存:存储的都是局部变量,变量运算区域一结束,就释放,(局部变量:方法上的参数,方法内的变量,语句中的变量)
- 堆内存:存储的是数组和对象,简单说,堆内存存储的都是实体,实体就是可以储存多个数据的地方,记住:只要是用new建立都是存储在堆内存中。
特点:任何实体都有内存地址值。堆内存中的变量都有默认初始值,垃圾回收机制。
数组的内存分配:
定义一个数组 int scores将在栈内存中为scores分配内存空间,其值是一个不确定的值。当执行语句scores = int[5]时,将在堆内存中连续分配5个空间,每个空间4个字节,用于存放整型数据,其初始值为0,然后将该段空间首地址,也就是第一个元素地址,比如0×3000,赋给scores变量。该地址相当于一个指针,指向堆内存中分配的空间,此时堆内存中分配的5个空间可以用scores[0]-scores[4]来表示,当执行四个赋值语句的时候,分别用指定值填充到对应的元素位置,如果此时将Null赋给scores,scores将不会再指向任何的位置,此时堆内存中分配的空间就变成了垃圾,由垃圾回收器在某一时刻回收。
在方法中定义变量,包括基本数据类型变量和引用数据类型变量,都将在栈内存中分配空间,当超过变量作用范围后,自动回收。
总结:初始化 = 定义数组 + 分配空间 + 赋值。
- 二维数组
二维数组:其实是一个一维数组,它的每一个元素又是一维数组。
静态初始化
int[ ][ ] arr = new int[][]{{1,2},{3,4},{5,6}}; int[ ][ ] arr = {{1,2},{3,4},{5,6}};
动态初始化
int[ ][ ] arr = new int[3][2];
- 操作数组的工具类-Arrays
static boolean[] copyOf(type[] original, int newLength) 复制指定的数组见下面备注
static byte[] copyOfRange(type[] original, int from, int to) 将数组的指定范围复制到一个新数组。
static boolean equals(type[] a, type[] a2) 如果两个数组长度相等和元素一一相等,则返回 true
static void fill(type[] a, type val) 将a数组所有元素都赋为val。
static void fill(type[] a, int fromIndex, int toIndex, type val) 将a数组从formIndex 到tiondex索引之间的元素都赋为val。
static void sort(type[] a) //sort(int[] arr)对指定的数组按数字升序进行排序。
static void sort(type[] a, int fromIndex, int toIndex) 对指定数组的从formIndex 到tiondex索引之间的元素按数字升序进行排序。
static String toString(type[] a) 返回指定数组内容的字符串表示形式。多个数组元素之间用英文逗号或空格隔开。
static int binarySearch(type[] a, type key) 使用二分搜索法来搜索key元素在数组中的索引;若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。
static int binarySearch(type[] a, int fromIndex, int toIndex, type key) 使用二分搜索法来搜索key元素在数组中从fromIndex到toIndex的索引;
若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。
总结:使用数组工具类可以节省时间,提高效率,注意长查阅api。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。