一篇文章带你了解Java方法的使用

目录
  • 方法的基本用法
    • 方法定义
      • 基本语法格式:
      • 为什么方法一般用public static修饰?
      • 代码示例:
      • 注意事项:
    • 方法调用的调试过程
      • IDEA 的调试过程:
      • 开始调试,点击"甲壳虫"
      • 注意事项:
      • 暂停调试
      • 方法的重复调用:
    • 🔺实参和形参的关系
      • 代码示例:
      • 原因分析:
      • 解决方法:
      • 结论:
  • 方法的重载 (Overload)
    • 什么是方法重载?
      • 举例:
      • 解决方法:
    • 🔺重载和重写的区别是什么?
  • 方法的递归
    • 什么是递归?
    • 递归代码示例:
      • 代码过程分析:
      • 递归的理解
  • 总结

方法的基本用法

方法定义

方法就是一个功能

方法就是一个代码片段,类似于 C 语言中的 “函数”

基本语法格式:

//方法定义
修饰符 返回值类型 方法名称([形式参数列表 ...]){
	方法体;
 	[return 返回值];
}

注意事项:

在现阶段,方法的修饰暂时采用—> public static 固定搭配[ ]内部的表示可有可无方法必须定义在类中方法名要采用小驼峰的形式Java中的返回值可有可无,看业务需求,若有返回值,返回值类型需要和方法的返回值类型匹配行书参数列表:形参,是实参的一份拷贝方法体:具体功能的实现

为什么方法一般用public static修饰?

因为当前所有方法写完之后,若调用,都会在main方法中调用,而main方法是public static的

代码示例:

public class DemoOne {
    // 实现一个两个整数相加的方法
    public static int add(int x,int y){
        return x+y;
    }
    public static void main(String[] args) {
        int a = 212;
        int b = 454;
        //方法调用
        int ret = add(a,b);
        System.out.println(ret);
    }
}

注意事项:

  • 方法定义时,参数可以没有,若有参数,每个参数要指定类型
  • 方法定义时,返回值也可以没有,比如main方法,如果没有返回值,则返回值类型必须写成 void
  • 方法定义不能嵌套
  • Java 中没有 “函数声明” 这个概念
  • 方法必须定义在类之中,方法定义的位置在调用位置的上方或者下方均可

方法调用的调试过程

一个程序猿最厉害的不在于能写出多牛X的代码,而是能够解决代码的问题!!

IDEA 的调试过程:

打断点

开始调试,点击"甲壳虫"

点击后,会出现下边这个框

注意事项:

  • 参数传递完毕后,就会执行到方法代码体
  • 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行
  • 一个方法可以被多次调用
  • (遇到 return ) 方法执行完毕后,回到方法调用位置继续执行
  • 当方法被调用时,会将实参赋值给形参
  • Java中只有按值传递

暂停调试

方法的重复调用:

//求三个数的最大值
public static int maxThreeNum(int num1,int num2,int num3){
	return maxNum(maxNum(num1,num2),num3);     //方法的重复调用
}
//两个数的最大值
public static int maxNum(int x,int y){
    return x>y ? x : y;
}
public static void main(String[] args) {
	Scanner scan = new Scanner(System.in);
	int num1 = scan.nextInt();
	int num2 = scan.nextInt();
	int num3 = scan.nextInt();
	int max = maxThreeNum(num1,num2,num3);
	System.out.println("max="+max);
}

🔺实参和形参的关系

形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值

代码示例:

交换两个整型变量
public static void swap(int x,int y){
	int tmp = x;
	x = y;
    y = tmp;
}
public static void main(String[] args) {
   //交换两个整数
    int a = 10;
    int b = 20;
    swap(a,b);
    System.out.println(a + " " + b);
}

运行后会发现,这个方法不能实现交换两个整型变量的功能

可用类和对象 / 数组 来实现,后边会讲到

原因分析:

方法里交换的是形参 x 和 y 的值,而main方法中打印的是实参 a 和 b 的值

实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中,因此:实参a和b 与 形参x和y是两个没有任何关联性的变量,在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响。

解决方法:

这里不过多解释,之后写数组章节再作解释

public static void main(String[] args) {
	int[] arr = {10, 20};
 	swap(arr);
 	System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);
}
public static void swap(int[] arr) {
 	int tmp = arr[0];
 	arr[0] = arr[1];
 	arr[1] = tmp;
}

结论:

  • 在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体
  • 对于基础类型来说,形参相当于实参的拷贝,即:传值调用

方法的重载 (Overload)

什么是方法重载?

举例:

在方法sumInt中,若要求两小数之和,就不能实现,必须再写一个sumDouble方法,这样使用很不灵活

