写在前面
昨天给了十题编程题,如果你能有思路很快速地完成它,说明你的Java数据类型、运算符、选择语句、循环语句部分的基础知识很好,接下来就来看看后面的方法、数组以及他们在JVM中的内存划分知识吧!
方法
语句定义格式:
修饰符 返回值类型 方法名(参数类型 参数名,参数类型 参数名,......)
{
方法体;
return 返回值;
}
使用通俗一点的语言就是说,Java中定义一个方法需要指定修饰符、返回值类型(如果是空类型则写void)、方法的名字以及后面使用小括号将一个参数列表括起来,最后使用一个大括号,在里面写上方法体和return返回值。
这里的修饰符就像是public、static等修饰方法的符号,每种都有自己特殊的含义。返回值类型就是像int、String、int[][]等Java中的数据类型,也是后面return需要返回值的数据类型。方法名字自己可以取,但最好是见名知意,方法在命名时建议使用小写字母组成的单词或字符串,如果有两个及两个以上单词组合建议使用驼峰法命名,与类名区分。参数列表指的是参数的数据类型和参数的个数,比如这样定义(int a , int b)也就意味着这个方法里面有两个参数,并且这两个参数的类型都是int类型的,传入的参数也只能是int类型的参数,当然,参数可以没有也可以有很多,所以说是一个列表。最后就是方法体了,这个是方法最核心的部分,也是实现功能编写代码的地方,需要自行编写,如果有返回值,前面的返回值数据类型一定要一致,没有返回值也要在开头的返回值类型写void,不然会在运行时报错。
方法中的一些注意事项:
1、修饰符,第一次学的话,默认使用public static。
2、方法和方法是平级关系,不能嵌套定义的。
3、方法不调用不执行。
4、方法调用的时候,只需要传值就可以。
5、参数分为形式参数(方法定义小括号中的参数)和实际参数(实际调用时传入的值)。
6、若一个方法没有返回值,那么它的返回值类型是void。
7、若一个方法没有返回值,return可以省略不写。
8、若方法有返回值,那么方法内部必须要有一个return生效。
数组
数组的概述:数组是一块连续固定大小的内存空间
特点:
1、一旦创建,大小固定。
2、同一个数组、元素的数据类型是一样的。
3、具有索引下标的概念,将来可以通过索引获取元素。
4、数据查询快,增删慢。
一维数组
定义语句:数据类型[] 数组名;初始化:
静态初始化数据类型[] 数组名= new 数据类型[]{元素1,元素2,....};或 数据类型[] 数组名= {元素1,元素2,....};动态初始化数据类型[] 数组名= new 数据类型[元素的个数];
二维数组
定义语句:数据类型[][] 数组名;初始化:
静态初始化:数据类型[][] 数组名= new 数据类型[][]{{2,3,4},{2,3,4}};或 数据类型[][] 数组名={{2,3,4},{2,3,4}};动态初始化:数据类型[][] 数组名= new 数据类型[二维数组中一维数组的个数][每个一维数组中的元素个数];
数组获取长度的属性
使用属性length
使用的方式:数组名.length
可能会有很多人不清楚这个二维数组是个什么样的,可以看下面这个图有助于理解:
也就是说,定义的二维数组里面,不一定要像矩形一样,每个位置都有值。
数组在JVM中的内存划分
如图所示:
下面我就来解释一下这个图中的意思。
我们先来看代码部分,首先定义并创建了两个字符类型的一维数组,长度固定都是5,这个时候看图里的栈中的main里面会有两个字符数组arr1和arr2被定义,再看堆内存里的两个数组,下标都是从0开始的,里面都被系统进行了初始化赋值,因为是字符类型,所以都是'\u0000',这个就是系统进行赋值的默认值,就像int类型会默认赋值为0一样。
我们再继续看代码,打印了两个数组的地址,地址就是图中标红的一串16进制编码,它是这两个数组在内存中的具体位置。之后进行了两种赋值,一种是动态for循环赋值,因为a的阿斯克码为97,所以就直接i递增把值赋给每个数组的第i+1个位置就行了,第二种则是直接写死,最后使用一个方法打印出来就有了两个数组的具体内容。在内存中就是,把对应地址的内容分别改成a到e和f到j,可以看到,在栈中的main里,两个数组都是指向自己数组对应的地址的,所以我在赋值的时候,系统就会分别找到其地址并进行相应的赋值。
最后,再说说方法。方法其实很简单,就是打印一个一维的字符数组,不过是以类似[a,b,c,d,e]的格式打印出来而已,也是进行了方法调用,不用的话需要写两遍这个打印,体现了使用方法的便捷。具体实现细节可以看代码,有不清楚的可以在下面评论!欢迎指正批评!