java方法的学习
方法定义
方法就是一段可以重复使用的代码块。
java方法是语句的集合,它们在一起执行一个功能。
一个功能小工具
给它原料(参数)
它帮你干活
最后给你结果(返回值)
比如:
System.out.println() 就是一个方法 → 负责打印
Math.random() 也是方法 → 负责生成随机数System是系统的一个类。out是System下的一个输出对象。println()就是一个方法。
//方法的定义格式修饰符 返回值类型 方法名(参数列表){// 方法体return返回值;}- 修饰符:public static (先固定写)。告诉编译器如何调用该方法。定义了该方法的访问类型。
- 返回值类型:
- 有结果 → 写 int / String /boolean
- 没结果 → 写void
- 方法名:自己起名字(见名知意)
- 参数列表:给方法传的原料(可以没有)。参数像是一个占位符。当方法被调用时,传值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 形式参数:在方法被调用时用于接收外界输入的数据。
- 实参:调用方法时实际传给方法的数据。
- return:把结果送回去(void 不用写)
// 定义方法。没有返回值voidpublicstaticvoidsayHello(){System.out.println("Hello Java!");}// 调用sayHello();// 求两个数的和。有返回值,intpublicstaticintadd(inta,intb){//形式参数returna+b;}// 调用intsum=add(10,20);//实际参数System.out.println(sum);// 30方法必须先定义,后调用。不调用,永远不会执行
方法必须在类里面,不能嵌套方法。不能在方法里面再写一个方法。
有返回值必须用 return。没有返回值(void)不能 return 值。return一般写到方法的最后一行。
(我们的方法一般写在main方法外面)
publicclassDemo03{publicstaticvoidmain(String[]args){intmax=max(3,300);System.out.println(max);}//比大小publicstaticintmax(intnum1,intnum2){intresult=0;if(num1==num2){//程序要严谨,每一种情况都要考虑System.out.println("num1==num2");return0;//return还有中止方法的作用,如果num1==num2,放在就在此终止了。}if(num1>num2){result=num1;}else{result=num2;}returnresult;//return一般写到方法的最后一行。用result先接收我要用的值}}
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的拓展。
方法调用规则
- 普通方法调用:对象.方法 ()。普通方法就是没有static关键字。(实例方法;实例变量)
- 静态方法调用:直接写方法名 ()。前面加了 static,直接调用!
普通方法:没有 static 关键字
内存角度区别
非静态方法
随着对象创建而存在,每个对象都持有这份方法引用,多个对象就有多份关联。
存在于堆关联的实例空间。
静态方法
随着类加载就进入方法区,只存在一份,被所有对象共享。
类加载完毕就可调用,和对象是否创建无关。
调用步骤:1. 创建类的对象。2.对象名.方法名(参数)调用。3.有返回值的方法,可以用变量接收结果,也可以直接打印
普通方法调用(实例方法)
必须 new 对象才能调用!
1. 在本类 main 中调用
publicclassTest{// 普通方法publicvoidsayHello(){System.out.println("hello");}publicstaticvoidmain(String[]args){// 必须先创建对象Testt=newTest();// 对象.方法()t.sayHello();}}2. 在其他类调用
// 别的类publicclassOtherClass{publicvoidtest(){// 还是要 newTestt=newTest();t.sayHello();}}静态方法调用(static 方法)
不需要 new 对象!直接用 类名。方法 ()
1. 在本类 main 中调用
publicclassTest{// 静态方法publicstaticvoidstaticMethod(){System.out.println("静态方法");}publicstaticvoidmain(String[]args){// 直接调用staticMethod();// 标准写法:类名.方法()Test.staticMethod();}}2. 在其他类调用
publicclassOtherClass{publicvoidtest(){// 直接 类名.方法()Test.staticMethod();}}值传递(java)和引用传递
java只有值传递:基本类型传数值,引用类型传地址,统统都是值传递,原来变量不替换!Java 做不到替换变量,所以 Java 没有引用传递!Java 只有值传递。基本类型:传数值拷贝。引用类型:传地址拷贝。
方法的重载
方法重载:同一个类里,方法名相同,参数列表不同(形参不同),就是重载。(同一个名字的方法,可以干不同的事,根据传的参数自动匹配)
方法重载的三要素(必须同时满足)
- 在同一个类里
- 方法名必须完全相同
- 参数列表必须不同
- 参数个数不同
- 参数类型不同
- 参数顺序不同
与返回值无关!
System.out.println(10)、System.out.println(“字符串”)、System.out.println(3.14)。println 就是最经典的方法重载!(java虚拟机来帮我们判断的)
//方法重载publicclassDemo03{publicstaticvoidmain(String[]args){doublemax=max(3.6,3.7);System.out.println(max);}//比大小publicstaticintmax(intnum1,intnum2){intresult=0;if(num1==num2){//程序要严谨,每一种情况都要考虑System.out.println("num1==num2");return0;//return还有中止方法的作用,如果num1==num2,放在就在此终止了。}if(num1>num2){result=num1;}else{result=num2;}returnresult;}publicstaticdoublemax(doublenum1,doublenum2){doubleresult=0.0;if(num1==num2){//程序要严谨,每一种情况都要考虑System.out.println("num1==num2");return0;//return还有中止方法的作用,如果num1==num2,放在就在此终止了。}if(num1>num2){result=num1;}else{result=num2;}returnresult;}}
可变参数
Java 可变参数(Varargs,全称 Variable Arguments)(可变长参数)是 JDK 5 引入的特性,允许方法接收 0 个、1 个或多个同类型的参数,不用手动定义多个重载方法,简化代码编写。
方法返回值 方法名(参数类型...参数名)//接收任意个数同类型参数publicvoidtest(int...i){System.out.println(i[2]);}在方法声明中,在指定参数类型后加一个省略号。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通参数必须在它之前声明。
核心特点:
- 本质是数组,方法内部可以像操作数组一样使用可变参数
- 一个方法只能有一个可变参数
- 可变参数必须放在方法参数列表的最后一位
核心原理:Java 编译器会把可变参数自动封装成数组,所以:方法定义add(int... nums)≈add(int[] nums)
。调用时传入的多个参数,会被自动打包成数组传入方法
递归
递归就是A方法调用A方法!就是自己调用自己。方法内部调用自己,就是递归。(把大问题拆成一模一样的小问题)
递归的结构包括两个部分:1.递归头(出口):什么时候不再调用自己(必须有!否则死循环)。
2.递归体(自身调用):什么时候调用自己。
实际开发中,不建议用递归。递归会栈溢出,直接崩程序。(递归每调用一次自己,就会占一块内存。层数一多 → StackOverflowError,但是循环永远不会栈溢出。
