首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >方法和数组 - 打好基础很重要

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

作者头像
BWH_Steven
发布2021-09-22 12:29:58
3080
发布2021-09-22 12:29:58
举报
文章被收录于专栏:理想二旬不止理想二旬不止

为满足移动端和PC端的双重阅读体验,以及文章质量的保证,开始重构的以及新写的文章都会基于 “语雀” 平台编写,公众号会同步刚发布的文章,但随后的修改或者更新只会在语雀中维护。

👉 点击底部左下角 “阅读原文” 即可跳转到文章最新页面!理想二旬不止@BWH_Steven

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

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("!");
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 理想二旬不止 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 方法
    • 1.1 引入
      • 1.2 定义
        • 1.3 方法的调用
          • 1.4 方法重载
          • 2. 数组
            • 2.1 概念
              • 2.2 初始化
                • 2.2.1 动态初始化
                • 2.2.2 静态初始化
              • 2.3 数组的访问
                • 2.4 数组的遍历
                  • 2.4.1 普通 for
                  • 2.4.2 增强 for
                • 2.5 二维数组
                  • 2.5.1 概念
                  • 2.5.2 格式
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档