什么是方法?
方法是最小的程序单元
方法就好比是一个工具:
设计出一个功能复杂的工具首先需要画出设计图来确定工具的功能;对于方法而言,定义方法就是画设计图的过程,调用方法就是使用工具的过程
方法的作用
①方法可以减少重复的代码,从而增加代码的可读性
②提高代码的可维护性
以下我们举出两段代码来解释上面两个作用
package zhiyin;
class adw {
public static void main(String[] args) {
int a1 =10,b1 =10;
int a2 =20,b2 =20;
int a3 =30,b3 =30;
int c1 =a1 *b1 + (a1 +b1);
int c2 =a2 *b2 + (a2 +b2);
int c3 =a3 *b3 + (a3 +b3);
}
}
改进后的代码如下:
package zhiyin;
class adw {
public static void main(String[] args) {
int a1 =10,b1 =10;
int a2 =20,b2 =20;
int a3 =30,b3 =30;
int c1 =test(a1,b1);
int c2 =test(a2,b2);
int c3 =test(a3,a3);
}
public static int test(int a,int b) {
int c = a * b + (a + b);
return c;
}
}
设想如果我们要执行很多很多次一个相同的操作而仅仅是代入数值不同,那我们得敲多少代码呀(增强可读性)
设想如果我们要改变原来的操作,那我们得改多久啊,有了方法之后,我们只需改变方法中的操作即可(增强可维护性)
方法的定义和调用
方法的定义
方法实际上就是个一段代码,指定一个名称,以保证代码可以重复利用。使用某段代码可以使用方法名称+参数列表进行调用即可。

方法的核心要素
方法名:需要符合标志符定义规范,首字母小写
( ):方法名后必须带有圆括号,此为方法的标记
参数列表:方法名后放的圆括号中包含多个变量定义,每个变量称为形式参数,允许用户通过该参数提交信息给方法加工。多个形式参数变量之间使用“,”分隔
返回值类型:没有返回值,也有返回值类型,是void,返回值类型与方法体中的return后所跟的数据的数据类型保持一致。
方法体:方法标记圆括号后方需要有一对花括号
方法签名:方法名+形参数据类型列表
方法在哪里定义
任何一个类体内都可以
class A{
public static void test(){
}
}
class B{ //含有main方法的类是主类,B类是主类
public static void test(){
}
public static void main(String[] args){ //这是定义main方法
}
}
方法的调用
方法可以在main方法或其它自定义方法中被调用
方法可以在main方法中被调用
class A{
public static void test(int x){
}
}
class B{
public static void main(String[] args){
//调用A类中的test方法,字面值做实参,x=10
A.test(10);
//调用A类中的test方法,变量做实参,x=a
int a = 100;
A.test(a);
//调用A类中的tes方法,表达式做实参,x=20*a
A.test(20*a);
//调用A类中的test方法,其他方法的返回值做实参,x=Math.abs(a)
A.test(Math.abs(a));
}
}
方法可以在其它自定义方法中被调用
class A{
public static void test(){
}
public static void test2(int x){
}
public static void test2(int x,int y){
System.out.println(x+y);
}
public static void test2(String x){
System.out.println(x);
}
public static void test3(){
String str = "hello";
test2(str);
test2("world");
}
}
class B{
public static void test(){
}
public static void main(String[] args){
//调用B类的test方法,因为B.test()与main在同一个类体中
test();//允许简写,直接调用即可,也可以写B.test()
//调用A类的test方法,应为A.test()与main不在同一个类体中
A.test();//需要指明完整路径,类名.方法名
//方法匹配,根据调用语句如何匹配要执行的方法是谁?
A.test2(10);
A.test2("hello");
A.test2(10,20);
//方法的层级调用
A.test3();//说说代码怎么执行的?
}
}
方法标签
这里再介绍一个概念“方法标签”
public static void test2(String x){ //此方法对应的方法标签为:test2-String
System.out.println(x);
}
public static void test3(int x,int y){ //此方法对应的方法标签为:test2-int-int
System.out.println(x+y);
}
综上得知
方法标签:方法名-参数类型列表
方法的重载
1.同一个类中,方法名相同而参数不同的方法之间就构成了重载(与返回值类型无关)
2.参数不同:个数不同、类型不同、顺序不同(只要满足一种就说明“参数不同”)
例题:判断方法之间是否构成重载关系


方法的内存原理
我们先讲一个新的概念“栈帧”
栈帧:即栈中方法的空间。(以方法为单位的空间)

以下列代码为例
1.package zhiyin;
2.class adw {
3. public static void main(String[] args) {
4. int i = 5;
5. int j = 2;
6. int k = max(i,j);
7. System.out.println(
8. "The maximum between " + i +
9. " and" + j + " is " + k
10. );
11. }
12. public static int max(int num1,int num2) {
13. int result;
14. if(num1 > num2)
15. result = num1;
16. else
17. result = num2;
18. return result;
19. }
20.}






方法的入栈原理
这里引入一个压子弹原理
我们知道手枪中最先压入的子弹是最后一个打出来的,而最后压入的子弹是第一个打出来的,方法的入栈操作也是如此。
方法的分类
- main方法,是程序的入口
- 自定义的静态方法,(static修饰),使用方式,类名.方法名,一般处理的数据都是外部提供的
- 自定义的非静态方法(成员方法),使用方式,对象引用.方法名,一般处理的是对象那的数据
- 构造方法,方法名与类名相同,不定义任何返回值类型,没有返回值这个属性,new后边调用的就是构造方法
—————————————————————————————————————
未完