方法和数组 - 打好基础很重要

1. 方法

1.1 引入

还记得我们的HelloWorld例程吗?我们现在对于输出语句应该已经很熟悉了

 System.out.println("HelloWorld");

解释:

  • System 是系统类。

  • out 是标准输出对象。

  • println() 是一个方法。

如果我们想要在一个类中实现一些功能,但是如果我们想要多次使用某一个功能,显然我们需要重复书写这个功能的代码多次,而方法就相当于把某些代码封装成一个模板,哪次想用直接调用就可以了。

1.2 定义

定义:方法是定义在类中的一段独立的代码块,用来实现某个功能。

  • 其实我们在编程界中更喜欢叫它们为函数,但是在Java中我们也可以叫做方法

作用:
函数的主要作用是为了提高代码的复用性。
使程序简短而清晰,更加利于维护

// [] 中代表可选项,即参数不是必须的
修饰符 返回值类型 方法名 ([参数类型 参数名1, 参数类型 参数名2,...]){
    执行语句
    return 返回值 // 返回值的类型必须与返回值类型一致
}
public static int testMethod(int age1, int age2) {
    int age = age1 + age2;
    return age;
}

  • 修饰符: public static:public 代表公开的,static 是静态的,这样才能在 主函数中调用。具体我们会在后面具体介绍修饰符和 static 的知识。

  • 返回值类型: 就是功能结果的数据类型,因为有一些方法需要将最后的结果返回给你,从而让开发者使用这个结果。而有一些方法执行代码中的命令即可,执行后就可以结束了,并没有返回值(void)

举例更好理解哦:最近有一场周杰伦的演唱会,我通过好多朋友帮忙一起的抢票方法,最后得到了两张票,这两张票就是“抢票”方法的返回值,我(开发者)可以对这个返回值进行任何操作,例如自己去看,或者送给朋友,甚至可以用来当草稿纸(哭…),而你帮朋友助力 "车票加速" "砍一刀",虽然你没有什么实质收货,但是确实助力成功了。

  • 参数类型:参数的数据类型主方法可以调用其他方法,其他方法可以互相调用,但不能调用主方法,主函数是系统调用的。

1.3 方法的调用

在刚开始的时候,尤其是没有学习面向对象概念的时候,其实大部分都是直接在同一个类下编写多个方法,然后再主函数中调用即可。后面学习了面向对象就会知道不同类之间的方法是怎么调用的。
举个方法调用的例子:

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;

1.4 方法重载

一般来说,我们都是根据作用来命名方法(方法名有意义),但是很多时候会我们会针对不同的数据类型,或者参数个数来进行操作,例如我们所要求几个数字中的最大值问题就出现了这两种问题。使用方法重载,既可以保证命名有意义,也可以避免记忆过多的不同名称

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);

定义:用同一方法名定义多个方法,这些方法的参数个数或者参数类型不同
作用:使一个方法名赋予新的含义,使一个方法名可以多用
适用:实现细节不同的同一类功能时候
理解:其实就是使得一个方法拥有了更多的可能性,一个名称解决多种问题。
注意:

  1. 函数的返回类型不同,但参数个数和类型相同,不是重载 。

  2. 重载函数的的参数个数,参数类型,参数顺序至少有一个需要不同 。

2. 数组

2.1 概念

讲解数组的概念之前,我们先来举个例子,帮助一下理解:

我们在篮球场比赛中,梦之队运动员共有10名,我们分别将每个人定义为几号运动员,这样我们找某一个人的时候,我们就会先找到梦之队这支队伍,然后去找对应编号的人。而数组就像这只队伍的概念一样,而数组中的每一个元素就是每一个球员,当你需要找数组的某一个元素的时候,只需要找到你需要查找的数组(梦之队),再根据数组下标(对应编号)去寻找对应元素(球员)。这样做的好处就是,我们将一批同类型的元素整理归纳到了一起,并且标号记录。既方便了查找与使用,又避免了定义多个变量的麻烦。

