Java开发零基础篇:day05 方法

简介: 方法

 方法

之前讲解的循环操作,可以解决的是代码重复的问题,但是此时的重复的代码必须是有规律的。那循环操作,能解决所有的代码重复吗?答案肯定是不行的,比如针对于某一种功能的重复操作,循环解决不 了,终于方法就该登场了。

举个例子:

编写一个飞机大战游戏,程序在运行过程中,需要不断地发射子弹。假设发射子弹功能需要编写200行 代码,那么,每次发射子弹都需要重复地编写这200行代码,这样的程序太low了。在开发中我们要遵循DRY原则(Don’t Repeat Youself)—— 不要重复你自己的代码,因为重复意味着维护成本很大, 如果要修改功能代码,则每一个重复的地方都要修改一次,你敢确保每个重复的地方都能改到吗?何况,你不感到厌烦吗?不无聊吗?

为了解决功能代码重复编写的问题,可以把发射子弹的代码提取出来专门放在一个代码块(一对{}) 中,并为这段代码起个唯一的名字,如此,每次发射子弹的时候直接通过这个名字就可以调用发射子弹 的功能代码了。

上述过程中,被提取出来的代码可以就是类中定义的一个方法。

image.gif编辑

方法的定义

方法:完成某一特定功能(如:求和,统计数量等)的代码块定义方法。

语法格式:

[修饰符]  返回值类型  方法名称(参数类型 参数名称1,参数类型 参数名称2){
    方法体;
    [return 返回值;]
}

image.gif

看看main方法的定义。

image.gif编辑

格式分析:

(1)修饰符:public、static等,static修饰的方法直接使用类名调用即可,目前都使用static修饰;

(2)返回类型:限定返回值的类型,方法在完成一个功能后:

如果需要给调用者返回结果,就写上返回数据的类型;

如果不需要给调用者返回结果,此时使用关键字void,表示无返回。

(3)方法名称:用于调用方法,遵循标识符规范,使用动词表示,首字母小写,采用用驼峰表示法;

(4)形式参数:方法圆括号中的变量,可以有多个;

(5)方法体:方法的{}中的代码,编写如何完成该功能的代码;

(6)return关键字:在方法体中使用return关键字。

功能1:把值返回给该方法调用者,此时该方法不能使用void修饰;

功能2:结束当前方法。

注意:方法体没有return时,方法的返回类型声明为void,表示无返回。

(7)实际参数:在调用某一个具体方法时,实际传递的参数值。

注意:

(1)方法必须定义在类中,在Java中最小的程序单元是类,必须先有类一个类中可以定义多个方法;

(2)方法和方法是平行的,不能在方法中定义另一个方法方法的定义没有先后顺序。

方法调用

(1)在MethodDemo类中,定义一个求两个整数之和的方法

方法定义分析:

求两个数之和,到底是哪两个整数?说明有两个未知的因素,使用两个int类型变量表示。该方法要求求两个数之和,必定需要给调用者返回一个结果,否则,毫无意义。

static int getSum(int a,int b){
    int c = a + b;
    return c;
}

image.gif

注意:

(1)方法中的int a和int b就是形式参数,即使参数名不叫a和b,也不影响,仅仅是变量名唯一。

(2)方法定义出来,必须要调用才能生效。

方法调用

(1)方法调用格式:因为方法是static修饰的,可以直接用方法所在类的名称调用。

(2)如果方法有返回类型,此时需要返回类型定义变量,接受方法返回的结果,并打印,这才有意义。

(3)调用方法的地方,可以称之为调用者

语法格式:

   返回值类型  变量 = 方法所在类名.方法名(实际参数);

(4)调用方法时,传递的参数2和3就是实际参数,简称参数,和顺序,类型有关。

完整代码如下:

public class MethodDemo {
    static int getSum(int a,int b){
        int c = a + b;
        return c;
    }
    public static void main(String[] args) {
        int result = MethodDemo.getSum(1, 2);
        System.out.println(result);
    }
}

image.gif

画图分析:

image.gif编辑

方法设计

(1)定义一个方法,打印指定行数的指定字符串

static void print(int line,String output){
    for (int i = 0; i < line; i++) {
        System.out.println(output);
    }
}

image.gif

调用方法:

public static void main(String[] args) {
    Demo40.print(7,"Hello");
}

image.gif

(2)定义一个方法,传入一个int数组,按照格式打印int类型数组

static  void printArray(int[] arr){
    String str = "[";
    for (int i = 0; i < arr.length; i++) {
        str = str + arr[i];
        if (i == arr.length - 1) {
            str = str + "]";
        }else {
            str = str + ",";
        }
    }
    System.out.println(str);
}

image.gif

调用方法:

