2026/10/6 2:51:39

6-java方法

6-java方法 作用域成员变量属性域作用域在整个类体当中可以不赋值直接使用。局部变量一般是指在成员方法中定义的变量。作用域为定义它的代码块中必须赋值之后才能使用。使用细节成员变量和局部变量可以重名访问时遵循就近原则。成员变量的生命周期伴随堆内存对象指向全部消失系统CG回收。局部变量是随着栈内存中的弹栈分配的方法的空间释放局部变量也随之释放。方法method某个功能代码只需要写一遍要使用这个功能只需要给这个功能传递具体的数据这个功能完成之后返回一个最终的结果。这样的代码可以重复利用、并且职责单一提高了代码复用性。【这就是方法】方法的本质方法就是完成某个特定的功能的一段代码片段并且可以被重复调用这段代码。重复使用叫做方法的调用。规则方法定义类体当中。类体中可以有多个方法。方法编写位置没有顺序。方法体当中不能在定义方法。语法结构[修饰符列表]返回值类型 方法名(形式参数列表){方法体;}形参:形参是局部变量只在方法体内有效。 返回值类型:基本数据类型、引用类型和void普通方法体中在同一个作用域中return结束方法 关键字的语句执行return;用在主方法中表示退出程序形参中起决定性作用的不是参数的名称而是参数的类型。//m2 方法和 m3方法 的参数一样, 虽然参数的名不同但是每个位置参数的类型都相同publicstaticvoidm2(inta,intb){}publicstaticvoidm3(intd,intc){}方法的修饰符列表当中有static关键字的话怎么调用这个方法?只是一种情况类名.方法名(实际参数列表);方法名(实际参数列表);main方法是jvm负责调用程序的入口方法从这里起点开始执行程序。方法的内存分配JVM方法只定义不调用是不会执行的并且jvm中不会给该方法分配内存空间JVM内存划分上有这样三块主要的内存空间方法区、堆区、栈区(线程内存启100个线程就有100个栈内存。)关于栈数据结构栈stack, 是一种数据结构追寻规则先进后出后进先出。方法代码片段属于.class字节码文件的一部分还有类、变量、常量等字节码字节码文件在类加载时候将其放在内存的方法区当中只存一份。所以JVM中的三块主要的内存空间中方法区内存最先有数据。调用方法代码片段时候需要在栈内存中分配内存空间(主要存储方法中定义的变量、参数等一些局部变量)以便于方法执行的数据运算。这个动作叫做压栈。方法执行结束后该方法在栈内存中分配内存空间全部释放这个动作叫做出栈。一段代码的内存分析#### 方法执行过程中的内存分析publicclassMethodTest02{publicstaticvoidmain(String[]args){inta10;intb20;intresultintSum(a,b);System.out.println(Result result);}publicstaticintintSum(intj,inti){intresultij;intnum3;intretValuedivide(result,num);returnretValue;}publicstaticintdivide(intx,inty){intzx/y;returnz;}}Overload什么条件构成方法重载在同一个类当中的方法方法名称相同参数列表:数量、顺序或类型不同public class OverloadTest03 { public static void main(String args){ ... } //参数数量不同 public static void m1(){} public static void m1(int a){} //参数顺序不同 public static void m2(int a, double b){} public static void m2(double b, int a){} //参数类型不同 public static void m3(int x){} public static void m3(double y){} //编译出错 两个方法参数相同 形参中起决定性作用的是不是参数的名称而是参数的类型 //public static void m4(int a, int b){} //public static void m4(int b, int a){} }方法重载和什么没有关系方法重载和返回值类型无关方法重载和修饰符列表无关面试题//编译运行下面的代码会出现哪种情况 publicclassTest{publicvoidmyMethod(Objecto){System.out.println(My Object);}publicvoidmyMethod(Strings){System.out.println(My String);}publicstaticvoidmain(Stringargs[]){TesttnewTest();t.myMethod(null);}}输出My String原因Java 在编译期决定调用哪个重载方法而不是运行时null同时匹配两个方法但编译器会选择参数类型更具体的String而不是更宽泛的Object方法递归什么事递归方法自身调用自身。业务的层次决定了递归自身的调用层次层次多的话会很耗费栈内存的。递归必须有结束自身调用如果无止境的调用自身方法会导致程序报栈内存溢出错误Exception in thread “main” java.lang.StackOverflowError。太多次的自身调用也有可能导致栈内存溢出错误。可以不用递归尽量不使用递归。递归回溯现象从问题的某一种可能出发, 搜索从这种情况出发所能达到的所有可能, 当这一条路走到” 尽头 “的时候, 再倒回出发点, 从另一个可能出发, 继续搜索. 这种不断” 回溯 “寻找解的方法, 称作回溯法。递归执行原理图递归练习计算1~n之和publicclassRecursion{publicstaticvoidmain(String[]args){intsum1sumfor1n(10);System.out.println(sum1);intsum2sumRecursion1n(10);System.out.println(sum2);intsum3sumRecursion2n(10);System.out.println(sum3);}publicstaticintsumfor1n(intn){intresult0;for(inti1;in;i){resulti;}returnresult;}publicstaticintsumRecursion1n(intn){// 1 2 3 ... nintresult0;if(n1){resultsumRecursion1n(n-1);}resultn;returnresult;}publicstaticintsumRecursion2n(){// n n-1 n-2 ... 3 2 1//分析4 3 2 1;/** * 假如:sumRecursion2n(3)是1..3之和 那么1~4之和4 sumRecursion2n(3) * sumRecursion2n(3) 3 sumRecursion2n(2); 那么1~4之和4 3 sumRecursion2n(2) * sumRecursion2n(2) 2 sumRecursion2n(1); 那么1~4之和4 3 2 sumRecursion2n(1) * 4 3 2 1; */if(n1){return1;}returnnsumRecursion2n(n-1);}}递归程序编写的时候一般使用逆推思维如猴子吃桃问题publicclassRecursion2{publicstaticvoidmain(String[]args){inttmonkeysEatPeach(1);System.out.println(t);}//猴子吃桃问题://有一堆桃子猴子每天吃桃子总数的一半并多吃一个。吃了10天到第11天只剩一个桃子。问猴子吃之前一共是多少个桃子。//使用逆推思路// 10day n 1;// 9day n - n / 2 1 10day n (10day 1) * 2// 8day n - n / 2 1 9day n (9day 1) * 2// ...publicstaticintmonkeysEatPeach(intm){if(m10){return1;}else{return2*(monkeysEatPeach(m1)1);}}}参数传递参数的类型可以分为基本类型和引用类型基本类型实参传递是值而引用类型实参传递的是内存地址。Java中方法参数的使用情况:一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。一个方法可以改变一个对象参数的状态。一个方法不能让对象参数引用一个新的对象。对于number007.raiseSalary(5);raiseSalary方法有两个参数:第一个参数称为隐式(implicit)参数是出现在方法名前的类对象(number007)。第二个参数位于方法名后面括号中的数值这是一个显式(explicit)参数。在每一个方法中使用this关键字接受隐式参数。引用在Java中内存管理主要由垃圾收集器处理而引用主要用来访问对象。而在C中指针用于直接访问和操作内存地址因为程序员需要手动管理内存。publicclassHero{Stringname;//姓名floathp;//血量floatarmor;//护甲intmoveSpeed;//移动速度publicHero(){}publicHero(Stringname,floathp){this.namename;this.hphp;}//复活publicvoidrevive(Heroh){hnewHero(提莫,383);}publicstaticvoidmain(String[]args){HeroteemonewHero(提莫,383);//受到400伤害挂了teemo.hpteemo.hp-400;teemo.revive(teemo);//问题 System.out.println(teemo.hp); 输出多少 怎么理解}}new一个新的提姆对象改变了h变量的指向并不会改变teemo变量的hp。如果把h new Hero(提莫,383)改成h.hp383。就可以实现teemo变量的改变了。因为h和teemo指向同一对象。可变参数java 允许将同一个类中多个同名同功能但参数个数不同的方法封装成一个方法。就可以通过可变参数实现。语法格式://...是固定的写法[访问修饰符]返回类型 方法名(数据类型...形参名){//方法体}示例代码:publicclassVarParameter{publicstaticvoidmain(String[]args){HspMethodhpnewHspMethod();//调用时实参可以是多个参数ints1hp.sum(1,2,3,4,5,5,6,7);System.out.println(s1);int[]param{1,2,3,4,5,5,6,7};//调用时实参可以是数组ints2hp.sum(param);System.out.println(s2);}}//求几个数之和classHspMethod{//调用的时候可以接受多个(0~n)int参数//这块的可变参数nums本质就是数组publicintsum(int...nums){inttotal0;for(inti0;inums.length;i){totalnums[i];}returntotal;}}使用细节调用时实参可以是多个(0~n)参数也可以是数组。可变参数本质就是数组。可变参数可以和普通参数可以混合使用但是可变参数必须放在最后。一个形参列表只能出现一个可变参数。