方法
1.方法:完成特定功能的代码块,在C语言中被称为函数
2.定义方法的格式:
[修饰符] 返回值类型 方法名(形式参数列表)
{
方法体
[return 返回值;]
}
注:1.参数列表中的参数可以有一个或多个,也可以没有参数
2.return 返回到方法调用者,方法调用者也称为这个方法的隐式参数。main()方法是java的虚拟机调用的
3.在方法体中(或方法声明中)定义的变量叫做 局部变量 。局部变量通常在栈中创建,它的作用域是包含它的块。
方法的重载
方法签名:方法名和参数类型叫做方法的签名。
注:返回类型不是方法签名的一部分
在同一个类中,允许存在一个以上的同名方法,它们的参数个数和参数类型不同。这种现象就叫做方法的重载
注:1.方法的重载与其返回值类型无关,只与参数类型和参数个数有关
2.在调用过程中,虚拟机通过不同的参数列表区别同名方法,并调用相应的方法,这个过程叫做重载解析。
public class Function
{
public static int sum(int a,int b){
return a+b;
}
//该方法重载了上述sum(int a,int b)方法
public static int sum(int a,int b,int c){
return a+b+c;
}
//该方法重载了上述sum(int a,int b)方法
public static String sum(String a,int b,int c,int d){
return a+b+c+d;
}
public static void main(String[] args)
{
System.out.println(sum(1,2));
System.out.println(sum(1,2,3));
System.out.println(sum("Hello",1,3,5));
}
}
运行结果
#### 基本数据类型做参数 和 引用数据类型做参数 的区别
当形式参数是基本数据类型时,调用方法实际上是把实参拷贝一份赋给形参,形参的改变不影响实参的值。
当形式参数是引用数据类型时,调用方法实际是把实参的地址拷贝一份赋给形参,形参的改变会影响到实参的值。
2018.11.2日修改:起****************************************************************************************
将实参传递给方法(或函数),一般有以下几种
1.按值调用:表示方法接受到的是调用者提供的值。
2.按引用调用:表示方法接受的是调用者提供的变量地址。
3.按名调用(已不在使用)
java采用的是按值调用,也就是说,无论实参是基本数据类型还是引用数据类型,方法接受到的都是调用者提供的值(即把实参的值拷贝一份传递给形参)。那为什么在使用基本数据类型和引用数据类型时造成的结果不同呢?
基本数据类型的实参存储的是基本数据类型的值,而引用数据类型存储的对象的引用(即对象在堆内存中的地址)。当引用数据类型的实参传递给方法时,由于形参和实参都引用了同一个对象,所以修改形参引用对象的值就会影响到实参引用对象的值, 而基本数据类型并没有共同的引用,所以形参的变化不会影响到实参的值。
同时,由于是按值传递的。修改形参的引用并不会影响到实参的引用。
public class FunctionTest
{
public static void main(String[] args)
{
//基本类型做参数
Function t1=new Function();
//调用前
int a=3;
System.out.println("调用前:a="+a);
t1.printA(a);
//调用后
System.out.println("调用后:a="+a);
//引用数据类型做参数
Demo d1=new Demo();
//调用前
d1.age=16;
System.out.println("调用前:年龄age="+d1.age);
t1.show(d1);
//调用后
System.out.println("调用后:年龄age="+d1.age);
}
}
class Demo
{
int age;
public void show()
{
System.out.println("年龄age="+age);
}
}
class Function
{
public void printA(int a)
{
a=10;
System.out.println("printA中修改a后:a="+a);
}
public void show(Demo s)
{
s.age=45;
s.show();
}
}
运行结果
那么按引用调用是什么样子的呢?(可能大概差不多(~ ̄▽ ̄)~ 如下):
#include<stdio.h>
typedef struct {
char name[10];
int no;
}Student;
void swap(Student *b,Student *a)
{
Student p=*a;
*a=*b;
*b=p;
}
int main()
{
Student s1={"叶叶",10};
Student s2={"花花",8};
printf("s1的姓名:%s,编号:%d\n",s1.name,s1.no);
printf("s2的姓名:%s,编号:%d\n",s2.name,s2.no);
swap(&s1,&s2);
printf("s1的姓名:%s,编号:%d\n",s1.name,s1.no);
printf("s2的姓名:%s,编号:%d\n",s2.name,s2.no);
}
运行结果
2018.11.2日修改:终****************************************************************************************
String 类型做参数
String是引用数据类型,在调用方法时传递的是地址。但是在方法中改变形参的值并不会影响实际参数的值。如下
主方法把str的地址传给形参pstr,当printStr()方法中的pstr改变时,实际上是新创建了一个字符串“花花”,然后让pstr指向它(而主方法中的str的指向没变),并没有在原来的指向上进行修改。所以String类做形参时,虽然是传递地址,但是形参的变化不会影响实参的值。
public class FounctionTest
{
public static void printStr(String pstr)
{
pstr="花花";
System.out.println("方法中的pstr="+pstr);
}
public static void main(String[] args)
{
String str="叶叶";
//调用方法前
System.out.println("调用前str="+str);
printStr(str);
//调用方法后
System.out.println("调用后str="+str);
}
}
运行结果