当前位置: 首页 > 后端技术 > PHP

java编程的基本方法深入到

时间:2023-03-29 20:24:53 PHP

大纲方法。概述之前讲解的循环操作可以解决代码重复的问题,但是此时重复的代码一定要有规律。循环操作能解决所有的代码重复问题吗?答案肯定不是。比如对于某个函数的重复操作,就不能实现循环。我们可以使用方法。写一个飞机战争游戏,程序运行时,需要连续发射子弹。假设发射子弹这个功能需要写200行代码,那么每次发射一颗子弹,这200行代码都需要重复写,这样的程序太low了。在开发中,一定要遵循DRY原则(Don'tRepeatYouself)——不要重复自己的代码,因为重复意味着高昂的维护成本。如果要修改功能代码,必须修改每一个重复的地方。你敢保证每一个重复的地方都能改吗?你不觉得无聊吗?为了解决函数代码重复写的问题,可以将子弹发射代码抽取出来放在一个代码块中(一对{}),并给这段代码起一个唯一的名字,这样每次发射abullet可以通过这个名字直接调用发射子弹的函数代码。我们称这个代码块为方法。方法是封装在一起执行操作语句的的集合,用于完成某种功能操作。优点使程序更短更清晰。有利于程序维护。可以提高程序开发的效率。改进了代码的可重用性。定义和使用声明格式:[修饰符]方法返回值类型方法名(形参列表){方法体;返回返回值;}//方法返回值类型publicstaticintadd(inta,intb,intc){//求和intk=a+b+c;返回k;}//方法无返回值,无参数publicstaticvoidprintStar(){//打印5行5列星号for(inti=1;i<=5;i++){for(intj=1;j<=5;j++){System.out.print("*");}System.out.println();}}access修饰符:该方法允许访问的权限范围;返回值类型:如果方法不返回任何值,则指定为void;如果方法有返回值,需要指定返回值的类型,在方法体中使用return语句返回Value;方法名:定义方法的名称必须使用合法的标识符,见名称。形参列表:可以有多个参数,以逗号分隔,每个参数由参数类型和参数名称组成,以空格分隔。调用:方法定义完成后,要使用就必须调用。调用时,调用的控制权从方法调用转移到方法,当方法遇到return或}结束时,调用权交还给调用。也就是“从哪里到哪里去”的套路。方法名([实参列表])注:该方法不调用,不执行,有返回值。它接收变量或匿名接收(输出或调用)定义方法的指定形参,调用方法指定实参。方法调用需要形参和实参。相同的数字,类型匹配方法deepvoid关键字一个void方法,它不返回任何值。publicstaticvoidprint(){for(inti=1;i<=9;i++){for(intj=1;j<=i;j++){System.out.print(j+"*"+i+"="+i*j+"\t");}System.out.println();//换行}}有返回值类型的方法必须带出返回值。publicstaticintgetSum(inta,intb){returna+b;}return关键字return是退出方法或返回值。注意:return后代码不能存在于作用域内publicstaticintgetSum(inta,intb){returna+b;System.out.println("返回后不存在代码!!!");//Unreachablestatement}return语句:return语句可以出现在任何方法中(有或没有返回值)return语句用于在没有返回值的方法中提前结束方法//打印出前两个数字之间1和5publicstaticvoidtest(){for(inti=1;i<=5;i++){if(i==3){return;//结束方法}System.out.println(i);}}return语句在有返回值的方法中有两个作用:提前结束方法和发送结果。//求1~100之间能被2整除的前5的和publicstaticintgetSum(inta,intb){intsum=0;//sumfor(inti=1;i<=100;i++){sum+=i;if(i==5){返回总和;//1)提前结束方法2)带出返回值}}}一个方法只能执行一个return语句,必须执行return语句后,写入的语句为不可达语句。程序自动检测到这条语句,永远不会执行,报错。如果在循环中无条件中断后写语句,就会出现语句不可达。如果在无限循环(没有break结束的无限循环)之后写语句,就会出现无法到达的语句。思考角度编写方法时,请考虑这四个方面:1)、确定方法的功能2)、确定方法的名称3)、该方法是否可以独立运行,是否需要外部数据参与在操作中,并确定形式参数。4)本方法完成后,结果是否直接影响调用处的后续操作,如果有,则判断返回类型,如果没有,则为void签名(signature)方法的签名,保证a中的唯一性班级。方法的签名只看方法名和形参(类型号和顺序),与修饰返回类型和形参名无关。publicstaticvoidgetSum(intx,inty){}-->getSum(intx,inty)与方法签名类型兼容。调用方法时,形式参与的实参、接收类型、返回类型和返回值类型要保持兼容。①形参>=实参publicstaticvoidmain(String[]args){//inti=5;字节i=5;intx=测试(i);//i实参}publicstaticinttest(intd){//d形参return'a';}②接收类型>=返回值类型>=返回类型publicstaticvoidmain(String[]args){intx=测试(5);//x是接收到的返回值的变量类型}//int是方法的返回值类型(规定return后数据的值只能是<=int)publicstaticinttest(intd){//d形参return'a';//return后面数据的类型}值传递和引用传递值传递和引用传递:所谓值传递,就是只把对象的值传递给目标对象,相当于复制;系统会为目标对象重新开辟一块相同的内存空间。publicstaticvoidmain(String[]args){bytei=5;测试(一);//等价于test(5)-->传值System.out.println(i);//5}publicstaticvoidtest(inti){i++;//局部变量i++;}所谓引用,就是将对象在内存中的地址传递给目标对象,相当于让目标对象和原对象对应到同一个内存存储空间。此时,如果目标对象被修改,内存中的数据也会发生变化。publicstaticvoidmain(String[]args){Personp=newPerson("张三",18);测试(p);//i实参System.out.println(p.age);//引用传递|p指向对象的地址值}publicstaticvoidtest(Personp){p.age++;}内存划分:JVM内存划分:栈特性:站描述的方法执行的内存模型,每个方法调用都会创建一个栈帧()程序运行时方法内存分析:publicclassMethodTest{publicstaticvoidmain(String[]args){intw=5;整数h=7;intarea=getArea(w,h);System.out.println(面积);}//查找区域publicstaticintgetArea(intw,inth){returnw*h;}}流程1:1)程序需要运行,当执行java命令时,将classMethodTest.class的信息加载到内存中2)虚拟机JVM调用main方法,main方法压栈运行,并在栈上为main方法创建一个栈帧,存放main中出现的局部变量。intw=5;inth=35;3)main方法中调用getArea()方法,在栈中为getArea方法打开一个栈帧4)方法入栈执行赋值intw=5;形式参数为inth=7;计算结果并返回35;将result方法返回给调用者5)方法getArea执行后,弹出栈释放内存6)继续执行main方法中的内容,将局部变量intarea=35存入栈空间;将getArea方法的返回值赋值给area7)main方法执行完后,popitStack释放内存空间重载(MethodOverload)一般来说,功能点相同的方法适合重载。重载必须满足以下要求:①必须是同一个类②方法名必须相同③参数列表必须不同publicclassDemo{//无参数无返回值的普通方法publicvoidadd(){//方法体}//重载上面的方法,并带一个整型参数,无返回值publicvoidadd(inta){//方法体}//重载上面的方法,并带两个整型参数,返回值为int类型publicintadd(inta,intb){//方法体return0;}}注意:方法重载与返回值无关。参数列表不同:Parameters的个数不同。参数对应的数据类型不同。参数顺序不同(不同类型可以交换位置)递归结构递归是一种常见的解题方法,即把问题逐渐简化。递归的基本思想是调用自己”,使用递归技术的方法会直接或间接调用自己。使用递归可以用简单的程序解决一些复杂的问题。例如:大多数排序使用递归算法。递归结构由两部分组成:定义递归头。答:什么时候不调用自己的方法。如果没有头,就会陷入死循环。递归体。答:什么时候需要调用自己的方法.publicstaticvoidprint(inti){System.out.println(i);if(i==10){//递归头返回;//早期结束方法}print(++i);//递归}publicstaticvoidmain(String[]args){print(1);//打印1~10之间的数据}publicstaticvoidrecursion(inti){System.out.println("Holding");if(i==0){//临界条件System.out.println("mylittlecarp");}else{递归(--i);//递归调用}System.out.println("my");}publicstaticvoidmain(String[]args){System.但是递归调用会占用大量的系统栈,消耗大量的内存。当递归调用的层次很多时,速度要比循环慢很多。所以再次使用时要小心。注意:任何可以递归解决的问题也可以迭代解决。但递归的方式更能自然的反映问题,易于理解和调试,在不强调效率的情况下可以使用递归;在需要高性能的时候尽量避免使用递归,因为递归调用既费时又费内存。