Java:方法(函数)

目录

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方法的方法头永远是一样的它包括修饰符publicstatic,返回值是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”才会被回收。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值