设计方法的原则
方法的本质是功能模块,就是实现一个功能的语句集合。我们设计方法的时候,最好保持方法的原子性,也就是说一个方法只完成1个功能,这样有利于我们后期的扩展。
方法命名规则
首字母小写和驼峰原则。
Java的方法就是C/C++的函数,用来实现特定功能的代码块。
方法的格式:
修饰符 返回值类型 方法名(参数类型 参数名) { ... 方法体 ... return 返回值; }
调用方法通过 对象名.方法名(实参列表)
当方法返回一个值的时候,方法调用通常被当做一个值。例如:
int larger = max(30, 40);
System.out.println("Hello,Siming");
什么是值传递?什么是引用传递?
按值调用:接收的是调用者提供的值。
按引用调用:接收的是调用者提供的地址
java是按值调用,方法参数是值传递,无论如何修改形参,都不会影响实参,因为它们复制了一份新的副本,一共有两份数据。
重载就是在一个类中,有相同的方法名,但参数不同的方法。
//方法名相同,参数列表不同 public int add(int a, int b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; }
实现理论:
有时候你希望运行一个程序的时候再给它传递信息,这时要靠传递命令行参数给main()函数实现。
package com.hongcheng.method; public class PassParameter { public static void main(String[] args) { //args.length是数组长度 for (int i = 0; i < args.length; i++) { System.out.println("args[" + i + "]:" + args[i]); } } }
需要退到包路径的上一级文件夹,即src文件夹才能成功运行字节码文件。
package com.hongcheng.method; public class VariableParameter { public static void main(String[] args) { //调用可变参数的方法 printMax(35, 32,546,6342,312); printMax(new double[]{234, 5, 32, 545}); //new double[]{234, 5, 32, 545} 等于 double[] doubles = {234, 5, 32, 545}; } //numbers的本质是数组 public static void printMax(double... numbers) { if (numbers.length == 0) { System.out.println("No argument passed"); return; } double result = numbers[0]; //找出数组里最大的数! for (int i = 1; i < numbers.length; i++) { if (numbers[i] > result) { result = numbers[i]; } } System.out.println("The max value is:" + result); } }
A方法调用B方法,我们很容易理解!
递归就是:A方法调用A方法!也就是自己调用自己。
利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归结构包括两个部分:
如何定义递归?
先定义退出递归的条件,再定义自己调用自己的语句。
无限递归会造成栈溢出:StackOverflowError
package com.hongcheng.method; public class Recursion { public static void main(String[] args) { Recursion recursion = new Recursion(); recursion.test(); } //递归,自己调用自己 public void test() { test(); } }
递归应用——阶乘:
package com.hongcheng.method; public class Recursion2 { public static void main(String[] args) { System.out.println(factorial(3)); } //阶乘 //1! 1 //2! 2*1 //5! 5*4*3*2*1 //2 2 * f(1) //3 3*f(2) f(2):2*f(1) public static int factorial(int i) { if (i == 1) { return 1; } else { return i * factorial(i - 1); } } }