今天是第三天啦,哦,今天是3月30号,一个伟大的日子,本博主的生日!
今天主要简单的了解一下Java中的方法!
在上一篇文章中已经提到了方法长啥样,可能有些小伙伴会说,好像跟C语言里的函数差不多嘛(PS:原谅我会不止一次的提到C语言,毕竟这是博主写代码的启蒙语言!)。从长相上来看,确实差不多,但是地位上可差远了,Java可不是颜控哟!Java之所以称之为面向对象的语言,自然地位最高的就是类和对象,而C语言是结构化的语言,所以在C中函数才如此的重要!在Java中,方法的地位是永远赶不上类和对象的,所以,方法是不能独立存在,也不能独立执行,必须属于类或者对象。如果这个方法用了static修饰,那么这个方法属于类,也叫作静态方法,通常使用类.方法名进行调用;如果没有用static修饰,那么使用对象.方法名进行调用,再说一遍,方法只能被类或者对象调用,永远不能独立执行!!!那有的小伙伴就要反驳我了,我试过,在同一个类中,可以在一个方法中直接调用另一个方法!这其实是这么回事,在同一个类中一个方法调用另一个方法,java会自己给它加上调用者的,普通方法就用this关键字,静态方法就用类名啦!
下面我们来了解一下java方法的参数传递!在Java中,方法参数的传递方法只有一种,是值传递!值传递的意思就是说,我有一个参数,如果你方法想要我的参数,那我是不会给你参数的,我把参数的值copy一份给你用,但是参数还在我手里!官方一点的说法是,将实际参数值的副本传入方法而方法本身不受影响!下面这段代码就解释了值传递!
import java.util.*;
//值传递演示代码1
public class Main{
public static void changenum(int num1,int num2){
int temp = num1;
num1 = num2;
num2 = temp;
System.out.println("在方法中:");
System.out.println("num1 = "+num1+";num2 = "+num2);
}
public static void main(String[] args){
int num1 = 1;
int num2 = 2;
changenum(num1,num2);
System.out.println("在main中:");
System.out.println("num1 = "+num1+";num2 = "+num2);
}
}
运行结果如图:
这里可以清晰的看到在方法中,传入的副本被交换了,而在main中,原来的参数不受任何影响!
小伙伴们再来仔细的看这段代码,changenum(int num1,int num2)方法用了static修饰,也就是说,把他设定为静态方法,那么如果我把这个static去掉会怎么样呢?
import java.util.*;
//值传递演示代码2
//这段代码中和代码1的唯一区别是把 changenum(int num1,int num2)前的static去掉了
public class Main{
public void changenum(int num1,int num2){//前面没有static了哟!
int temp = num1;
num1 = num2;
num2 = temp;
System.out.println("在方法中:");
System.out.println("num1 = "+num1+";num2 = "+num2);
}
public static void main(String[] args){
int num1 = 1;
int num2 = 2;
changenum(num1,num2);
System.out.println("在main中:");
System.out.println("num1 = "+num1+";num2 = "+num2);
}
}
那么如果我们在命令行编译一下会发生什么呢?如下图:
哦哦,出错了,这个错误很好地验证了静态成员(用static修饰)不能直接访问非静态成员(不用static修饰)。因为main方法之前加了static,所以它就不能直接访问非静态的changenum方法!注意啦,是不能直接访问,想要访问,还是可以做到的!在main方法中这样写就可以啦!
Main test = new Main();
test.changenum(num1,num2);
创建个对象就搞定啦!
你以为这就是值传递?太天真了,关于值传递,还有如下这样的代码:
import java.util.*;
//值传递演示代码3
public class Main{
int num1;
int num2;
public static void changenum(Main test){
int temp = test.num1;
test.num1 = test.num2;
test.num2 = temp;
System.out.println("在方法中:");
System.out.println("num1 = "+test.num1+";num2 = "+test.num2);
}
public static void main(String[] args){
Main test = new Main();
test.num1 = 1;
test.num2 = 2;
changenum(test);
System.out.println("在main中:");
System.out.println("num1 = "+test.num1+";num2 = "+test.num2);
}
}
先来看运行结果吧:
这下方法里的main中的结果一样了,是不是就不是值传递了呢?
当然还是值传递,这次我们传的是个对象,是个引用变量,上一篇我们讲过,引用变量里面存的是个地址,那我现在把这个地址复制给另一个引用(方法中的),那么两个引用指向了同一个对象,都对同一个对象进行操作,所以无论是在方法中进行操作还是在main函数中进行操作都是一样,因为他们都指向了同一个对象呀!
关于方法,还有几个小玩意需要了解一下:
第一,方法的形参可以是不固定的!如果你不知道一个方法到底有几个形参,那么可以在最后一个形参类型后面加三个点(…)表示程序员已经疯掉了无语了妥协了因为他不知道到底有几个参数!就像这样
import java.util.*;
//形参可变演示代码
public class Main{
public static void meetingpeople(int num,String... name){
System.out.print(num);
for(String temp:name){
System.out.print(temp);
}
}
public static void main(String[] args){
meetingpeople(3,"小张","小李","小王");
}
}
运行结果:
第二,方法重载。方法重载就是说一个类中可以包含2个或者以上的同名方法,只要形参列表不一样就可以了。那么在实际调用的时候,根据方法名和形参表就可以判断出来到底调用的是哪个方法。比如下面这个例子:
import java.util.*;
//方法重载演示代码
public class Main{
public static void fangfa(){
System.out.println("我是方法1");
}
public static void fangfa(String say){
System.out.println(say);
}
public static void fangfa(int num){
System.out.println("我是方法"+num);
}
public static void main(String[] args){
Main test = new Main();
test.fangfa();
test.fangfa("我是方法2");
test.fangfa(3);
}
}
运行结果: