1、方法的所属性
永远都不要把方法当成独立存在的实体,正如现实世界由类和对象组成,而方法只能作为类和对象的附属,Java语言里的方法也是一样的。Java语言里的方法的所属性主要体现在如下几个方面。
*方法不能独立定义,只能在类里面定义。
*方法要么属于类本身,要么属于该类的对象。用static修饰的方法属于类本身,没有用static修饰的方法属于对象。
*永远不能独立执行方法,使用static修饰的方法既可以使用类作为调用者来调用,也可以使用对象作为调用者来调用。但值得指出的是,因为使用static修饰的方法还是属于这个类的,因此使用该类的任何对象来调用这个方法时将会得到相同的执行结果,这是由于底层依然是使用这些实例所属的类作为调用者。
**增加内容**
定义方法时的修饰符可以是public protected private abstract final static,其中public protected private只能出现其一,abstract和final只能出现其一,可以和static组合使用
2、方法的参数传递机制
Java里的实参值是如何传入方法的呢?Java方法的参数传递是由参数传递机制来控制,Java的参数传递方式只有一种:值传递(就是将实际参数的副本传入方法内,而参数本身不会受到任何影响)
2.1 值传递
下面程序演示方法参数传递的效果
1 public classChange {2
3 public static voidmain(String[] args) {4 int a = 6;5 int b = 9;6 swap(a,b);7 System.out.println("交换后的a"+a+"交换后的b"+b);8
9
10 }11 public static void swap(int a,intb){12 int tmp =a;13 a =b;14 b =tmp;15 System.out.println("swap里的"+a+"swap里的b"+b);16 }17
18 }
程序运行结果:
从以上程序可以看出main方法里面的a和b的值没有改变,也就是说在调用swap方法进行值传递时,传入的a和b相当于a和b的副本,main方法中的a和b不会因为swap方法而改变。
那么既然main方法里的a和b,在值传递的时候不被改变,这样我们就可以推断出main中的a和b,与swap中的a和b在内存中是相互独立的。那么他们在内存中具体是怎么存储的呢?请看下图。
在main方法里调用swap方法时,main还没结束。因此系统为main方法和swap方法分配了两块栈区来存储,main方法和swap方法的局部变量。main方法中的a和b作为参数传入了swap方法中,实际上是在swap方法栈区中重新产生了两个变量a和b,并将main方法中的a和b的值赋给了swap方法中的a和b。此时系统中存在两个a变量和两个b变量,只是存在于不同的方法栈区而已。a和b的交换发生在swap的方法的栈区与main方法的栈区的a和b没有关系,所以在调用swap方法后main方法中的a和b的值没有发生改变。
2.2 引用传递
前面已经说过,Java的方法的参数传递只有值传递,没有所谓的引用传递,那么人们常说的引用传递究竟是怎么一回事呢?我们先来看下面的这段代码
1 public classDateWrap {2
3 inta;4 intb;5
6 }
public classTest {public static voidswap(DateWrap dw){int tmp =dw.b;
dw.b=dw.a;
dw.a=tmp;
System.out.println("swap方法里面的a"+dw.a+"swap方法里面的b"+dw.b);
}public static voidmain(String[] args) {
DateWrap dw= newDateWrap();
dw.a= 6;
dw.b= 9;
swap(dw);
System.out.println("main方法里面的a"+dw.a+"main方法里面的b"+dw.b);
}
}
从以上程序的运行结果来看,在swap方法中a和b的值交换成功,但是同时main中的a和b也被改变了,可能会让人们觉得main方法调用swap方法时传入的是dw对象的本身,而不是复制,实际上这是一种错觉。下面我们来分析一下。
为什么说这是一种错觉呢?main方法中调用swap方法时,传入的dw实际 上是传入的dw在堆内存中的地址,也就是说这里的值传递传递的是对象的堆内存的地址,而对象的属性的值还是存储在堆内存中。这样的话main方法中的dw和swap方法中的dw的地址就是相同的,那么在swap中对dw的a和b操作的时候改变的是堆内存中dw对象的属性,所以在main方法中输出a和b的值的时候,由于main方法和swap方法所指的是相同的对象,输出的a和b的值也就被改变了。**如果要让一个对象失去引用可以 对象 = null;这样的话对象没有了引用地址,也就不能指向存储在堆内存中的具体的对象。
3、参数个数可变的方法
如果在定义方法时,在最后一个形参的类型后增加三点(...),则表明该形参可以接受多个参数值,多个参数值被当成数组传入。请看下面代码。
1 public classTest {2
3
4 public static voidmain(String[] args) {5
6 text(5,"张三","李四","王五");7
8 }9 public static void text(inta,String...users){10 for(String string : users) {11 System.out.println(string);12 }13 System.out.println(a);14
15 }16
17 }
实际上可变个数的形参本质上就是数组,这样的话String...user就可以使用String[]来代替,但是在main方法中调用时需这样写:text(5,new String[]{''张三'',"李四","王五"})显然前者的代码比较简洁。
**个数可变的形参只能处于形参列表的最后,一个方法中最多只能包含一个个数可变的形参。个数可变的形参本质就是一个数组类型的形参,因此调用个数可变得形参的方法时,该个数可变的参数既可以传入多个参数,也可以传入一个数组。
4、递归方法
一个方法体内调用它自身,被称为方法递归。后续添加。。。。。。。。。。
5、方法重载
Java允许同一个类里定义多个同名方法,只要参数列表不同就行。如果同一个类中包含了两个或者两个以上方法的方法名相同,但形参列表不同,则被称为方法重载
两同一不同:同一个类 中方法名相同,参数列表不同。至于方法的其他部分如 修饰符 返回值类型等,与方法重载没有任何关系 。