04-JavaSE:方法
一、方法
-
System.out.println()
,在之前的章节中,我们总是在用此代码,此代码有三部分组成:-
System是系统类
-
out是标准输出对象
-
println()是一个方法
-
-
什么是方法?
- Java方法是语句的集合,它们在一起执行一个功能
- 方法是解决一类问题的步骤的有序集合
- 方法包含与类或对象中
- 方法在程序中被创建,在其他地方被引用
-
设计方法的原则:
- 在设计方法的时候最好保持方法的原子性,一个方法只能完成一个功能。
-
方法的优点:
- 使程序变得更简短而清晰
- 有利于程序的维护
- 可以提高程序的开发效率
- 提高了代码的复用性
二、方法的定义
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
方法包含一个方法头和一个方法体
-
修饰符:修饰符可选,告诉编译器如何调用该方法。定义方法的访问类型
-
返回值类型:方法可能会存在返回值,returnValueType是返回值的数据类型,有的方法存在没有返回值的情况,在没有返回值的情况下,returnValueType是关键字void
-
方法名:方法的实际名称,方法名和参数表共同构成方法签名
-
参数类型:当方法被调用时,传递值给参数,这个值被称为实参或者变量
- 形式参数:在方法被调用的时候,接收调用者传递值的参数。
- 实参:调用方法时实际传给方法的值。
-
方法体:方法体包含具体的语句,定义该方法的功能。
// 计算返回的两个整型变量数据的较大值
public class Demo16 {
public static void main(String[] args){
//10,20为实参
int reault = max(10, 20);
System.out.println(result);
}
/*
如下的方法声明中,max为方法名,int为返回值为int类型,public static为修饰符
num1和num2为形参
*/
public static int max(int num1, int num2){
int result;
if (num1 > num2){
result = num1;
}else{
result = num2;
}
return result;
}
}
三、方法的调用
当程序调用一个方法时,程序的控制权交给了被调用的方法,当调用的方式执行结束后,控制权交还给程序。
- 当方法返回一个值的时候,方法调用通常被当做一个值
int larger = max(30, 40);
- 如果返回值是void,方法调用一定是一条语句,例如,方法println返回void
System.out.println("Hello, kuangshen!");
【方法的调用举例】
public class Demo16 {
public static void main(String[] args){
int i = 5;
int j = 2;
int k = max(i, j);
System.out.println(i + " 和 " + j + " 比较,最大值是: " + k);
}
public static int max(int num1, int num2) {
int result;
if (num1 > num2){
result = num1;
}else{
result = num2;
}
return result;
}
}
此程序中包含main和max方法,main方法是被JVM调用的,除此之外,main方法和其他方法没什么区别。
Java中只有值传递!!!
四、方法的重载
有时我们一个方法中形参的类型有多种类型,像上面的取最大值的函数,只能传递int类型的数,对比int的数,但是如果需要对比的是浮点数,这就需要对上面的方法进行重载。
public static double max(double num1, double num2) {
if (num1 > num2){
return num1;
}else{
return num2;
}
}
public static int max(int num1, int num2){
int result;
if (num1 > num2) {
result = num1;
}else{
result = num2;
}
return result;
}
当调用max函数时,传递的是int类型的实参,那么就会调用形参是int的函数,如果传递的实参是浮点数,那么会调用形参是double的方法。
一个类拥有两个同名的方法,但是由于形参的类型不同,方法的签名也就不同,Java是根据方法的签名来判断那个方法被调用的。
- 方法重载的规则:
- 方法名称必须相同
- 参数列表必须不同(个数相同、或类型不同、参数列表顺序不同)
- 方法的返回类型可以相同也可以不同
- 仅仅返回类型不同不足以成为方法的重载
五、拓展命令行传参
有时希望运行程序的同时还传递给消息,这种要考传递命令行参数给main函数。
传递的消息在执行程序时紧跟在程序名字后面。
public class CommandLine {
public static void main(String[] args[]) {
for (int i = 0; i < args.length; i++){
System.out.println("args[" + i +"]: " + args[i]);
}
}
}
javac CommandLine.java
java CommandLine this is a command line 200 -100
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
六、可变参数
JDK1.5 开始,java支持传递同类型的可变参数。
typeName... parameterName
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须在它之前声明。
可变参数在编译为字节码后,在方法签名中是以数组形态出现的,如果两个方法签名编译后的是一致的话,是不能编译通过的,不可以作为方法重载。
public class Demo17 {
public static void main(String args[]) {
// 调用可变参数的方法
printMax(34, 3, 3, 2, 56.5);
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 value is " + result);
}
}
七、递归
- 递归包含两部分
- 递归头:什么时候不需要调用自己的方法,如果没有头,将陷入死循环
- 递归体:什么时候需要调用自身的方法
public static void main(String[] args){
System.out.println(f(5));
}
public static int f(int n){
if (1 == n){
return 1;
}else{
return n*f(n-1);
}
}
递归其实是方便了程序员难为了机器,递归可以通过数学公式很方便的转换为程序。其优点就是易理解,容易编程。但递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。(会占用大量的内存空间)
能不用递归就不用递归,递归可以用来迭代或代替