
跟日记本一起学JAVA相信你可以的加油~本课闯关内容1.照猫画虎0/62.基础知识(0/4...———————————————————————————————————————————那我们今天主要学习的是函数这并不像我们通常说数学意义上的函数期待吧我好久没发了。咱们输入代码经常会出现一些代码的重复代码量太大了例如你使用for循环时你要输入好几个for循环并且这几个for循环你还要输入好几次你就傻愣愣的硬输入那么多这就是在Java中称作代码的冗余嗯~这时就需要Java中的函数。存在的问题代码冗余代码量太大维护性差复制容易修改难如何解决此问题对反复的代码只写一次并对它起个名字想使用次功能代码时只需要通过名字执行对应的功能即可。基础知识1一、函数的概念【理解】概念执行特定功能代码组成的一个整体可以通过名字就是你给函数它起一个名字反复使用。使用函数流程定义函数 函数的声明 约定函数实现功能 --名字函数的实现实现对应的函数约定的功能。--将特点功能代码给出函数的调用通过函数名让函数执行对应的功能代码。你一引用它的名字它就听话的起它的作用重点 函数的定义位置定义在类以内与main函数并列的位置。class不就是类吗看下面第一个照猫画虎代码里面写着1-不可以4-可以等等...就是这些我们一般写在5的位置二.函数的定义【重点】语法就是公式public static 返回值类型 函数名(数据类型 变量名,数据类型 变量2){// 函数的功能代码-函数的实现(函数体)}三.函数的声明public static 返回值类型 函数名(数据类型 变量名, 数据类型 变量名2)函数的返回值类型、函数名、形参列表称为函数的三要素。1.函数名 望文生义遵循驼峰命名法(第一个单词的首字母小写其余单词首字母大写)2.参数也叫函数的参数调用者调用函数的时传递的数据成为参数。形式参数 在函数声明的时候 ()中定义的参数就是个变量没有具体的值称为形式参数简称形参。就是这里面的加粗字段里的括号public static 返回值类型函数名(数据类型 变量名,数据类型 变量名2){// 函数的功能代码-函数的实现(函数体)}1使用形式参数它相当于 函数的内容的局部变量在函数内部可以直接通过参数名直接使用(只能在当前那里块函数内部使用2形式参数的定义 函数声明 (数据类型 参数名,数据类型 参数名) - 可以定义n个你想定义几个就定义几个实参实参给形参赋值实参必须和形参 的个数、顺序、类型一致。在函数调用时的括号里写的具体的东西就是给形参赋值3.返回值类型 约定了函数返回给调用者的结果类型1返回值结果为 void ,则代表函数没有结果返回但是可以 return ; 结束当前函数的调用。2返回值类型为 8种基本数据或是对象类型代表函数必须有 return XXX;语句 return 返回的结果必须和约定的返回值类型结果一致。3return 的作用1.将函数的结果 返回给调用者2.结束当前函数 (return 语句后面不允许在定义任何的语句)4注意事项如果return语句定义在分支结构中必须保证每一个分支都有return语句。有一些情况下必须有返回值自己探索。例如你让一人去取钱函数的实现{}照猫画虎1package demo; //函数1-不可以 public class Test1{ //4-可以 public static void main(String[] args){ //每行之间利用30个 隔开 //代码的冗余重复的代码写多次-代码维护麻烦 /* 重复的代码写一遍 - 起名字 */ System.out.println(好好学习); printLine();//函数的调用 System.out.println(天天向上); printLine(); System.out.println(good good study); printLine(); System.out.println(day day up); printLine(); //3-不可以 } //5-可以函数的位置必须是类以内其他函数的外面 //函数的定义先定义再用 public static void printLine(){ //函数的功能 for(int i1;i30;i){ System.out.print(); } System.out.println();//换行 } } //2-不可以输出好好学习天天向上good good studyday day up基础知识2先写定义在写调用。二、函数的调用【重点】函数的调用没带参数的调用语法函数名(); // 可以被调用 n 次带参数的调用语法函数名(数值,数值2)调用者传递的数值被称为实际参数简称为实参。实参的作用实参给形参赋值实参必须和形参 的个数、顺序、类型一致。带有返回值的函数调用数据类型 变量 函数名(实参); // 数据类型 需要和返回值的数据类型一致没有返回值直接调用就行带有返回值的函数调用之后对结果可以不进行任何处理 // 应用场景几乎没有带有返回值的函数调用之后直接参与打印或是运算System.out.println();这个语句是换行照猫画虎2package demo; public class Test2{ public static void main(String[] args){ //实际参数个数顺序类型必须和形参一致 printLine(,60);//函数调用数据-实际参数简称实参实参给形参赋值 System.out.println(好好学习); printLine(,30);//函数的调用30 System.out.println(天天向上); printLine(-,35);//-35 System.out.println(good good study); printLine(*,40);//*40 System.out.println(day day up); printLine(~,45);//~45 } //函数的定义函数的声明函数的实现 public static void printLine(char x,int n){//函数的声明----(数据类型 变量名)-形式参数简称形参 //函数的功能-函数的实现 for(int i1;in;i){ System.out.print(x); } System.out.println();//换行 } }输出好好学习天天向上-----------------------------------good good study****************************************day day up~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~照猫画虎2中的printLine就是我给这个函数起的名字。printLine(char x,int n)里的char x,int n就是我定的形参前面是char类型后面是int类型。我要对此函数调用我可以写printLine(,60);前面的就是char类型后面的60就是int类型因为你一开始定义这个函数时的形参就是前面是char类型后面是int类型。在照猫画虎1中函数为printLine()括号里什么都没有那么在上面调用时括号里就啥也没写。就是我在定义时的括号里写的什么形参你调用时的函数里的括号就要写那样的形参照猫画虎3package demo; public class Test3{ public static void main(String[] args){ // 调用add函数 add(100); add(50); } // 定义函数add接收一个int类型的参数n将0~n之间的数据和计算并打印 public static void add(int n){ int sum 0; for(int i0;in;i){ sumi; } System.out.println(sumsum); } }输出sum5050sum1275照猫画虎4package demo; public class Test4{ public static void main(String[] args){ // 调用add函数,并传递(8,9),接收两个数据加和并判断和的奇偶数 int radd(8,90); System.out.println(rr); if(r%20){ System.out.println(偶数); }else{ System.out.println(奇数); } System.out.println( add(8,20) ); } // 定义函数 add接收两个 int类型数据计算两个数据的加和并返回 public static int add(int a,int b){ int sum0; sumab; //System.out.println(sumsum); return sum; } }输出r98偶数28照猫画虎4定义的为两个int类型加和那么定义的返回值就要为int类型后面返回的sum就为int类型你把sum改成23...都行因为23都是整型int类型。那么8.9可以吗不行这不是整型是小数。这里的r是名字这里的名字是任意的你写sum也行与下面的sum不冲突。基础知识31.函数的嵌套调用被调函数的内部又调用了其他的函数。2.函数的执行原理程序执行过程中遇到函数的调用则程序跳到被调用的函数内部执行被调用函数执行完之后如果有返回值带着返回值返回到调用位置没有返回值,直接返回到被调用的位置,程序继续往下执行。照猫画虎5package demo; public class Test5{ public static void main(String[] args){// System.out.println(---main..start..1);// ma(); System.out.println(---main..end..2);// } public static void ma(){ System.out.println(---main..start..3);// mb();//嵌套函数 System.out.println(---main..end..4);// } public static void mb(){ System.out.println(---main..start..5);// System.out.println(---main..end..6);// } }输出---main..start..1---main..start..3---main..start..5---main..end..6---main..end..4---main..end..2和那个for循环的嵌套类似好好看一看上面的顺序。基础知识4递归调用【理解】 自己调用自己自己调用自己就是在你自己的函数之中在写一遍你自己的函数的调用语句例如把照猫画虎5改一改package demo;public class Test5{public static void main(String[] args){//System.out.println(---main..start..1);//ma();System.out.println(---main..end..2);//}public static void ma(){System.out.println(---main..start..3);//mb();//嵌套函数System.out.println(---main..end..4);//}public static void mb(){System.out.println(---main..start..5);//mb();System.out.println(---main..end..6);//}}改了mb函数内的东西在mb函数中又加了一个mb()这不就是自己调用自己嘛哇~无穷无尽最终内存耗尽出错怎么解决呢概念一个函数的内部调用了自身函数这种现象称为递归调用。实际开发中需要给递归设置合理的出口避免无穷递归。照猫画虎6package demo; public class Test6{ public static void main(String[] args){// System.out.println(jiecheng(0)); } //函数的计算 计算n的阶乘 public static int jiecheng(int n){ if(n1 || n0)return 1;//出口 return n*jiecheng(n-1);//n*(n-1)的阶乘 } }输出1这里的jiecheng是函数的名字阶乘公式为n*(n-1)在你没学函数之前你写阶乘可能会这样写这一部分不要在意class TestFunction{public static void main(String[] args){System.out.println(jiecheng_5(5));}主要内容public static int jiecheng_5(int n){return n* jieCheng_4(n-1);}public static int jiecheng_4(int n){return n* jieCheng_3(n-1);}public static int jiecheng_3(int n){return n*jieCheng_2(n-1);}public static int jiecheng_2(int n){return n*jieCheng_1(n-1);}public static int jiecheng_1(int n){return 1;}这不就是代码的冗余嘛主要内容的代码之间有共同点这不就用到函数了嘛。现在的代码public static int jiecheng(int n){if(n1 || n0)return 1;//出口return n*jiecheng(n-1);}出口就是让它不能一直调用给它一个返回点那么当n01时就停止调用了。跟我一步步学慢慢走。未完待续。。。