一、什么是方法

  • 方法:要去做某件事情,而采取的一些解决办法( Java 中的方法是完成某些事情的)
  • System.out.println(); //类(系统类) 对象(标准输出对象) 方法(println()方法)那么它是什么?
  • Java 方法是语句的集合,它们在一起执行一个功能。
  • 方法是解决一类问题的步骤的有序组合
  • 方法包含于类或对象中
  • 方法在程序中被创建,在其它地方被引用
  • 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成 1 个功能,这样利于我们后期的扩展。
  • 回顾:方法的命名原则?
    • 首字母小写和驼峰命名原则:userAdd()
public class Method {
//main()方法
public static void main(String[] args) {
int sum = add(1, 2);
System.out.println(sum); add();
} //加法
public static int add(int a, int b){
return a + b;
} //用 for 循环输出 1~100 之间能被 5 整除的数,并且每行输出 3 个
public static void add(){
for (int i = 1; i <= 100; i++) {
if (i % 5 == 0){
System.out.print(i + "\t");
}
if (i % 15 == 0){
System.out.println();
}
}
}
}

二、方法的定义及调用

1.方法的定义

  • Java 的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
修饰符 返回值类型 方法名(参数类型 参数名){
//方法体
return 返回值;
}
  • 方法包含一个方法头和一个方法体。下面是一个方法的所有部分:

    • 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
    • 返回值类型:方法可能会返回值。返回值类型是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值,在这种情况下,返回值类型是关键字 void 。
    • 方法名:是方法的实际名称。方法名和参数列表共同构成方法签名。
    • 参数类型:参数像是一个占位符当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
      • 形参(形式参数):在方法被调用时用于接收外界输入的数据。
      • 实参(实际参数):调用方法时实际传给方法的数据。
    • 方法体:方法体包含具体的语句,定义该方法的功能。
    • return:如果方法存在返回值,一定要把返回值通过return返回出去;如果返回值类型是 void 就不用 return 了。
public class MethodDefinitionAndCall {
//main()方法
public static void main(String[] args) {
//实际参数:实际调用传递给它的参数
int sum = add(1, 2);
System.out.println(sum);
} //加法
//形式参数:用来定义作用的
public static int add(int a, int b){
return a + b;
}
}
public class MethodDefinitionAndCall {
public static void main(String[] args) {
int max = compareSize(5, 3);
System.out.println(max);
} //比较大小
public static int compareSize(int a, int b){
int max = 0;
if (a > b){
max = a;
}
if (a < b){
max = b;
}
if (a == b){
System.out.println("a == b");
return 0; // return :①返回结果;②终止方法
} return max;
}
}

2.方法调用

  • 调用方法: 对象名.方法名(实参列表)
  • Java 支持两种调用方法的方式,根据方法是否返回值来选择。
  • 当方法返回一个值的时候,方法调用通常被当做一个值。例如: int larger = max(1, 2);
  • 如果方法返回值是 void ,方法调用一定是一条语句: System.out.println("hello");
  • 了解:值传递(Java)和引用传递
    • main() 方法是被 Java 虚拟机调用的,除此之外 main() 方法和普通方法没有任何区别
    • Java 只有值传递,值传递有一个拷贝的概念

三、方法的重载

  • 重载就是在一个类中,有相同的函数名称,但形参不同的函数。

  • 方法的重载的规则:

    • 方法名称必须相同。
    • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
    • 方法的返回类型可以相同也可以不同。
    • 仅仅返回类型不同不足以成为方法的重载。
  • 实现理论:

    • 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
public class MethodOverload {
public static void main(String[] args) {
int max = compareSize(5, 3);
System.out.println(max);
} //比较大小
public static int compareSize(int a, int b) {
return a > b ? a : b;
} //比较大小
public static double compareSize(double a, double b) {
return a > b ? a : b;
} //比较大小
public static int compareSize(int a, int b, int c) {
return a > b ? a : b;
} //比较大小
public static int compareSize(double a, double b, double c) {
return a > b ? (int) a : (int) b;
}
}