public static void main(String[] args) {
    int[] arr = new int[]{1,2,3,4,5};
    Demo41.printArray(arr);
}

image.gif

(3)定义一个方法,传入一个int数组,返回指定元素在数组中第一次出现的索引

static int indexOf(int[] arr,int key){
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == key) {
            return i;
        }
    }
    return -1;
}

image.gif

调用方法:

public static void main(String[] args) {
    int[] arr = new int[]{1,2,3,4,5};
    System.out.println(Demo42.indexOf(arr, 3));
}

image.gif

(4)定义一个方法,传入一个int数组,返回该数组所有元素的平均数

static double getAvg(int[] arr){
    int total = 0;
    for (int ele: arr){
        total += ele;
    }
    return total / arr.length;
}

image.gif

调用方法:

public static void main(String[] args) {
    int[] arr = new int[]{1,2,3,4,5};
    System.out.println(Demo43.getAvg(arr));
}

image.gif

(5)定义一个方法,传入两个参数,一个double数组表示多个货品的价格,一个double类型的折扣,返回货品总价格

static double getTotalPrice(double[] arr,double cutOff){
    double total = 0;
    for (double ele: arr){
        total += ele;
    }
    return total * cutOff;
}

image.gif

调用方法:

public static void main(String[] args) {
    double[] arr = new double[]{1,2,3,4,5};
    System.out.println(Demo44.getTotalPrice(arr, 0.5));
}

image.gif

方法可变参数

在方法中传递数组有一种更简单的方式——方法的可变参数,其本质是一个语法糖,目的是让开发者写 代码更简单。

(1)方法的可变参数其底层是就是一个一维数组类型

(2)可变参数必须作为方法的最后一个参数,避免多个参数的歧义性

(3)推论:方法最多只有一个可变参数

(6)定义一个方法,传入两个参数,一个double数组表示多个货品的价格,一个double类型的折扣,返回货品总价格(使用可变参数)

static double getTotalPrice(double cutOff,double... arr){
    double total = 0;
    for (double ele: arr){
        total += ele;
    }
    return total * cutOff;
}

image.gif

调用方法:

public static void main(String[] args) {
    double[] arr = new double[]{1,2,3,4,5};
    System.out.println(Demo45.getTotalPrice(0.8, arr));
    System.out.println(Demo45.getTotalPrice(0.8, 1,5,9,7));
}

image.gif

方法重载

(1)参数列表:参数的类型 + 参数的个数 + 参数的顺序

(2)方法签名:方法名称 + 方法参数列表,在同一个类中,方法签名是唯一的,否则编译报错

方法的重载设计(Overload),表示在同一个类中,允许某方法存在一个以上的同名方法,只要它们的参数列表不同即可。

方法重载判断原则:“两同一不同”

两同:在同一个类中,方法名是相同的;

一不同:方法参数列表不同(参数类型、参数个数、参数顺序)。

只要参数类型、参数个数、参数顺序任意一个不同,就叫参数列表不同方法重载的作用:屏蔽了同一功能的方法由于参数不同所造成方法名称不同。

注意:方法重载和方法的返回值类型无关,只是一般要求返回值类型相同。

方法参数的值传递机制

基本类型参数

static void change(int x) { 
    System.out.println("change before,x=" + x); //10
  x = 100;// 修改x变量的值
  System.out.println("change after,x=" + x);//100
}
public static void main(String[] args) { 
    int a = 10;
  System.out.println("main before,a=" + a);//10 change(a);
  System.out.println("main after,a=" + a);//100? 10?
}

image.gif

输出结果:

main before,a=10
change before,x=10
change after,x=100
main after,a=10

image.gif

image.gif编辑

当把main方法中a变量的值复制一份,传递给change方法,main方法中的a变量的值不受改变。

引用类型参数

static void change(int[] arr) {
  System.out.println("change before,arr[0]=" + arr[0]);//10 arr[0] = 30;
    //修改数组中第一个元素的值
    System.out.println("change after,x[0]=" + arr[0]);//30
}
public static void main(String[] args) { 
    int[] a = new int[] { 10, 90 };
  System.out.println("main before,a[0]=" + a[0]);//10 change(a);
  System.out.println("main after,a[0]=" + a[0]);//30
}

image.gif

输出结果:

main before,a[0]=10
change before,arr[0]=10
change after,x[0]=30
main after,a[0]=30

image.gif

image.gif编辑

以上就是Java入门第五天的全部内容了。

资料文档地址:Java开发零基础篇:day05方法.pdf

目录
相关文章
|
28天前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
1月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
22天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
40 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
9天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
60 13
|
14天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
48 10
|
8天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
45 2
|
17天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
26天前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
37 4
|
26天前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
27 4
|
24天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
25 1