Java方法
1、方法
方法(函数)是语句的集合,在一起执行一个功能,方法首字母小写,驼峰命名规则。
值传递和引用传递的区分
https://blog.csdn.net/w372426096/article/details/82216742
形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。
当我们调用一个有参函数的时候,会把实际参数传递给形式参数。但是,在程序语言中,这个传递过程中传递的两种情况,即值传递和引用传递。
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
Java都是值传递,但是容易有下面一个误区:
public static void main(String[] args) {
ParamTest pt = new ParamTest();
User hollis = new User();
hollis.setName("Hollis");
hollis.setGender("Male");
pt.pass(hollis);
System.out.println("print in main , user is " + hollis);
}
public void pass(User user) {
user.setName("hollischuang");
System.out.println("print in pass , user is " + user);
}
print in pass , user is User{name='hollischuang', gender='Male'}
print in main , user is User{name='hollischuang', gender='Male'}
从上面的结果来看,貌似是引用传递,其实不是。
public static void main(String[] args) {
ParamTest pt = new ParamTest();
User hollis = new User();
hollis.setName("Hollis");
hollis.setGender("Male");
pt.pass(hollis);
System.out.println("print in main , user is " + hollis);
}
public void pass(User user) {
user = new User();
user.setName("hollischuang");
user.setGender("Male");
System.out.println("print in pass , user is " + user);
}
print in pass , user is User{name='hollischuang', gender='Male'}
print in main , user is User{name='Hollis', gender='Male'}
值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参。在判断实参内容有没有受影响的时候,要看传的的是什么,如果你传递的是个地址,那么就看这个地址的变化会不会有影响,而不是看地址指向的对象的变化。就像钥匙和房子的关系。
Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用,所以说我们改变的时候还是会改变所引用的内容的具体内容。
在求值策略中,还有一种叫做按共享传递(call by sharing)。其实Java中的参数传递严格意义上说应该是按共享传递。按共享传递,是指在调用函数时,传递给函数的是实参的地址的拷贝(如果实参在栈中,则直接拷贝该值)。在函数内部对参数进行操作时,需要先拷贝的地址寻找到具体的值,再进行操作。如果该值在栈中,那么因为是直接拷贝的值,所以函数内部对参数进行操作不会对外部变量产生影响。如果原来拷贝的是原值在堆中的地址,那么需要先根据该地址找到堆中对应的位置,再进行操作。因为传递的是地址的拷贝所以函数内对值的操作对外部变量是可见的。
简单点说,Java中的传递,是值传递,而这个值,实际上是对象的引用。
而按共享传递其实只是按值传递的一个特例罢了。所以我们可以说Java的传递是按共享传递,或者说Java中的传递是值传递。
方法的重载
重载是指在一个类中,有相同的函数名称,但形式参数不同的函数。
方法重载的规则:
方法名称必须相同、参数列表必须不同(个数、类型、参数排列的顺序)
方法的返回类型可以相同,也可以不同。
仅仅返回类型不同不足以成为方法的重载。
实现理论:
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
命令行传参
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
在命令行里面,像这样的一个主函数,我们可以在命令行里面先编译,在运行,在运行的命令后接空格 输入的参数即可
D:\Java_learning\JavaBasic\基础语法\src>java method/Demo3 li yu qi
可变参数
传递同类型的可变参数的一个方法
在方法声明中,在指定参数类型后面加一个省略号(...)
一个方法中只能指定一个可变参数,但是它必须是方法的最后一个参数,任何普通的参数必须在之前声明。
package method;
public class Demo4 {
public static void main(String[] args) {
printMax(10,20,30,40,50,60,70);
}
public static void printMax(double... numbers) {
if (numbers.length==0){
System.out.println("没有输入参数");
return;
}
double result=numbers[0];
for (int i = 1; i < numbers.length; i++) {
if (numbers[i]>result){
result=numbers[i];
}
}
System.out.println(result);
递归
自己调用自己
递归头和递归体
public static void main(String[] args) {
System.out.println(f(3));
}
public static int f(int i){
if (i==1){
return 1;
}else {
return i*f(i-1);
}
}
Java也是使用栈机制的。