两整数之和
public static int sumInt(int x,int y){
    return x+y;
}
两小数之和
public static double sumDouble(double x,double y){
    return x+y;
}

解决方法:

方法1 两整数之和
public static int sum(int x,int y){
    return x+y;
}
方法2 两小数之和
public static double sum(double x,double y){
    return x+y;
}
public static void main(String[] args) {
    double a = 19.9;
    double b = 18.8;
    double ret = sum(a,b); //直接使用 sum
    System.out.println(ret);
}

上述方法1 和方法2 的关系就是重载

构成重载的 3 个条件: 

  • 方法名必须相同
  • 返回值可以不同
  • 参数列表必须不同(参数的个数不同 / 参数的类型不同)
  • (注意事项) 同一个类当中

🔺重载和重写的区别是什么?

方法的重载和重写都是实现多态的方式,区别:重载实现的是编译时的多态性,而重写实现的是运行时的多态性

①.重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同 / 参数个数不同)则视为重载
②.重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常。

重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

方法的递归

什么是递归?

一个方法在执行过程中对自身的调用,称为"递归"

  • 方法要调用自己本身
  • 要有一个趋近于终止的条件
  • 想办法推导出"递归"的公式

递归代码示例:

求n的阶乘:

public static int factor(int n){
	if(n == 1){
    	return 1;
	}
	return n * factor(n-1);
}

代码过程分析:

递归的理解

"递" "归"理解:

栈的角度理解:

方法的调用是要在栈上开辟内存的,给这个方法开辟栈帧

