5.初识方法
方法就是一段代码片段,这个片段可以完成特定的功能,并且可以重复利用。
5.1 方法的定义
5.1.1方法的定义格式
[方法修饰列表] 返回值类型 方法名(方法参数列表){
方法体
}
①方法修饰列表
是可选项,方法的修饰符可以包括:public,protected,private,abstract,static, final,synchronized,其中public,protected,private 不能同时存在。
②返回值类型
如果没有返回值使用void 关键字,如果存在返回值可以是基本类型和引用类型;如果存在返回值,必须使用 return语句,return语句后面不能再执行语句,因为不可能会执行到,编译会发生错误。
③方法名:任意合法的标识符。
④方法参数列表
参数列表可以有多个,也可以没有参数。如:method1(int a,int b),多个采用逗号分割。
5.1.2普通方法示例
public class MethodTest02{ public static void main(String[] args){ //入口 //在main方法中对sumInt方法进行调用,完成功能. //注意:加有static的方法,调用的时候必须采用“类名.”的方式调用。 MethodTest02.sumInt(10,20); MethodTest02.sumInt(50,100); //调用 } //定义方法,完成两个整数的求和。 //注意:目前所有的方法请定义成public static . public static void sumInt(int a,int b){ int c = a + b; System.out.println(a + "+" + b +"=" +c); } } |
public class MethodTest03{ public static void main(String[] args){ //入口 //方法调用. MethodTest03.println("Hello World"); //"Hello World" 是实际参数(实参) //方法调用 MethodTest03.m1(13,15); MethodTest03.m2(); //调用m3 int retValue = MethodTest03.m3(100,200);
System.out.println("计算结果是:"+retValue);} //方法的定义 //方法的形式参数列表中起决定性作用的是参数的类型。 //参数的名字(局部变量的名字)是随意的只要是合法的标识符即可。 public static void println(String msg){ //String msg 是形式参数列表(形参) System.out.println(msg); } public static void m1(int a,int b){ System.out.println(a+"+"+b+"="+(a+b)); } public static void m2(){ System.out.println("呵呵"); } //该方法有返回值,程序必须使用return语句返回值。 public static int m3(int a,int b){ int c = a + b; return c; //程序执行到此处m3方法执行结束。并返回值c //return语句下面不能再有其他代码,因为根本无法执行到。 //System.out.println("ABC"); //编译无法通过。 } } |
public class MethodTest04{
//入口 public static void main(String[] args){ A.m1(); //Error:在当前类中没有m1方法. //m1(); MethodTest04.m2(); //前提:在当前类中. //类名. 可以省略 m2(); } public static void m2(){ System.out.println("m2....."); } } class A{ public static void m1(){ System.out.println("A's m1 method invoke!"); } } |
public class MethodTest06{ public static void main(String[] args){ m1(0); System.out.println("ABC"); //以下程序编译可以通过。(程序分编译期和运行期,编译期只看语法不运算) if(true){ return; } System.out.println("bjpowernode"); } |
5.2方法的重载(overload)
5.2.1重载的条件:
①方法名相同
②方法的参数类型,个数,顺序至少有一个不同
③方法的返回类型可以不同(不依靠返回类型来区分重载)
④方法的修饰符可以不同,因为方法重载和修饰符没有任何关系
⑤方法重载只出现在同一个类中
5.2.2重载的优点:
①程序员只需要记忆很少的方法名,方便调用
②代码更加美观。
public class MethodTest08{ //入口 public static void main(String[] args){ //对于程序来说需要记忆1个方法名. System.out.println(Compute.sum(10,20)); System.out.println(Compute.sum(1.0,2.0)); System.out.println(Compute.sum(10L,20L)); } //以下都构成方法重载 public static void m1(int a){} public static void m1(double a){} public static void m2(int a,int b){} public static void m2(int a){} public static void m3(int a,double b){} public static void m3(double a,int b){}
//以下两个m4方法并没有构成重载. //方法重复。错误的。 //public static void m4(int a){} //public static void m4(int b){} //方法的重载和方法的返回值类型无关. /* public static void m5(){} public static int m5(){ return 100; } */ //方法的重载和方法的修饰符列表无关 /* static void m6(){} public static void m6(){} */ } class Compute{ public static int sum(int a,int b){ return a + b; } public static double sum(double a,double b){ return a + b; } public static long sum(long a,long b){ return a + b; } } |
分析:System.out.println();这个println方法是否构成了方法的重载?
一个类中可以有多个main方法(要求与程序入口的main方法参数列表类型、个数或顺序不同),只不过是与程序入口的main方法构成了重载
public class MethodTest09{ public static void main(String[] args){ //System.out是 SUN提供的PrintStream类型 //println是PrintStream类型的方法,该方法已经构成了重载。 System.out.println(10); System.out.println(3.14); System.out.println(true); System.out.println('a'); System.out.println("Hello World!");
} } |
5.3 加深对方法的理解
5.3.1方法的执行原理
①方法在调用的时候,才会给该方法在内存中分配空间;如果这个方法只是定义没有调用,则不会在内存中分配空间。
②方法在调用的时候在“栈”中分配空间。(JVM内存中有一块内存是栈内存。)
③方法调用其实就是“压栈(push)”,方法结束其实就是“弹栈(pop)”。
5.3.2 栈的结构