Java的方法后续部分
简单回顾Java的方法概念
方法,在C语言里就是函数,主要的优点就是可以复用。写函数的要求一般是,尽量一个函数完成一个功能。
例子:
比较两个整数的大小
public class Demo02 {
public static void main(String[] args){
int i=99;
int j=88;
int result=Max(i,j);
System.out.println(result);
}
public static int Max(int a,int b){
return a>b?a:b;
}
}
输出结果:
99
Java的方法的特点:
- 相对于C/C++来说一般多了public static
- 相对于C语言来说,Java的方法可以没有顺序(因为Java的方法算是类中的成员方法,所以可以没有顺序,C++的类中的成员函数也是可以没有顺序的)
解释一下Java的方法有static和没static的区别:其实就是主方法想直接调用子方法那就加static修饰,如果主方法不想直接调用子方法那就不用加static
先看例子:
有static
public class Demo02 {
public static void main(String[] args){
int i=99;
int j=88;
int result=Max(i,j);
System.out.println(result);
}
public static int Max(int a,int b){
return a>b?a:b;
}
}
没有static
public class Demo02 {
public static void main(String[] args){
int i=99;
int j=88;
int result=new Demo02().Max(i,j);
System.out.println(result);
}
public int Max(int a,int b){
return a>b?a:b;
}
}
可以看到第二个代码块中,子方法Max是没有static修饰的,然后主方法调用Max方法的时候需要先new一个主类的对象,然后才能调用Max子方法。
可以这么理解:
- 有static的时候,子方法Max是属于整个Demo02类的,所以不用实例化一个对象来调用。
- 没有static的时候,子方法Max是属于Demo02类创建出来的对象的,只有把对象创建出来才能调用这个子方法。
上面两个程序输出的结果是一样的,所以主方法想直接调用主类中的方法就加上static关键字,这个也是比较推荐的写法。
方法的重载
Java的方法比C语言的函数又多了点不一样的东西。就是Java的方法可以重载。
Java的方法重载的概念和C++里的函数重载的概念是一样的。
重载的特点:
直接看代码例子:
public class Demo03 {
public static void main(String[] args){
int num1=Max(5,3,8);
int num2=Max(5,4);
System.out.println("第一个结果: "+num1+"\t第二个结果: "+num2);
int num3=Max(8,8,8);
System.out.println("第三个结果: "+num3);
}
public static int Max(int i,int j){
return i>j?i:j;
}
public static int Max(int i,int j,int k){
if(i>j){
if(j>k){
return i;
}
else if(k>i) {
return k;
}
}
else{
if(i>k){
return j;
}
else if(k>j){
return k;
}
}
return i;
}
}
第一个结果: 8 第二个结果: 5
第三个结果: 8
上面的两个Max子方法就是重载的方法。
如果不写重载:
public class Demo03 {
public static void main(String[] args){
int num1=Fun(5,3,8);
int num2=Max(5,4);
System.out.println("第一个结果: "+num1+"\t第二个结果: "+num2);
int num3=Fun(8,8,8);
System.out.println("第三个结果: "+num3);
}
public static int Max(int i,int j){
return i>j?i:j;
}
public static int Fun(int i,int j,int k){
if(i>j){
if(j>k){
return i;
}
else if(k>i) {
return k;
}
}
else{
if(i>k){
return j;
}
else if(k>j){
return k;
}
}
return i;
}
}
结果也是一样的,但是如果有重载的话,就显得比较清楚,同样是做返回最大值的功能,那就直接把这些方法全部写成Max的子方法,让别人一看就知道是求最大值的方法。如果一个求两个数的最大值是Max,另一个求三个数的最大值是Fun当然是可以的,但是如果有10个以上呢?如果不用重载的话就不太好管理了。
Java提供的很多库中也存有方法重载的使用,就像是打印的方法
System.out.println();
这个方法也是重载的。不过,这个没有什么说服力,因为C语言中的printf()函数也可以,但是C语言的printf()函数不是重载。C语言没有重载的概念。还是上面的Max方法的例子比较有说服力。C语言中如果存在同名函数是会报错的,而Java和C++就不会,因为他们有重载的概念。
public class Demo{
public static void main(String[] args){
System.out.println("Hello");
System.out.println(99);
System.out.println(3.14);
System.out.println(2.5f);
System.out.println('A');
}
}
输出结果:
Hello
99
3.14
2.5
A
注意点:在方法重载中,没有强制的说一定要传入的参数类型和返回的参数类型一样,但为了防止混淆,一般返回值类型和传入的要相同。这个就看开发者的经验了,在写C语言的时候正常情况下也不会把返回值类型搞混淆。
方法的递归
递归的概念其实在C语言中也已经有了。递归就是方法自己调用自己的过程。当然有时也可以是两个子方法来回调用对方。
递归的特点:
- 子方法自己调用自己
- 递归要有终止递归的条件,不能让程序进入死循环
- Java因为存在重载的概念,有时候递归的终止条件会单独写成一个方法
- 递归的子方法看起来比较的简明,但是消耗的内存大
递归的简单例子:
计算1~100的累加结果:
public class Demo04 {
public static void main(String[] args){
int result=Fun(100);
System.out.println(result);
}
public static int Fun(int i){
if(i<=1){
return 1;
}
return i+Fun(i-1);
}
}
输出结果:
5050
图解:
黑色的箭头表示子方法在调用子方法,红色的表示算到最后Fun(1)的时候返回1,然后依次把累加之后的结果返回的最开始的Fun(100)。最后把最终的结果赋值给result。然后把result输出,结果就是5050。
Cukor丘克主页
|