为满足移动端和PC端的双重阅读体验,以及文章质量的保证,开始重构的以及新写的文章都会基于 “语雀” 平台编写,公众号会同步刚发布的文章,但随后的修改或者更新只会在语雀中维护。
👉 点击底部左下角 “阅读原文” 即可跳转到文章最新页面!理想二旬不止@BWH_Steven
还记得我们的HelloWorld例程吗?我们现在对于输出语句应该已经很熟悉了
System.out.println("HelloWorld");
解释:
如果我们想要在一个类中实现一些功能,但是如果我们想要多次使用某一个功能,显然我们需要重复书写这个功能的代码多次,而方法就相当于把某些代码封装成一个模板,哪次想用直接调用就可以了。
定义:方法是定义在类中的一段独立的代码块,用来实现某个功能。
作用: 函数的主要作用是为了提高代码的复用性。 使程序简短而清晰,更加利于维护
// [] 中代表可选项,即参数不是必须的
修饰符 返回值类型 方法名 ([参数类型 参数名1, 参数类型 参数名2,...]){
执行语句
return 返回值 // 返回值的类型必须与返回值类型一致
}
public static int testMethod(int age1, int age2) {
int age = age1 + age2;
return age;
}
举例更好理解哦:最近有一场周杰伦的演唱会,我通过好多朋友帮忙一起的抢票方法,最后得到了两张票,这两张票就是“抢票”方法的返回值,我(开发者)可以对这个返回值进行任何操作,例如自己去看,或者送给朋友,甚至可以用来当草稿纸(哭…),而你帮朋友助力 "车票加速" "砍一刀",虽然你没有什么实质收货,但是确实助力成功了。
在刚开始的时候,尤其是没有学习面向对象概念的时候,其实大部分都是直接在同一个类下编写多个方法,然后再主函数中调用即可。后面学习了面向对象就会知道不同类之间的方法是怎么调用的。 举个方法调用的例子:
public class Demo {
public static void main(String[] args) {
int age = testMethod(10, 20);
System.out.println("年龄和为:" + age);
}
public static int testMethod(int age1, int age2) {
int age = age1 + age2;
return age;
}
}
我们定义了一个 testMethod 方法,参数是传入两个 int 类型的年龄,将两者取和后返回即可。而在主函数中,调用了 testMethod 方法,传入参数 10 和 20,然后接收 int 类型的返回值 age,并且输出打印了 age。 其实如果我们不需要对方法的返回值 age 进行处理的话,直接使用如下写法也是可以的。
public static void main(String[] args) {
System.out.println("年龄和为:" + testMethod(10, 20););
}
不过就前期而言,多写一步也没什么坏处。 方法中也是如此,例如对于比较两个参数值 a 和 b 是否相同 if 语句的优化
// 普通版
if(a == b){
return true;
} else{
return false;
}
// 三元运算符改进
boolean flag = ((a == b) ? true : false);
return flag;
// 直接返回三元运算符
return ((a == b) ? true : false);
// 直接返回
return a == b;
一般来说,我们都是根据作用来命名方法(方法名有意义),但是很多时候会我们会针对不同的数据类型,或者参数个数来进行操作,例如我们所要求几个数字中的最大值问题就出现了这两种问题。使用方法重载,既可以保证命名有意义,也可以避免记忆过多的不同名称
int max (int a, int b, int c);
double max (double a, double b, double c);
long max (long a, long b, long c);
int max (int a, b);
定义:用同一方法名定义多个方法,这些方法的参数个数或者参数类型不同 作用:使一个方法名赋予新的含义,使一个方法名可以多用 适用:实现细节不同的同一类功能时候 理解:其实就是使得一个方法拥有了更多的可能性,一个名称解决多种问题。 注意:
讲解数组的概念之前,我们先来举个例子,帮助一下理解:
我们在篮球场比赛中,梦之队运动员共有10名,我们分别将每个人定义为几号运动员,这样我们找某一个人的时候,我们就会先找到梦之队这支队伍,然后去找对应编号的人。而数组就像这只队伍的概念一样,而数组中的每一个元素就是每一个球员,当你需要找数组的某一个元素的时候,只需要找到你需要查找的数组(梦之队),再根据数组下标(对应编号)去寻找对应元素(球员)。这样做的好处就是,我们将一批同类型的元素整理归纳到了一起,并且标号记录。既方便了查找与使用,又避免了定义多个变量的麻烦。
概念:数组是一个容量固定,存储一些相同类型元素的顺序集合,而且所有的数组都是由连续的内存位置组成的。
dataType[] arrayRefVar; // 首选的方法
或
dataType arrayRefVar[]; // 效果相同,但不是首选方法
第一种读法:定义一个 dataType类型的数组 arrayRefvar 变量,它可以认为是 Java 风格的定义格式,推荐第一种,不过也只是编程风格不同罢了。
知道了定义后,如何真正的去创建一个数组出来呢?new 一个出来就好了。 new 的概念会在面向对象中重点阐述,这里我们只要记住即可。 在这个 new 一个数组的过程中,就会为数组开辟内存空间,为每个数组元素赋予值(内存分配问题就在下面哦)
动态初始化:只指定长度,由系统给出初始化值。
// 格式
数据类型 [] 数组名 = new 数据类型 [数组长度];
// 举例
int [] arr = new int [3];
给出初始化值,由系统决定长度,例如大括号内有3个元素,系统就会默认的创建一个长度是 3 的数组。
// 格式
数据类型 [] 数组名 = new 数据类型 [] {元素1,元素2,...};v
// 举例
int [] arr = new int [] {1,2,3};
简化格式
// 格式
数据类型 [] 数组名 = {元素1,元素2,...};
// 举例
int [] arr = {1,2,3};
数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 数组长度-1。 例如想访问 array 数组第一个元素就是 array[0] 后面我们会学习 Java 中的集合,例如 ArrayList 等,虽然我们后面基本都是以这些集合为主,但是它们的底层其实都离不开数组,所以后面学习要注意比对。
在Java中,数组是一种效率最高的存储和随机访问对象的引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但是为这种速度所付出的代价是数组对象的大小被固定,并且在其生命周期中不可改变。你可能会建议使用ArrayList,它可以通过创建一个新实例,然后把旧实例中所有的引用到移到新实例中,从而实现更多空间的自动分配。尽管通常应该首选ArrayList而不是数组、但是这种弹性需要开销,因此,ArrayList的效率比数组低很多。 ——Thinking in Java 第16章
什么是遍历?简单来说就是把数组中的每一个元素都读一遍,你可以对数组中的每一个数进行处理,又或者找到数组中那个你需要的数。
但是有时候就想哈,每一次我的数组元素数量较少的时候还可以,我数一数有多少个元素也就知道我需要遍历多少次了,但是如果数组元素太多呢,又或者我把遍历数组编写成一个方法,参数就是一个数组,不同的数组(元素数量不同),很显然需要遍历的次数是不灵活的,所以我们介绍一个更为灵活的属性——length 针对元素数量较多的数组 可以使用 length属性 获取数组的长度
public static void main(String[] args) {
int [] array = {11, 22, 33, 44, 55};
for(int i = 0; i < array.length; i++){
System.out.println(array[i]);
}
}
JDK 1.5 引进了一种新的循环类型,被称为 For-Each 循环或者增强For循环, 它能在不使用下标的情况下遍历数组。
public static void main(String[] args) {
int [] array = {11, 22, 33, 44, 55};
for (int arr : array){
System.out.println(arr);
}
}
它的功能强大就在于不必为了下标的起始值和终止值而分心,代码更加简洁,更不容易出错。 事物总是有两面性的,虽然增强for循环带来了简洁和快速,但是并不是万能的,有的时候我们必须使用传统的for循环,例如不希望遍历每一个元素,或者在循环内部需要使用下标等。 补充: 如果仅仅是想要打印数组中的所有值,我们可以利用Arrays类中的toString方法 输出后格式如下:[1,3,6,5,6]
具有两个下标的数组称为二维数组。有些数据要依赖于两个因素才能惟一地确定。 例如我们下面的这个案例一个班级有三个学生,每个学生又对应四科成绩,所以我们必须用一个二维数组来存储,第一项储存学生信息,第二项存储成绩信息
Student Number | Course1 | Course2 | Course3 | Course4 |
---|---|---|---|---|
Student1 | 55 | 66 | 58 | 77 |
Student2 | 87 | 58 | 48 | 64 |
Student3 | 65 | 78 | 70 | 56 |
例如想表示第三个学生的第四门课程如下:float a[3][4]
image.png
// 格式
type arrayName = new type[arrayLength1][arrayLenght2];
// 例子
int a[][] = new int [2][3];
type arrayName = new type[arrayLength1][];
举个例子:
String s[][] = new String[2][];
s[0] = new String[2];
s[1] = new String[3];
s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");