目录
1.方法的概念
什么是方法
函数的语法格式:
调用方法
main方法
方法的分类
2.函数运行的原理
4.变量的作用域
1.方法的概念
什么是方法
函数的定义就是指一段具有独立功能的代码,减少代码冗余,提高程序的利用和效率。
我们应该如何去定义一个方法呢?
- 需要一个封闭的空间,将这段独立性的代码进行封装,用一对大括号
- 需要对每一个封闭的空间进行命名(方法名)
- 方法所需要的一些原始数据
- 方法所产生的一些结果数据
函数的语法格式:
修饰符 方法类型 返回值类型 方法名(数据类型 数据1,数据类型 数据2,······) {
独立功能的代码片段;
return 方法的计算结果;
}
- 修饰符:指的是方法的访问权限,public 、private、默认、protected
- 方法类型:方法的分类,本地方法native,静态方法static,同步方法synchroniza
- 返回值类型:指的就是方法计算结果的数据类型如果方法没有返回值则为void
- 方法名:就是方法的名称(标识符)
- 参数列表:指的就是外界向方法传入的数据(实际参数),由这些参数变量进行接受(形式参数)
- 方法体:具有独立功能的代码片段
- return:仅仅表示方法结束!如果方法有返回值,则return后跟返回值;如果没有返回值,则return可以不写,但是是存在的(隐藏在最后一行)
方法可以返回一个值。而有的方法只是为了完成某些要求的操作,而不返回值。在这种情况下就要用到关键字void,如果方法有返回值,则称为带返回值的方法,否则则称为这个方法为viod方法。
定义在方法头中的变量称为形参(数据1,数据2······)。当调用方法时给这个参数传递一个值,这个值就称之为实参。
调用方法
在方法中定义中,定义方法是为了使用它,为了使用它就必须调用它。根据方法是否有返回值,调用方法有两种途径:
1.如果方法返回了值,就把方法当作时一个值看待,可以输出它,也可以将它赋值给一个同类型的变量。
2.如果方法返回的是void对方法的调用必须是一条语句。
main方法
main方法与其他方法很类似。区别在于它是由Java虚拟机调用的。main方法就相当于一个一个的入口,每个程序都必须要有main方法。
main方法的方法头永远是一样的它包括修饰符public和static,返回值是void,方法名是main,String[]类型的参数。string[]表明参数是一个String[]型的数组。
mian方法中的的语句可以调用main方法所在类中定义的其他方法,也可以调用别的类中定义的方法。
方法的分类
根据形参和返回值还区分
1.有参带返回值
求三个数字当中的最大值
public class Sample {
public static void main(String[] args) {
//代码一:
//调用getMax方法,并将返回的值传入定义的变量max中
int max = getMax(1,2,3);
//输出接收到值后的max
System.out.println(max);
}
//定义一个带参有返回值的方法
public static int getMax (int a , int b , int c) {
//如果a大于等于c并且a大于等于c就返回a的值
if (a >= b && a >= c) {
return a;
}
//如果b大于等于a并且b大于等于c,就返回b的值
if (b >= a && b >= c) {
return b;
}
如果c大于a并且c大于b,就返回c的值
if (c >= a && c >= b) {
return c;
}
//上面的情况都不是,就返回-10000
return -10000;
//优化:
/*代码二:
if (a >= b && a >= c) {
return a;
}else if (b >= a && b >= c) {
return b;
}else {
return c;
}
*/
}
}
上述的方法中,修饰符public就加了“static”,static翻译为:静态。(在这你也可以理解为独此一份。)所以在在自己的类当中调用并不需要用类名创建一个对象去引用它。(后面我会详细将static)。代码一的最后一行“return -10000”如果不写的话会报错,是因为代码中用了三个if语句,虚拟机,会认为可能还会有没有考虑的因素。而方法二中,用了else,虚拟机自然会觉得代码将所用的因素都考虑到了。对有返回值的方法来说,return语句是必须的。
2.有参不带返回值
将三个字符串的反转,并拼接打印
public class Sample {
public static void main(String[] args) {
//调用函数print
print("123","456","789"); //输出的结果为: 321654987
}
//定义一个 带参无返回值 的输出的函数,将三个字符串连接
public static void print(String s1 , String s2 , String s3) {
System.out.println(reverse(s1) + reverse(s2) + reverse(s3));
}
//定义一个 带参有返回值 函数,将一个字符串反向输出,并返回
public static String reverse(String s) {
//定义一个空字符串
String res = "";
//for反向遍历字符串s,并传入空字符串res中
for (int i = s.length() - 1; i >= 0; i--) {
//得到反向遍历s的结果
res += s.charAt(i);
}
return res;
}
}
这个程序包含了三个方法,main方法、print方法、reverse方法。reverse方法是一个带参有返回值的方法,它将一个字符串反转并返回;print方法是一个有参无返回值的方法,调用prin方法的时候,就直接运行里面的语句,并不会返回值。
4.无参带返回值
获取当前的时间
public class Demo {
public static void main(String[] args) {
String time = getTime();
System.out.println(time);
}
//定义一个无参带返回值的方法
public static String getTime() {
//获取总毫秒值
long millis = System.currentTimeMillis();
//计算总秒数
long seconds = millis / 1000;
//计算总分钟
long minutes = seconds / 60;
//计算总小时
long hours = minutes / 60;
//计算当前小时数
long nHours = hours % 24;
//计算当前分钟
long nMinutes = minutes % 60;
//计算当前秒数
long nSeconds = seconds % 60;
return nHours + ":" + nMinutes + ":" + nSeconds;
}
}
上述程序中,/时间与现在的时间对不上,是因为返回的并不是北京时间,是其他地区的时间。
5.无参不带返回值
获取1~50的数
public static void main(String[] args) {
getSum();
}
public static void getSum() {
//定义一个接收1~50和的值
int sum = 0;
for (int i = 1; i <= 50; i++) {
//累加和
sum += i;
}
System.out.println(sum);
}
}
上述程序中,调用函数getSum函数后,getSum直接运行并输出。
2.函数运行的原理
函数的运行是基于栈运行的
栈:是一种先进后出的容器,我们这里所说的栈是指JVM中的栈内存空间
- 每一个函数,叫做栈帧,栈帧中包含的内容有函数的定义,参数列表,参数的执行内容代码
- 每一个函数要运行,就相当于这个栈帧进入到栈内存中(入栈)
- 如果一个函数即将结束,将这个栈帧从栈顶移出(出栈)
- 如果占内存有多个栈帧,运行的是最上面的栈帧,底下的栈帧暂停运行,直到该栈帧位栈顶元素。
比如:主方法先进栈,开始逐行运行,如果执行到第n行的时候,调用了方法A,则主方法暂停运行,将另一个方法A的栈帧入栈,再继续逐行运行,直到方法A内容执行完成,方法A出栈,主方法继续接着从第n行继续往下执行,以此类推。
同一个类可以出现多个同名方法,这个现象叫做方法的重载。
如何来区分同名方法是否是重载关系呢?前提是必须是同名的,和返回值类型无关(返回值类型只是与方法的计算功能相关),和访问控制无关,和形式参数名称也无关。只和形式参数的数据类型有关(参数的个数,顺序和类型)。
注意:方法的重载必须是在同一个类中。
public class BreakDemo {
public static void main(String[] args) {
System.out.println(max(2,6));
System.out.println(max(2.1,6.3));
}
public static int max(int num1, int num2) {
if(num1 > num2) {
return num1;
}else
return num2;
}
public static double max(double num1, double num2) {
if(num1 > num2) {
return num1;
}else
return num2;
}
}
上述程序中,方法max就是实现了方法的重载,调用max时候既可以传int型变量,也可以传double类型的变量。
4.变量的作用域
变量的作用域是指变量可以在程序中引用的范围。
在方法中定义的变量称为局部变量,局部变量的作用域是从声明变量的地方开始,直到包含了该变量的块结束为止。局部变量都必须在使用前进行声明和赋值。
一个方法的参数作用域覆盖整个方法,一个for循环中的声明的变量,其作用域只限于循环体内,。
代码如下:
class Demo{
public static void main(String[] args){
int z = 0;
for( int i = 0; i < 10; i++){
z++;
}
for(int i = 0; i < 10; i++){
z++;
}
System.out.print(z);
}
}
上述程序中,“z”为main方法的局部变量,“i”为for循环中的局部变量。当第一个for循环结束时,第一个循环的变量i也结束了它的使命,被虚拟机的垃圾回收机制回收了,所以第二个循环体下一次定义变量“i”时并没有报错,当在最后一行输出i的值时,会报错,因为当第二次for'循环结束了,变量“i”再一次结束了它的使命,已经不存在了。而“z”为main方法的局部变量,只有当main方法执行完成时,“z”才会被回收。