方法
定义:方法是语句的集合,它们在一起执行一个功能。(类似其它语言的函数)
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或者对象中
- 方法在程序中被创建,在其他地方被引用
- 在设计方法时,最好保持方法的原子性,即一个方法只完成一个功能,这样便于后期扩展
eg:System.out.println(),这里System是一个类,out是类中的对象,println()表示一个方法
// 加法
public static void main(String[] args) {
int add = add(1, 2);
System.out.println(add);
}
public static int add(int a, int b){ // static代表类变量,int代表返回类型。不加static无法直接调用【需要对象,static达到类似全局变量的效果】,若int改为void则无需return
return a+b;
}
组成部分:
- 方法头
- 修饰符:可选,告诉编译器如何调用该方法,定义了该方法的访问类型(如static、public)
- 返回值类型:方法的返回值,若无需返回,则用官架子void
- 方法名:方法名和参数表共同构成方法签名
- 参数类型:可选,可以不包含任何参数。参数像一个占位符。当方法被调用是,传递给参数。这个值被称为实参或者变量。参数列表是指方法的参数类型、顺序和参数的个数。
- 形式参数:在方法被调用时用于接受外界输入的数据(如a,b)
- 实参:调用方法时实际传给方法的数据(如1,2)
- 方法体:方法包含的具体语句,定义该方法的功能(注意return,除void都要有return,并且可以包含多个return,但最后一个语句一般为return。return可以用来终止方法)
扩展:public【借鉴[对java中public、static的理解](对java中public、static的理解_yxpandjay的博客-CSDN博客_public static)】
-
public:表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
-
private:表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
-
protected:对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
-
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly
方法调用:
-
调用方法:对象名.方法名(实参列表)
-
根据是否有返回值来选择使用方法
-
有返回值:
int sum = add(1,2);
-
返回值为void,方法调用一定是一条语句(如println方法)
System.out.println("hello");
-
扩展:值传递和引用传递(java都是值传递pass-by-value)【借鉴[Java 到底是值传递还是引用传递?](Java 到底是值传递还是引用传递? - 知乎 (zhihu.com))】
-
值传递:pass by value,指在调用函数时,将实际参数赋值一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数
-
引用传递:pass by reference,只在调用函数时,将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数
-
通常直接传递变量中的值。但当值的内容是对象的引用时,传递的内容是一个地址,如果对地址中的内容做了修改,则会影响原本的变量的值,但这并不影响java是值传递。
方法的重载
定义:在同一个类中,有相同的函数名称,但是形参不同的函数(即编译器选择方法的机制)
public static int add(int a, int b){
return a+b;
}
public static double add(double a,double b){
return a+b;
}
规则:
- 方法名称必须相同参数列表必须不同(参数个数不同,类型不同,排列顺序不同)
- 方法的返回类型可以相同也可以不同
- 仅仅返回类型不同不足以成为方法的重载
实现理论:方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错
命令行传参
运行程序时,再传递参数。可以通过传递命令行参数给main()函数来实现
public static void main(String[] args) {
// args.length 数组长度
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
// 在命令行中输入:java xxx Hello world
// 注:找到包的位置才可以使用
可变参数(不定向参数)
-
jdk1.5开始,java支持传递同类型的可变参数给一个方法
-
本质是一个数组
-
在方法的声明中,在指定参数类型后加一个省略号(…)
public static void main(String[] args) { test(1,2,3); } public static void test(int... i){ System.out.println(i[0]); // 通过下标取出 }
-
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明
递归(能不用就不用)
【如果调用自身的次数太多了,会影响电脑性能】
定义:正常情况下,A方法调用B方法,递归就是A方法调用A方法,自己调用自己
思想:利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
作用:递归策略只需少量的程序就可以描述出解题过程所需的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限的集合
组成:
- 递归头:什么时候不调用自身方法。如果没有递归头,将陷入死循环
- 递归体:什么时候需要调用自身方法
// 2! 2*1
// 3! 3*2*1
// 5! 5*4*3*2*1
public static void main(String[] args) {
int a = test(5);
System.out.println("a:"+a);
}
public static int test(int n){
if (n==1){ // 递归头
return 1;
}else{ // 递归体
return n*test(n-1);
}
}
案例(实现一个最最简易的计算器)
// 计算器
public static void main(String[] args) {
System.out.println("现在开始做运算!");
Scanner in = new Scanner(System.in);
// char ch = in.next().charAt(0); // 输入符号
/* 只能实现个位数的运算
String ch = in.next(); // 输入字符串
String[] arr=ch.split("");
double i = Double.parseDouble(arr[0]); // 字符串转换成double
String cha = arr[1];
double j = Double.parseDouble(arr[2]);*/
System.out.print("输入第一个数:");
double i = in.nextDouble();
System.out.print("输入运算符:");
String cha = in.next();
System.out.print("输入第二个数:");
double j = in.nextDouble();
// System.out.println("i:"+i+"\tj:"+j+"\tcha:"+cha);
double res;
switch (cha){
case "+": // 通过转义将+ - * /作为字符串
res = add(i,j);
System.out.println("result:"+res);
break;
case "-":
res = del(i,j);
System.out.println("result:"+res);
break;
case "*":
res = multiply(i,j);
System.out.println("result:"+res);
break;
case "/":
if (j == 0){
System.out.println("Divisor cannot be 0!");
break;
}else{
res = division(i,j);
System.out.println("result:"+res);
break;
}
default:
System.out.println("目前仅支持+ - * /,请稍后再试~");
}
}
public static double add(double... n){
double sum=0;
for (int i = 0; i < n.length; i++) {
sum = sum + n[i];
}
return sum;
}
public static double del(double... n){
double res=n[0];
for (int i = 1; i < n.length; i++) {
res = res - n[i];
}
return res;
}
public static double multiply(double n,double m){
return n*m;
}
public static double division(double n,double m){
return n/m;
}