四、命令行传参

  • 有时候希望运行一个程序的时候再传递给它消息,这要靠传递命令行参数给 main() 函数实现。
public class CommandLineParameterTransfer {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("args[" + i + "]" + args);
}
}
}
  1. 使用 javac -encoding utf-8 A_CommandLineParameterTransfer.java编译 Java 文件

  2. 如果使用 java A_CommandLineParameterTransfer.class执行 Java 文件会报错 错误: 找不到或无法加载主类 A_CommandLineParameterTransfer.class

    因为这个 Java 文件在 package com.minami.d_command_line_parameter_transfer;包下,

    要退回到 src目录下才能执行,然后执行 java com.minami.d_command_line_parameter_transfer.A_CommandLineParameterTransfer

    这样的话什么都不会输出,要传递参数才可以,现在传递参数 java com.minami.d_command_line_parameter_transfer.A_CommandLineParameterTransfer hello world

    输出

    args[0]hello
    args[1]world
  • 如果直接运行一个 .class 文件,需要找到包的路径然后去加载,否则是执行不了的,一定要把路径找对,才可以执行
  • main() 方法也是可以传递参数的

五、可变参数(不定项参数)

  • JDK5 开始, Java 支持传递同类型的可变参数给一个方法。
  • 在方法声明中,在指定参数类型后加一个 ...
  • 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
public class VariableParameters {
public static void main(String[] args) {
//写方法会遇见方法有很多不确定的因素
//可以用数组传好几个参数,也可以用可变参数 //调用可变参数的方法
printMax(34, 3, 3, 2, 56.5); //传递可变长参数
printMax(new double[]{1, 2, 3}); //传递数组
} //方法名字有很多重复的,参数不一样
public static void method(){}
public static void method(int a){}
public static void method(int a, int b){}
public static void method(int a, double b){} public static void printMax(double... numbers){
if (numbers.length == 0){ //没有传递参数
System.out.println("没有传递参数");
return;
} double result = numbers[0]; //排序
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] > result){
result = numbers[i];
}
}
System.out.println("最大值:" + result);
}
}

六、递归

  • A 方法调用 B 方法,我们很容易理解!

  • 递归就是: A 方法调用 A 方法!就是自己调用自己

  • 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

    public class Recursion_StackOverflowError {
    public static void main(String[] args) {
    test(); //StackOverflowError:栈溢出
    } public static void test(){
    test();
    }
    }
  • 递归结构包括两个部分:

    • 递归头(基线条件)什么时候不调用自身方法。如果没有头,将陷入死循环。(边界条件:边界)

    • 递归体(递归条件):什么时候需要调用自身方法。

      public class Recursion_Exer_Factorial {
      public static void main(String[] args) {
      //边界条件:边界,f(1)
      //前阶段:f(5)~f(2)
      //返回阶段:i * f(i - 1)
      System.out.println(factorial(5));
      } //阶乘运算
      //2! 2*1
      //3! 3*2*1
      //5! 5*4*3*2*1
      public static int factorial(int i){
      if (i == 1){
      return 1;
      } else {
      return i * factorial(i - 1); //2 * f(1)
      }
      }
      }
  • Java 都是使用栈机制的(先进后出)

  • 能不用递归就不用递归,递归可以用一些方法代替

  • 递归思想

  • 作业

    • 写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。
    • 思路推荐:
      • 写四个方法:加减乘除
      • 利用循环 + switch 进行用户交互
      • 传递需要操作的两个数
      • 输出结果
public class Recursion_Exer_Calculator {
public static void main(String[] args) {
//写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。
double result = 0;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数字:");
int a = scanner.nextInt();
System.out.println("请输入运算符:");
String next = scanner.next();
System.out.println("请输入数字:");
int b = scanner.nextInt();
switch (next) {
case "+":
result = add(a, b);
break;
case "-":
result = minus(a, b);
break;
case "*":
result = multiply(a, b);
break;
case "/":
result = divide(a, b);
break;
default:
System.out.println("运算符无效");
}
System.out.println(result);
scanner.close();
} public static int add(int a, int b) {
return a + b;
} public static int minus(int a, int b) {
return a - b;
} public static int multiply(int a, int b) {
return a * b;
} public static double divide(double a, double b) {
return a / b;
}
}