思考递归,要横向思考,不要试图去走进递归的代码,代码执行,是纵向执行

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java Scanner类及其方法使用图解

    1.导包 java.util:import java.util.Scanner; 2.创建对象 Scanner x=new Scanner(System.in); 3.做事情 int value=x.nextInt(); String value=x.nextLine(); nextInt(nextFloat nextByte) next nextLine 1.读取方式上来讲 大家都以回车符作为结束符号: 除了nextLine以外其余的方法都不读取回车符: 2.读取的返回结果来讲:nextInt

  • Java中方法使用的深入讲解

    方法的使用 1.方法的基本用法 什么是方法,方法就是一个代码片段,类似于C/C++ 语言中的"函数". 1.1方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候). 做到代码被重复使用, 一份代码可以在多个位置使用. 让代码更好理解更简单. 直接调用现有方法开发,不必重复造轮子. 1.2方法定义语法 基本语法: // 方法定义 public static 方法返回值 方法名称([参数类型 形参 ...]){ 方法体代码; [return 返回值]; } // 方法调用

  • Java String的intern方法使用场景示例

    在讲intern方法前,我们先简单回顾下Java中常量池的分类. 常量池的分类 Java中常量池可以分为Class常量池.运行时常量池和字符串常量池. 1. Class文件常量池 在Class文件中除了有类的版本.字段.方法.接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用. 所谓字面量类似与我们平常说的常量,主要包括以下两种 文本字符串,例如String a = "aa".其中"aa"就是字

  • Java8 Map中新增的方法使用总结

    前言 得益于 Java 8 的 default 方法特性,Java 8 对 Map 增加了不少实用的默认方法,像 getOrDefault, forEach, replace, replaceAll, putIfAbsent, remove(key, value), computeIfPresent, computeIfAbsent, compute 和merge 方法.另外与 Map 相关的 Map.Entry 也新加了多个版本的 comparingByKey 和 comparingByVal

  • 浅谈java线程join方法使用方法

    本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { //private static final Long count = 10000L; public static void main(String[] args){ long base = System.currentTimeMillis(); try { ThreadJoin t1 = new

  • 一篇文章带你入门java方法

    目录 方法的使用 什么是方法 方法的语法 基本语法 代码示例 注意事项 方法的调用 调用规则 代码示例 方法的重载 引例 使用重载 重载规则 方法递归 递归定义 代码示例 递归执行过程分析 总结 方法的使用 什么是方法 初次看到方法两字,心里有些疑惑.方法不是指为获得某种东西或达到某种目的而采取的手段与行为方式吗?这是我们日常生活中所说的方法.而在Java中, 方法就是一个代码片段,类似于C语言中的函数. 方法的存在意义: 1.当代码规模比较复杂的时候,能够模块化地组织代码. 2.做到代码被重复

  • 一篇文章带你入门Java方法详解

    目录 案例1 案例2 概念 如何定义方法 方法说明 方法实例 无参无返回值 有参无返回值 无参有返回值 有参有返回值 方法的调用 1.非静态方法 2.静态方法 小AD秀技术 总结 案例1 ♀ 小AD:明哥,刚才那个打野过来趁线你为啥不喷!那么友好的态度,被嫂子制裁了? ♂ 明世隐:你啥呀,你没看到人打野头上冒金光啊,还喷! ♀ 小AD:什么冒金光,如来佛祖? ♂ 明世隐:金色打野刀啊,那个刀不趁线的. ♀ 小AD:哦这样啊,难怪我说你不正常. ♂ 明世隐:分析一下来. 分析 打野刀 过程 结果

  • 一篇文章带你了解Java方法的使用

    目录 方法的基本用法 方法定义 基本语法格式: 为什么方法一般用public static修饰? 代码示例: 注意事项: 方法调用的调试过程 IDEA 的调试过程: 开始调试,点击"甲壳虫" 注意事项: 暂停调试 方法的重复调用:

  • 一篇文章带你了解Java Spring基础与IOC

    目录 About Spring About IOC Hello Spring Hello.java Beans.xml Test.java IOC创建对象的几种方式 Spring import settings Dependency Injection 1.构造器注入 2.set注入 3.拓展注入 P-namespcae&C-namespace Bean scopes singleton prototype Bean的自动装配 byName autowire byType autowire 小结

  • 一篇文章带你了解Java中ThreadPool线程池

    目录 ThreadPool 线程池的优势 线程池的特点 1 线程池的方法 (1) newFixedThreadPool (2) newSingleThreadExecutor (3) newScheduledThreadPool (4) newCachedThreadPool 2 线程池底层原理 3 线程池策略及分析 拒绝策略 如何设置maximumPoolSize大小 ThreadPool 线程池的优势 线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些

  • 一篇文章带你了解java Object根类中关于toString,equals的方法

    目录 toString: 代码案例: equals: 代码案例: 总结 toString: 概念:拼接对象的地址值:toString()方法用于返回表示对象值的字符串(返回的是String对象). 快捷写法:Alt+Insert,直接会显示toString的方法,选取需要返回的对象就行. 代码案例: 定义一个person类,属性如下: (1)身份证号,性别,姓名,年龄,户籍,出生日期(Data类型,需要引用java.uitl.Data)功能: (2)自我介绍:介绍格式:(toString) 身份

  • 一篇文章带你了解Java容器,面板及四大布局管理器应用

    目录 什么是容器? 什么是面板? JPanel面板 JScrollPane面板 什么是布局管理器? 绝对布局管理器 流布局管理器 边界布局管理 网格布局管理器 容器.面板.布局管理器之间的关系 总结 什么是容器? 在Java的GUI界面设计中,关于容器的理解,从字面意思我们就可以认为它是存放控件的地方,而这个地方依托在窗体之上,常用的容器是container. 而关于container容器我们应该有这样的认识:Swing组件中的窗体通常是与容器相关联的,所以在一般情况下,建立完JFrame窗体后

  • 一篇文章带你入门java面向对象

    目录 一.继承 示例: 二.重载 三.接口 1.接口与类相似点: 2.接口与类的区别: 3.语法 四.枚举 1.定义 2.迭代枚举元素 3.在 switch 中使用枚举类 总结 一.继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为 本章就以人.学生.老师作为例子.学生和老师都继承人这个对象,都有人的特征和行为,人就是父类,老师和学生就是子类 示例: 人类: package com.zhouzy.base.t7;

  • 一篇文章带你入门Java修饰符

    目录 定义 分类 访问控制修饰符 非访问控制修饰符 修饰符的使用说明 修饰类 修饰方法 访问控制修饰符 非访问控制修饰符 修饰变量 总结 定义 Java修饰符:修饰符用来定义类.方法或者变量,通常放在语句的最前端. 分类 主要分为2类: 访问控制修饰符 非访问控制修饰符 访问控制修饰符 可以使用访问控制符来保护对类.变量.方法和构造方法的访问.分为以下4中权限:private,default,protected,public. 权限说明: 修饰符 当前类 同包 子类(不同包) 不同包(其他类)

  • 一篇文章带你了解JAVA面对对象之继承与修饰符

    目录 Java面向对象之继承与修饰符 继承 1.含义 2.实现 3.好处 4.短处 5.成员变量的访问特点 7.继承中结构方法的访问特点 8.方法重写 9.java继承的注意事项 修饰符 1.package 2.import 3.权限修饰符 4.final 5.ianl修饰基本数据类型变量 6.final修饰引用数据类型变量 7.static 8.static访问的特点 总结 Java面向对象之继承与修饰符 继承 1.含义 继承是面向对象三大特征之一,能使子类具有父类的属性和方法,还可以在子类中

随机推荐