Java方法01:什么是方法?
System.out.println()
:System类名;out对象名;println方法名。
Java方法是语句的集合,它们在一起执行一个功能。
-
方法是解决一类问题的步骤的有序组合。
-
方法包含于类或对象中。
-
方法在程序中被创建,在其他地方被引用。
设计方法的原则:一个方法只完成1个功能。
Java方法02:方法的定义和调用
Java的方法类似于C语言的函数,是一段用来完成特定功能的代码片段。
方法的定义:
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
修饰符:可选。定义了该方法的访问类型,告诉编译器如何调用该方法。
返回值类型:方法可能会有返回值,如果没有返回值,则写void
。
方法名命名规范:首字母小写和驼峰原则,如:firstSecond()
参数类型和参数名:可选。当方法被调用时,传递值给参数名。传递的值是实际参数,参数名是形式参数。
参数列表:是指方法的参数类型、顺序和个数。
方法体:包含具体的语句,是该方法的功能实现。
方法的调用
如果方法有返回值,方法调用通常被当作一个值。
int larger = max(30,40);
如果方法返回值为void,方法调用就相当于一条语句。
System.out.println("Hello, world!");
拓展
Java都是值传递。
Java方法03:方法的重载
方法的重载
重载就是在一个类中,有相同的函数名称,但形参不同的函数。
规则
方法名称必须相同。
参数列表必须不同:个数不同、类型不同、排列顺序不同(各参数不能是同一类型),满足其一即可。
方法的返回值类型可以相同也可以不同。仅仅是返回类型不同不足以成为方法的重载。
实现理论
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器会报错。
//虽然排列顺序不同,但各参数都是同一类型,会报错
//编译器匹配的时候与参数名无关,只与类型有关
public class AddMethod {
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 static int add(int b, int a){
return a+b;
}
}
package method;
public class AddMethod {
public static void main(String[] args){
double sum = add(1, 2.0);
double sum1 = add(1.0, 2);
System.out.println("sum = " + sum);
System.out.println("sum1 = " + sum1);
}
public static double add(int a, double b){
return a+b;
}
public static double add(double b, int a){
return a+b+b;
}
}
Java方法04:命令行传递参数
有时候需要在运行程序的时候再传递给它消息。这要靠传递命令行参数给main()函数实现。
package method;
public class CmdTransferPara {
public static void main(String[] args){
for (int i=0; i < args.length; i++){
System.out.println("args[" + i + "]:" + args[i]);
}
}
}
输入javac method.CmdTransferPara
会报错
需要到该类名目录下编译.java
文件,输入cd BasicGrammar\src\method
输入javac CmdTransferPara.java
尝试输入java CmdTransferPara
会报错
这时需要输入cd ..
返回到src目录下,输入java method.CmdTransferPara
能运行,但是没有输出内容
尝试输入java method.CmdTransferPara This is a test.
传递参数
成功得到正确的结果。
总结:
- 使用
javac
命令编译,需要在.java
文件名录下进行编译。 - 使用
java
命令运行,如果编译过的.java
文件有包名,则需要在包名所在目录下进行运行。
Java方法05:可变参数
JDK 1.5 开始, java支持传递同类型的可变参数给一个方法。
可变参数语法:
-
在方法声明中,在指定参数类型后加一个省略号(…)。
-
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
package method;
// 可变参数
public class VarPara {
public static void main(String[] args){
VarPara varpara = new VarPara();
varpara.test(1, 2, 3, 4, 5);
}
public void test(int x, int... i){
System.out.println("x = " + x);
//可变参数存入数组中,以数组的形式输出
System.out.println("i[0] = " + i[0]);
System.out.println("i[1] = " + i[1]);
System.out.println("i[2] = " + i[2]);
System.out.println("i[3] = " + i[3]);
}
}
package method;
// 打印可变参数中储存的最大值
public class VarParaPrintMax {
public static void main(String[] args){
printMax();
System.out.println("------------------------");
printMax(34, 3, 3, 2, 56.5);
System.out.println("------------------------");
printMax(new double[]{1, 2, 3});
}
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 of numbers is " + result);
}
}
Java方法06:递归讲解
面试常问
package method;
/*
递归调用:
如此自己调用自己会导致栈溢出
*/
public class Recursion {
public static void main(String[] args){
test();
}
public static void test(){
test();
}
}
package method;
/*
阶乘:
负数没有阶乘;
0的阶乘是1
逻辑或运算符:||
*/
public class Factorial {
public static void main(String[] args){
System.out.println("!5 = " + factorial(5));
System.out.println("!1 = " + factorial(1));
System.out.println("!0 = " + factorial(0));
System.out.println("!-2 = " + factorial(-2));
}
public static int factorial(int n){
if(n < 0){
return -1; // -1 表示阶乘不存在
}
if(n == 0 || n == 1){
return 1;
}else{
return n*(factorial(n-1));
}
}
}
package method;
import java.util.Scanner;
/**
* 写一个计算器,通过用户交互实现加减乘除功能,并且能够循环接收新的数据。
* 参考:https://blog.csdn.net/ppp_melody/article/details/116515970?spm=1001.2014.3001.5502
* 待完善:数据输入、输出;界面。
*/
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数字后回车,开始计算(退出计算,请输入非数字):");
while(scanner.hasNextDouble()){
double num1 = scanner.nextDouble();
System.out.println("请输入运算符后回车:");
String operator = scanner.next();
System.out.println("请输入数字后回车:");
double num2 = scanner.nextDouble();
System.out.println("计算结果:");
switch(operator){
case "+": add(num1, num2); break;
case "-": sub(num1, num2); break;
case "*": mul(num1, num2); break;
case "/": div(num1, num2); break;
}
System.out.println("请输入数字后回车,开始计算(退出计算,请输入非数字):");
}
scanner.close();
}
public static void add(double i, double j){
System.out.println(i+j);
}
public static void sub(double i, double j){
System.out.println(i-j);
}
public static void mul(double i, double j){
System.out.println(i*j);
}
public static void div(double i, double j){
System.out.println(i/j);
}
}