众所周知,System.out.println() 是一个用于输出的语句,那么它为什么可以输出呢?他的本质又是什么呢?
Java方法是语句的集合,他们在一起可以执行一个功能
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成一个功能,这样利于我们后期的扩展
回顾:方法的命名规则?
修饰符 返回值类型 方法名(参数类型 参数名){ …… 方法体 …… return 返回值; }
package com.gaox.method; /** * @author GAOXU */ public class Demo1 { //main方法 public static void main(String[] args) { //调用方法,可以先创建类的对象,然后用对象来调用此方法 //创建Demo1的对象 Demo1 demo = new Demo1(); int x = 3; int y = 5; //将demo.addMethod()方法的返回值存入sum中 int sum = demo.addMethod(x, y); //输出两者之和 System.out.println("两者之和为:" + sum); } /** * 求出两者之和并返回,public 为修饰符,int 为返回值类型,addMethod 为方法名 * @param x * @param y * @return */ public int addMethod(int x, int y){ //返回用 return 关键字,return 不仅可以作为返回的关键字,也可以作为结束方法的一个标识符! return (x + y); } }
demo.addMethod(x, y); //来自于上一个代码演示
Java支持两种调用方法的方式,根据方法是否返回值来选择
//将demo.addMethod()方法的返回值存入sum中 int sum = demo.addMethod(x, y); //来自于上一个代码演示
拓展了解:值传递(Java)和引用传递?(必须掌握!!!)
值传递 | 引用传递 | |
---|---|---|
根本区别 | 会创建副本(copy) | 不创建副本 |
结果 | 函数中无法改变原始对象 | 函数中可以改变原始对象 |
重载就是在一个类中,有相同函数名称,但形参不同的函数
方法的重载规则:
实现理论
package com.gaox.method; /** * @author GAOXU */ public class Demo1 { //main方法 public static void main(String[] args) { //调用方法,可以先创建类的对象,然后用对象来调用此方法 //创建Demo1的对象 Demo1 demo = new Demo1(); int x = 3; int y = 5; double dx = 10.00; double dy = 20.00; //将demo.addMethod()方法的返回值存入sum中 int sum = demo.addMethod(x, y); double dsum = demo.addMethod(dx, dy); //输出两者之和 System.out.println("两者之和为:" + sum); System.out.println("两者之和为:" + dsum); } /** * 求出两者之和并返回 * @param x * @param y * @return */ public int addMethod(int x, int y){ return (x + y); } /** * * @param x * @param y * @return */ public double addMethod(double x, double y){ return (x + y); } }
package com.gaox.method; /** * @author GAOXU */ public class Demo3 { public static void main(String[] args) { //创建类的对象 Demo3 demo3 = new Demo3(); //调用test方法,因为是可变参数,所以传多少个参数都无所谓 demo3.test(1, 2, 3, 4, 5); } /** * 可变参数 * @param i */ public void test(int ... i){ //打印输出可变参数 i 的每一位 System.out.println(i[0]); System.out.println(i[1]); System.out.println(i[2]); System.out.println(i[3]); System.out.println(i[4]); } }
A方法调用B方法,我们很容易理解,而递归方法是:A方法调用A方法,自己调用自己!
利用递归可以用简单的程序来解决一些复杂的问题,他通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
递归策略只需要少量的程序就可以描述出接替过程所需要的多次重复计算,大大减少了程序的代码量
递归的能力在于用有限的语句来定义对象的无限集合
递归结构包括两部分:
package com.gaox.method; /** * @author GAOXU */ public class Demo4 { public static void main(String[] args) { //创建对象 Demo4 demo4 = new Demo4(); //调用对象的方法 //demo4.test(); int sum = demo4.factorial(5); System.out.println(sum); } /** * 创建一个失败的递归案例:没有递归头,会陷入死循环中,请不要写出这样的代码!! */ public void test(){ test(); } /** * 输入一个数,计算其对应的阶乘(n!),并返回结果 * @param number * @return */ public int factorial(int number){ //当number等于1时,此时1!等于 1,当number != 1 时,此函数会返回 number * factorial(number - 1),达成的效果为 n * (n -1) if (number == 1){ return 1; }else { return (number * factorial(number - 1)); } } }
写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现
思路推荐:
参考代码(一定要自己先动手写!!!)
package com.gaox.method; import java.math.BigDecimal; import java.util.Scanner; /** * @author GAOXU */ public class CalculatorDemo { public static void main(String[] args) { System.out.println("欢迎来到计算机程序!请选择你需要的操作:"); System.out.println("A. 进入计算模式 B. 退出此程序"); System.out.println("请在下方输入对应选项!"); //定义类的对象,方便调用函数 CalculatorDemo calculatorDemo = new CalculatorDemo(); Scanner scanner = new Scanner(System.in); //获取第一步的操作 String str = scanner.next(); if ("A".equals(str)){ //定义循环结束的条件 int terminator = 0; while (terminator == 0){ //输入操作数 System.out.println("请输入两个操作数(用空格隔开)"); double number1 = scanner.nextDouble(); double number2 = scanner.nextDouble(); double sum; System.out.println("请选择计算操作:(输入对应选项,退出程序请出入0)"); System.out.println("1. 加法 2. 减法 3. 乘法 4. 除法"); int option = scanner.nextInt(); //对计算模式进行选择 switch (option){ case 0: terminator = -1; break; case 1: sum = calculatorDemo.addition(number1, number2); System.out.println("结果为:" + sum); break; case 2: sum = calculatorDemo.subtraction(number1, number2); System.out.println("结果为:" + sum); break; case 3: sum = calculatorDemo.multiplication(number1, number2); System.out.println("结果为:" + sum); break; case 4: System.out.println("请输入你要保留的位数:"); int scale = scanner.nextInt(); sum = calculatorDemo.division(number1, number2, scale); System.out.println("结果为:" + sum); break; default: System.out.println("错误输入!请重新输入!"); } } } } /* 解释一下,运算时不能直接使用Double进行操作是因为操作后得出的结果保留的位数会出错,不是精确表示 所以使用了如下提供的方法,会极大的提高结果的精确率 */ /** * 提供精确的加法运算 * @param number1 * @param number2 * @return */ public double addition(double number1, double number2){ BigDecimal bigDecimal1 = new BigDecimal(Double.toString(number1)); BigDecimal bigDecimal2 = new BigDecimal(Double.toString(number2)); return (bigDecimal1.add(bigDecimal2).doubleValue()); } /** * 提供精确的减法运算 * @param number1 * @param number2 * @return */ public double subtraction(double number1, double number2){ BigDecimal bigDecimal1 = new BigDecimal(Double.toString(number1)); BigDecimal bigDecimal2 = new BigDecimal(Double.toString(number2)); return (bigDecimal1.subtract(bigDecimal2).doubleValue()); } /** * 提供精确的乘法运算 * @param number1 * @param number2 * @return */ public double multiplication(double number1, double number2){ BigDecimal bigDecimal1 = new BigDecimal(Double.toString(number1)); BigDecimal bigDecimal2 = new BigDecimal(Double.toString(number2)); return (bigDecimal1.multiply(bigDecimal2).doubleValue()); } /** * 提供相对精确的除法运算 * @param number1 * @param number2 * @param scale 保留的位数 * @return */ public double division(double number1, double number2, int scale){ BigDecimal bigDecimal1 = new BigDecimal(Double.toString(number1)); BigDecimal bigDecimal2 = new BigDecimal(Double.toString(number2)); return (bigDecimal1.divide(bigDecimal2, scale, BigDecimal.ROUND_HALF_UP).doubleValue()); } }