vlambda博客
学习文章列表

【初识java】方法概念介绍

大家好我是枫晨,今天为大家介绍java中的方法,其实java中的方法就是我们c语言中介绍过的函数。

一.方法概念及使用

1.1什么是方法

方法就是将一个可能多次重复使用的代码进行模块化处理,使得让代码更好的去理解,类似于c语言中的函数。

1.2方法定义

 
   
   
 

修饰符 返回值 方法名(形式参数){ //方法体}

例如:实现一个两个整数相加的方法

 
   
   
 

public static int add(int x,int y) { return x + y;}


注意点:

1.修饰符:现阶段直接使用public static 固定搭配

  1. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void

  2. 方法名字:采用小驼峰命名

  3. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开

  4. 方法体:方法内部要执行的语句

  5. 在java当中,方法必须写在类当中

  6. 在java当中,方法不能嵌套定义

  7. 在java当中,没有方法声明一说

 

1.3方法调用

和C语言调用函数一样,方法也是同样的调用代码格式;

注意事项

定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.

一个方法可以被多次调用.

强调三点:1.参数个数匹配2.参数类型匹配3.参数顺序匹配

例:调用刚刚书写的两个整数相加的方法计算两个数字相加

 
   
   
 

public class Main { public static int add(int x,int y) { return x + y;} public static void main(String[] args) { int a = 10; int b = 20; int sum = add(a,b); System.out.println(sum); }}

1.4实参和形参的关系

首先,形参和实参的类型是必须匹配的,不能42码的脚去穿38码的鞋子,那问题就很大了,java方法中的形参其实就相当于自变量,只是在定义方法时用来接收实参的一个变量。在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体

也就是形参和实参是互相独立的两个变量,形参之间的相互交换并不会影响到实参,例如:

 
   
   
 

public class Test{ public static void main(String[] args) { int a = 10; int b = 20; swap(a,b); System.out.println("main"+a+" "+b); } public static void swap(int x ,int y) { int tmp = x; x = y; y = tmp; System.out.println(("swap: x = " + x + " y = " + y); }}//运行结果swap: a=20,b=10;main:a=10,b=20 

不难发现,swap方法中的值进行了交换,但是main方法中的a与b的值没有交换。再次印证了形参和实参是互相独立的两个变量。

这里再提到一个概念,传值调用,对于基础类型来说,形参相当于实参临时拷贝。

刚刚的swap方法其实就是main函数中的a,b将值拷贝了一份放在swap方法中的X,y中,因此对形参X,y操作并不会影响实参a,b的值。

解决方法:传引用类型参数(数组法);由于java中数组还没有介绍过,这里暂时不详细讲解这段代码:

 
   
   
 

public class Swap {public static void main(String[] args) { int[] arr = {10, 20}; swap(arr); System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);}public static void swap(int[] arr) { int tmp = arr[0]; arr[0] = arr[1]; arr[1] = tmp;}}

2.方法重载

2.1方法重载的意义

再用刚刚定义个两个整数相加的方法为例,如果我用它来计算两个浮点数的相加,编译器则会出错,因为从double到int类型可能会有精度的丢失问题,那么一般都会再定义一个专门用来计算两个浮点数的方法取名为addDouble,但是如果如果要为每一种类型都专门定义一个方法还要取很多名字,冗余不说,取名都成了一个大问题。于是乎,方法重载出现了。

2.2方法重载概念

在我们交流过程中,一个词在不同场景可能会有不同的意思,例如:”你好厉害啊“,在正常情况下应该是赞扬他人的含义,但是在一些场合,可以用于阴阳怪气别人。

在交流中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。在Java中方法也是可以重载的。

Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了

例如:

 
   
   
 

//计算两个整形相加public static int add(int x,int y) { return x + y;}//计算两个浮点型相加public static double add(double x,double y) { return x + y;}//计算3个整形相加public static int add(int x,int y,int c) { return x + y + c;}//计算2个整形和1个浮点型相加public static double add(dint x,int y,double c) { return x + y + c;}

在上面的方法中,方法名均为相同,区别在于形参的类型和个数,总结一下就是:

  1. 方法名必须相同

  2. 形式参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)

  3. 与返回值类型是否相同无关

注意:两个方法如果仅仅因为返回值不同,并不能构成方法重载

问题来了,编译器是怎么区别于不同的方法的呢?-----依靠方法签名区分

2.3方法签名

在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?

方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

 
   
   
 


public class test { //计算两个整形相加 public static int add(int x,int y) { return x + y; } //计算两个浮点型相加 public static double add(double x,double y) { return x + y; } public static void main(String[] args) { int ret = add(1,2); double ret2 = add(2.0,3.0); }}

我们利用JDK中的javap -v反汇编工具进行查看上诉代码中在编译过后的方法签名:

红框框中的内容就是两个方法的签名,第一个add:(ⅠⅠ)Ⅰ,括号内的Ⅰ代表一个Int类型,两个代表两个int类型形参,括号外的Ⅰ代表返回类型是int类型,add(DD)D同理。


java的方法使用介绍就到这里啦,内容虽然不是很多,但是细节却是满满!