6.Java方法的更多相关文章

  1. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  2. JNI中C调用Java方法

    背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...

  3. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  4. C#调用Java方法(详细实例)

    C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL C#调用c++ C#调用 ...

  5. Android C代码回调java方法

    本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...

  6. oracle调用java方法的例子(下面所有代码都是在sql/plus中写)

    在Oracle中调用Java程序,注意:java方法必须是static类型的,如果想在JAVA中使用system.out/err输出log. 需要在oracle 中执行"call dbms_ ...

  7. Js调用Java方法并互相传参

    Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import ...

  8. HAL中通过JNI调用java方法【转】

    转载请注明本文出处:http://www.cnblogs.com/xl19862005 作者:Xandy 由于工作的需要,最近一直在研究HAL.JNI.Java方法之间互调的问题,并做了如下一些记录和 ...

  9. wrong number of arguments,java方法反射时数组参数的坑

    java方法中只有一个参数是数组,反射的时候我们不能想当然的传歌数组进去,传数组进去的时候表示多个参数. 两个数组不是一个意思啊. 我们应该把数组转为objet,这样才表示一个参数. import j ...

  10. JAVA 方法或者类的注释快捷键

    JAVA 方法或者类的注释快捷键 /*** 登录验证* @param 传入的* @return* @throws Exception*/这种注释效果 方法: 1.先敲“/”在敲两个**,然后回车 方法 ...

随机推荐

  1. 七、.net core(.NET 6)使用Serilog进行配置和实现日志记录

    使用Serilog来实现日志记录 先安装Serilog六件套神装包: 也可以对个别相应的包进行删除等,都是可以的.例如,标注的1是读取配置文件的,如果不需要通过配置文件进行操作,就可以使用这个包.2是 ...

  2. publicPath路径问题

    output: { filename: "[name].js", path:path.resolve(__dirname,"build") } 如果没有指定pu ...

  3. visudo

    修改sudo配置 sudo visudo 上面的意思是执行visudo这个命令, visudo其实就是用vi编辑器来编辑/etc/sudoers, 这个文件只能通过visudo来修改 或者在/etc/ ...

  4. windows 映射驱动器 图标显示不正常

    正常图标是这样的: 我的变成了这样: 解决方法: 注册表进入: HKEY_CURRENT_USER\SOFTWARE\Classes\Applications\Explorer.exe\Drives\ ...

  5. deeplearning模型量化实战

    deeplearning模型量化实战 MegEngine 提供从训练到部署完整的量化支持,包括量化感知训练以及训练后量化,凭借"训练推理一体"的特性,MegEngine更能保证量化 ...

  6. 图像超分辨率算法:CVPR2020

    图像超分辨率算法:CVPR2020 Unpaired Image Super-Resolution using Pseudo-Supervision 论文地址: http://openaccess.t ...

  7. IDA反汇编EXE添加一个启动时的消息框

    IDA反汇编EXE添加一个启动时的消息框 上一篇文章介绍了用OD反汇编EXE添加一个启动时的消息框,这篇文章也是实现同样的效果,这边主要的思路还是将其反汇编得到汇编代码后,然后手动修改他的逻辑首先跳转 ...

  8. 「题解」NWRRC2017 Joker

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷 P7028.gym101612J. 题意概述 有一个长度为 \(n\) 的数列,第 \(i\) 个元素的值为 \(a ...

  9. 【NX二次开发】Block UI 从列表选择部件

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  10. DFS————从普及到IOI(暴力骗分小能手)

    DFS 啦啦啦,再来水一波 先说思想吧! 背景: 深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法. ----来自度娘 一.思想 DFS算法思 ...