概念:数组是一个容量固定,存储一些相同类型元素的顺序集合,而且所有的数组都是由连续的内存位置组成的。

dataType[] arrayRefVar; // 首选的方法
或
dataType arrayRefVar[]; // 效果相同,但不是首选方法

第一种读法:定义一个 dataType类型的数组 arrayRefvar 变量,它可以认为是 Java 风格的定义格式,推荐第一种,不过也只是编程风格不同罢了。

2.2 初始化

知道了定义后,如何真正的去创建一个数组出来呢?new 一个出来就好了。
new 的概念会在面向对象中重点阐述,这里我们只要记住即可。
在这个 new 一个数组的过程中,就会为数组开辟内存空间,为每个数组元素赋予值(内存分配问题就在下面哦)

2.2.1 动态初始化

动态初始化:只指定长度,由系统给出初始化值。

  • 也就是说,我们只告诉系统,我们需要一个多大容量的数组,但是我们在初始化的时候还不去赋值,这个时候其实系统会在背后默认为数组设置一个初始值。例如 int 类型的数组就会默认赋值 0。

// 格式
数据类型 [] 数组名 = new 数据类型 [数组长度];
// 举例
int [] arr = new int [3];

2.2.2 静态初始化

给出初始化值,由系统决定长度,例如大括号内有3个元素,系统就会默认的创建一个长度是 3 的数组。

// 格式
数据类型 [] 数组名 = new 数据类型 [] {元素1,元素2,...};v
// 举例
int [] arr = new int [] {1,2,3};

简化格式

// 格式
数据类型 [] 数组名 = {元素1,元素2,...};
// 举例
int [] arr = {1,2,3};

2.3 数组的访问

数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 数组长度-1。
例如想访问 array 数组第一个元素就是 array[0]
后面我们会学习 Java 中的集合,例如 ArrayList 等,虽然我们后面基本都是以这些集合为主,但是它们的底层其实都离不开数组,所以后面学习要注意比对。

在Java中,数组是一种效率最高的存储和随机访问对象的引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但是为这种速度所付出的代价是数组对象的大小被固定,并且在其生命周期中不可改变。你可能会建议使用ArrayList,它可以通过创建一个新实例,然后把旧实例中所有的引用到移到新实例中,从而实现更多空间的自动分配。尽管通常应该首选ArrayList而不是数组、但是这种弹性需要开销,因此,ArrayList的效率比数组低很多。
                               ——Thinking in Java 第16章

2.4 数组的遍历

什么是遍历?简单来说就是把数组中的每一个元素都读一遍,你可以对数组中的每一个数进行处理,又或者找到数组中那个你需要的数。

2.4.1 普通 for

但是有时候就想哈,每一次我的数组元素数量较少的时候还可以,我数一数有多少个元素也就知道我需要遍历多少次了,但是如果数组元素太多呢,又或者我把遍历数组编写成一个方法,参数就是一个数组,不同的数组(元素数量不同),很显然需要遍历的次数是不灵活的,所以我们介绍一个更为灵活的属性——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]);
    }
}

2.4.2 增强 for

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]

2.5 二维数组

2.5.1 概念

具有两个下标的数组称为二维数组。有些数据要依赖于两个因素才能惟一地确定。
例如我们下面的这个案例一个班级有三个学生,每个学生又对应四科成绩,所以我们必须用一个二维数组来存储,第一项储存学生信息,第二项存储成绩信息

Student NumberCourse1Course2Course3Course4
Student155665877
Student287584864
Student365787056

例如想表示第三个学生的第四门课程如下:float a[3][4]

image.png

2.5.2 格式

// 格式
type arrayName = new type[arrayLength1][arrayLenght2];
// 例子
int a[][] = new int [2][3];

  • arrayLength1 为行数(表示这个二维数组有多少个一维数组)

  • arrayLenght2 为列数(表示这个一维数组的元素个数)

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("!");

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淋风沐雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值