Java 方法调用 方法重载 方法递归
方法的调用
/* 以下程序不使用”方法“,分析程序存在那些缺点? 一下的代码都是完成int类型数据的和,相同的代码写了三遍。(只不过每一次参与求和的数据不通) 代码没有得到重复使用 应该在java语言当中有这样的一种机制: - 某个功能代码只需要写一边。 - 要使用这个功能,只需要给这个功能传递具体的数据 - 这个功能完成之后返回一个最终的结果, 这样代码就可以重复利用了,提高代码复用性【这就是”方法“】 使用这个方法我们称为”调用/invoke“ */ public class MethodTest01 { public static void main(String[] args){ // 需求1;请编写程序计算10和20的和,并将结果输出【功能:计算两个int类型数据的和】 int a = 10; int b = 20; int c = a + b; System.out.println(a + " + " + b + " = " + c); // 需求2:请编写程序计算666和888的和,并将结果输出【功能:计算两个int类型数据的和】 int x = 666; int y = 888; int z = x + y; System.out.println(x + " + " + y + " = " + z); // 需求3:请编写程序计算111和222的和,并将结果输出【功能:计算两个int类型数据的和】 int m = 111; int n = 222; int e = m + n; System.out.println(m + " + " + n + " = " + e); // 以上的三个需求其实就是一个需求,这个需求是:计算两个int类型数据的和,功能相同。只不过每一次参与计算的具体数据不同。 } }
/* 以下直接使用方法这种机制【这个例子不讲方法的语法】,分析程序的优点? 代码得到了重复使用 方法的本质是什么? 方法就是一段代码片段,并且这段代码片段 可以完成某个特定的功能,并且可以被重复的使用。 方法,对应的英语档次:method 方法在C语言中叫函数/Function 方法定义在类体当中,在一个类当中可以定义多个方法,方法编写的位置没有先后顺序,可以随意。 方法体当中不能定义方法!!!!! 方法体由java语句构成,方法体当中的代码遵守自上而下的顺序依次执行。 */ public class MethodTest02 { // 类体 public static void main(String[] args){ // 计算两个int类型数据的和 MethodTest.sumInt(10,20); MethodTest.sumInt(100,200); MethodTest.sumInt(111,222); } // 方法 // 单独的定义一个方法 // 该方法完成计算两个int类型数据的和,并且将结果输出 public static void sumInt(int a,int b){ int c = a + b; System.out.println(a + " + " + b + " = " + c); } }
/* 关于java语言当中的方法: 1、方法怎么定义,语法结构; [修饰符列表]返回值类型 方法名(形式参数列表){ 方法体; } 2、对以上的语法结构进行解释说明: - 关于修饰符列表 * 可选项,不是必须的 * 目前统一写成:public static 【以后解释】 * 方法的转修符列表中有"static关键字"的话,怎么调用这个方法? 类名.方法名(实际参数列表); - 返回之后类型 * 什么是返回值? 一个方法是可以完成某个特定功能的,这个功能结束之后大多数都是需要返回最终执行结果的,执行结果可能是一个具体存在的数据。 而这个具体存在的数据就是返回值。 * 返回值类型? 返回值是一个具体存在的数据,数据都是有类型的,此处需要指定的是返回值的具体类型 * 返回值类型都可以指定那些类型呢? java任意一种类型都可以,包括基本数据类型和所有的引用数据类型。 * 也可能这个方法执行结束之后不返回任何数据,java中规定,当一个方法执行结束之后不返回任何数据的话,返回值类型位置必须编写:void关键字。 * 返回值类型可以是: byte、short、int、long、float、double、boolean、char、String、void....... * 返回值类型若不是void,表示这个方法执行结束之后必须返回一个具体的数值。 当方法执行结束的时候没有返回任何数据的话编译器报错,怎么返回值呢,代码怎么写呢? "return 值;",并且要求"值"的数据类型必须和"方法的返回值类型"一致,不然编译器报错. * 返回值类型是void的时候,在方法当中不能编写"return 值;" 这样的语句。但是要注意可以编写"return;"这样的语句 * 只要带有return关键字的语句执行,return语句所在的方法结束。【不是JVM结束,是return所在方法结束】 - 方法名: * 只要是合法的标识符就行 * 方法名最好见名知意 * 方法名最好是动词 * 方法名首字母要求小写,后面每个单词首字母大写 - 形式参数列表:简称形参 * 形参是局部变量:int a; double b; float c; String s;.... * 形参的个数可以是:0-N个 * 多个形象之间用“逗号”隔开 * 形象中起决定性作用的是形参的数据类型,形参的名字就是局部变量的名字。 * 方法在调用的时候,实际给这个方法传递的真实数据被称为:实际参数,简称实参 * 实参列表喝形参列表必须满足: 数量相同 类型对应相同 例如: 方法定义 public static int sum(int a,int b){ // (int a, int b)是形参列表 } 方法调用 sum("abc","def"); // 编译器报错 sum(10,20); // (10,20)是实参列表 - 方法体必须由大括号括起来,方法体当中的代码有顺序,遵循自上而下的循序依次执行 并且方法体由java语句构成,每一个java语句以";"结尾 3、方法怎么调用? - 方法只定义不去调用时不会执行的,只要在调用的时候才会执行。 - 语法规则:【方法的修饰符列表当中有static】 类名.方法名(实参列表); <这是一条java语句,表示调用某个类的某个方法,传递这样的实参。> */ // public 表示公开的 // class 表示定义类 // MethodTest是一个类名 public class MethodTest03 // 表示定义一个公开的类,起名MethodTest,由于是公开的类,所以源文件名必须, MethodTest.java { // 类体 // 类体中不能不直接编写java语句,除声明变量之外 // 方法 // public 表示公开的 // static 表示静态的 // void 表示方法执行结束之后不返回数据 // main 是方法名:朱方法 // (String[] agrs): 形式参数列表,其中String[] 是一种应用数据类型,args是一个局部变量的变量名 // 所以以下只有args这个局部变量的变量名是随意的 // 主方法就需要这样固定编写,这是程序的入口,【SUN规定的,必须这样写】 public static void main(String[] args){ // 这里的程序是一定会执行的 // main方法是JVM负责调用,是一个入口位置 // 从这里作为起点开始执行程序 // 既然是这样,我们就可以在这里编写java语句来调用其它的方法 // 调用MethodTest的sum方法,传递两个实参 MethodTest.sum(10,20); // (10,20)实参列表 【实际上执行到这里main方法暂停了,进入sum方法执行,sum方法执行结束之后表示main方法第一次调用结束】 // 注意:方法体当中的代码是顺序的,遵循自上而下的顺序依次执行 // 一个方法可以重复使用,重复调用 int a = 100; MethodTest.sum(a,500); // (a,500)实参列表 // 再次调用方法 int k = 90; int f = 10; MethodTest.sum(k,f); // (k,f)实参列表 } // 自定义发放,不是程序的入口 // 方法作用:计算两个int类型数据的和,不要求返回结果,但是要求将结果直接输出到控制台 // 修饰符列表:public static // 返回值类型:void // 方法名:sum // 形式参数列表:(int x,int y) // 方法体:主要任务是求和之后输出计算结果 public static void sum(int i,int j){ // (int i, int j)形参列表 System.out.println(i + " + " + j + " = " + (i+j)); } }
/* 方法的调用不一定在main方法当中,可以在其他方法当中 只要是程序可以执行到的位置,都可以去调用其它方法 */ public class MethodTest04 { public static void sum(int a,int b){ System.out.println(a + " + " + b + " = " + (a+b)); // 调用doSome方法 MethodTest.doSome(); } // 主方法 public static void main(String[] args){ // 调用sum方法 MethodTest.sum(1,2); System.out.println("hello world!"); } public static void doSome(){ System.out.println("do some!"); } }
/* 方法调用的时候实参和形参要求个数对应相同,数据类型对应相同 类型不痛的时候要求能够进行相应的自动类型转换 */ public class MethodTest05 { public static void main(String[] args){ // 编译错误:参数数量不通 // MethodTest.sum(); // 编译错误:实参和形参的类型不是对应相同的 // MethodTest.sum(true,false); // 可以 MethodTest.sum(10L,20L); // 存在自动类型转换:int--> long MethodTest.sum(10,20); // 编译错误:参数类型不是对应相同的 // MethodTest.sum(3.0,20); // 可以 MethodTest.sum((long)3.0,20); } public static void sum(long a,long b){ System.out.println(a + " + " + b + " = " + (a+b)); } }
/* 方法调用 1、方法的修饰符列表当中有static关键字,完整的调用方式是:类名.方法名(实参列表); 2、但是,有的时候“类名.”可以省略,什么情况下可以省略呢? m1(){ m2(); } m1方法和m2方法在同一个类体当中的时候,“类名.”可以省略不写
3、建议在一个java源文件当中只定一个class,比较清晰,这里只是为了方便才在一个java源文件当中编写多个class,这种方式不要模仿 */ public class MethodTest06 { public static void main(String[] args){ // 调用方法 MethodTest.m(); // 对于方法的修饰符列表当中有static关键字的:“类名.”可以省略不写吗? m(); // 调用其它类【不是本类中的】中的方法 A.doOther(); // 省略“类名.”试试 // 编译报错,“类名.”省略之后,默认从前类中找“doOther”方法,在当前类中该方法不存在。 // doOther(); } public static void m(){ System.out.println("m method execute!"); // 完整的方式 MethodTest.m2(); // 省略的方式 m2(); // 不想调用当前本类当中的m2方法,这个时候就必须添加“类名.”了。 A.m2(); } public static void m2(){ System.out.println("m2 execute!"); } } class A { public static void doOther(){ System.out.println("'A' s doOther method invoke!"); } public static void m2(){ System.out.println("'A' s m2 method execute!"); } }
/* 分析以下程序的输出结果 main begin m1 begin m2 begin m3 begin m3 over m2 over m1 over main over 对于当前的程序来说: main方法最先被调用,main方法也是最后一个结束 最后调用的方法是m3方法,该方法最先结束 main方法结束之后,整个程序结束了【这句话只适合于当前所讲内容】 不用刻意去记忆: 只要记住方法中的代码是自上而下的循序依次执行即可。 当前行的程序在没有结束的时候,下一行的代码是无法执行的。 */ public class MethodTest07 { public static void main(String[] args){ System.out.println("main begin"); m1(); System.out.println("main over"); } public static void m1(){ System.out.println("m1 begin"); m2(); System.out.println("m1 over"); } public static void m2(){ System.out.println("m2 begin"); m3(); System.out.println("m2 over"); } public static void m3(){ System.out.println("m3 begin"); System.out.println("m3 over"); } }
/* 方法的返回值类型不是void的时候。 1、返回值类型不是void的时候:要求方法必须保证百分百执行“return 值;”这样的语句来完成值返回 没有这个语句编译器会报错。 2、一个方法有返回值的时候,当我们调用这个方法的时候,方法返回了一个值,对于调用者来说,这个返回值可以选择接收,也可以选择不接受 但是大部分情况下我们都是选择接收的 */ public class MethodTest08 { public static void main(String[] args){ // 调用方法 divide(10,3); // 这里没有接收这个方法的返回数据 // 这里接收一下方法执行的结束之后的返回值 // 采用变量接收 // 变量的数据类型需要和返回值的数据类型相同,或者可以自动类型转换, // boolean b = divide(10,3); // 编译报错,类型不兼容 // 赋值运算符的右边先执行,将执行结果赋值左边的变量 int i = divide(10,3); System.out.println(i); long x = divide(10,3); System.out.println(x); System.out.println(divide(10,3)); } /* 需求: 请定义并实现一个方法,该方法可以计算两个int类型数据的商 要求将最终的计算结果返回给调用者 */ // 编译报错:缺少返回语句 /* public static int divide(int a,int b){ } */ // 编译报错:缺少返回值 /* public static int divide(int a,int b){ return; } */ // 编译报错:方法定义的时候要求返回一个int类型,此时返回布尔类型,类型不兼容 /* public static int divide(int a,int b){ return true; } */ // 可以:但是具体的方法体中编写的代码无法满足当前的需求 /* public static int divide(int a,int b){ return 1; } */ public static int divide(int a,int b){ int c = a / b; return c; } }
/* 深入return语句 - 带有return关键字的java语句只要执行,所在的方法执行结束 - 在”同一个作用域“当中,return语句下面不能编写任何代码,因为这些代码永远都执行不到,所以编译报错 */ public class MethodTest09 { public static void main(String[] args){ /* int retValue = m(); System.out.println(retValue); */ // 编译报错,调用方法,方法名后面有括号; // System.out.println(m); System.out.println(m()); } // 编译报错:缺少返回语句,以下程序编译器认为无法百分百保证”return 1;“ 会执行。 // 无法百分百保证”return 1;“会执行 /* public static int m(){ int a = 10; if(a > 3){ return 1; } } */ // 以下程序可以保证”return 1; 或 return 0;“执行,编译通过 /* public static int m(){ int a = 10; if(a > 3){ return 1; }else{ return 0; } */ // 可以,和以上方法完全相同 /* public static int m(){ int a = 10; if(a > 3){ return 1; } return 0; } */ /* public static int m(){ int a = 10; if(a > 3){ return 1; // 这里不能编写代码,编译报错,因为无法访问的语句 // System.out.println("hello"); } // 这里的代码可以执行到 // System.out.println("hello"); return 0; } */ public static int m(){ // return 10 > 3 ? 1 : 0; return 2 > 3 ? 1 : 0; } }
/* 在返回值类型是void的方法当中使用”return;“语句。 ”return;“语句出现在返回值为void的方法当中主要是为了用来结束当前方法 */ public class MethodTest10 { public static void main(String[] args){ m(); for(int i =10; i>0;i--){ if(i == 2){ return; // 结束的是main方法 } System.out.println("data: -->" + i); } System.out.println("Exeoute Here!"); // 编译报错,返回值类型是void,不能返回值。 // return 100; } // 编译错误:对于结果类型为空的方法,无法返回值 /* public static void m(){ return 10; } */ /* public static void m(){ return; } */ public static void m(){ for(int i = 0;i<10;i++){ if(i==5){ return; // 不是终止for循环,终止的是m()方法。 // break; // 终止的for循环 } System.out.println("i -->" + i); } System.out.println("hello world"); } }
/* 方法在执行过程当中,在JVM中的内存是如何分配的呢,内存是如何变化的? 1、方法只定义,不调用,是不会执行的,并且在JVM中也不会给该方法分配运行所属的内存空间, 只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间 2、在JVM内存划分上有这样三块主要的内存空间:(当然除了这三块之外还有其它的内存空间) - 方法区 - 堆内存 - 栈内存 3、关于栈数据结构: - 栈:stack,是一种数据结构 - 数据结构反应的是数据的存储形态 - 数据结构是独立的学科,不属于任何编程语言的范畴,只不过在大多数编程语言当中要使用数据结构 - 作为程序员需要提前精通:数据结构 + 算法【计算机专业必修一门课】 - java程序员在不精通数据机构和算法的前提下,也可能进行java开发,因为java有一套庞大的类库支撑,别人写好了,直接用【JavaSE当中的集合章节使用了大量的数据结构】 - 常用的数据结构: * 数组 * 队列 * 栈 * 链表 * 二叉树 * 哈希表/散列表... 4、方法代码片段存在哪里?方法执行的时候执行过程内存在哪里分配? - 方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将其放到了方法区当中,所以JVM中的三块主要的内存空间中方法区内存最先有数据,存放了代码片段 - 代码片段虽然在方法区内存当中只有一份,但是可以被重复调用。 每一次调用这个方法的时候,需要给该方法分配独立的活动场所,在栈内存中分配。【栈内存中分配方法运行的所属内存空间】 5、方法在调用的瞬间,会给该方法分配独立的内存空间,会在栈中发生压栈动作, 方法执行结束之后,该方法分配的内存空间全部释放,此时发生弹栈动作。 - 压栈:给方法分配内存 - 弹栈:释放该方法的内存空间 6、局部变量在”方法体“中声明。局部变量运行阶段内存在栈中分配。 */ public class MethodTest { public static void main(String[] args){ m(); } public static void m(){ int i = 10; } }
// 注意:在EditPlus当中,字体颜色为红色的表示一个类的名字,并且这个类是JavaSE类库中自带的。 // 我们自定义的类MethodTest,字体颜色是黑色,是标识符 // 其实JavaSE类库中自带的类,例如:String.class、System.class,这些类的类名也是标识符 // 只要是类名就一定是表示符 // 重点:方法调用的时候,在参数传递的时候,实际上传递的是变量中保存的那个“值”传过去的 public class MethodTest { public static void main(String[] args){ int a = 10; int b = 20; int retvalue = sumInt(a,b); System.out.println("retValue = " + retvalue); } public static int sumInt(int i,int j){ int result = i + j; int num = 3; int retValue = divide(result,num); return retValue; } public static int divide(int x ,int y){ int z = x / y; return z; } } /* 画图依据: 1、只要涉及到到参数传递的问题,传递的是变量中保存的值 2、画图的时候,必须遵循“方法自上而下的顺序依次执行”这个原则 */
// 分析以下程序的输出结果【画图分析】 // 画图应该这样画? // 程序执行一步,在图上体现一步即可。 public class MethodTest { public static void main(String[] args){ int i = 10; method(i); System.out.println("main --> " + i); } public static int method(int i){ i++; System.out.println("method --> " + i); } }
方法重载
/* 以下代码不使用“方法重载机制”,不适用overload,分析程序存在的缺点? 1、sumInt,sumDouble,sumLong方法虽然功能不通,但是功能是相似的,都是求和。 在以下程序当中功能相似的方法,分别起了三个不同的名字 这对于程序员来说,调用方法的时候不方便,程序员需要记忆更多的方法,才能完成调用【不方便】 2、代码不美观 有没有这样的一种机制: 功能虽然不同,但是“功能相似”的时候,有没有这样的一种机制,可以让程序员使用这些方法的时候就像在使用同一个方法一样 这样程序员以后编写代码比较方便,也不需要记忆更多的方法名,代码也会很美观。 有这种机制:方法重载机制/Overload */ public class OverloadTest { // 入口 public static void main(String[] args){ // 调用方法 int result1 = sumInt(1,2); System.out.println(result1); double result2 = sumDouble(1.0,2.0); System.out.println(result2); long result3 = sumLong(1L,2L); System.out.println(result3); } // 定义一个方法,可以计算两个int类型数据的和 public static int sumInt(int a,int b){ return a + b; } // 定义一个方法,可以计算两个double类型数据的和 public static double sumDouble(double a,double b){ return a + b; } // 定义一个方法,可以计算两个long类型数据的和 public static long sumLong(long a,long b){ return a + b; } // 最终希望达到的效果是:程序员在使用上面的相似的方法的时候,就像再用一个方法一样 // Java支持这种机制【有些语言不支持,例如以后要学习的:Javascript】 }
/* 该程序还是一个体验程序,体验一下方法重在的有点: - 程序员调用方法的时候,比较方便,虽然调用的是不通的方法,但是就感觉在使用一个方法一样 不需要记忆更多的方法名 - 代码美观 前提:功能相似的时候,方法名可以相同 但是,功能不通的时候,尽可能让这两个方法的名字不同 */ public class OverloadTest { public static void main(String[] args){ // 调用方法的时候就像在使用一个方法一样 // 参数的类型不同,对应调用的方法不同,此时区分方法不再依靠方法名了,依靠的是参数的数据类型。 System.out.println(sum(1,2)); System.out.println(sum(1.0,2.0)); System.out.println(sum(100000000000L,200000000000L)); } // 以下三个方法构成了方法重载机制 public static int sum(int a,int b){ System.out.println("int"); return a + b; } public static long sum(long a,long b){ System.out.println("long"); return a + b; } public static double sum(double a,double b){ System.out.println("double"); return a + b; } }
/* 方法重载: 1、方法重载又被称为:overload 2、什么时候考虑使用方法重载? - 功能相似的时候,尽肯让方法名相同 但是:功能不通/不相似的时候,尽可能让方法名不同。 3、什么条件满足之后构成了方法重载? - 在同一个类当中 - 方法名相同 - 参数列表不同: * 数量不同 * 顺序不同 * 类型不通 4、方法重载和什么有关系,和什么没有关系? - 方法重载和方法名+参数列表有关系 - 方法重载和返回值类型无关 - 方法重载和修饰符类型无关 */ public class OverloadTest { public static void main(String[] args){ m1(); m1(10); m2(1,2.0); m2(2.0,1); m3(10); m3(3.0); } // 以下两个方法构成重载 public static void m1(){} public static void m1(int a){} // 以下两个方法构成重载 public static void m2(int a,double b){} public static void m2(double a,int b){} // 以下两个方法构成重载 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); public static void x(){} public static int x(){} void y (){} public static void y(){} */ }
/* 方法重载的具体应用 */ public class OverloadTest { public static void main(String[] args){ U.p(10); U.p(false); U.p("abc"); U.p(3.0); } } // 自定义类 class U { public static void p(byte b){ System.out.println(b); } public static void p(short b){ System.out.println(b); } public static void p(int b){ System.out.println(b); } public static void p(long b){ System.out.println(b); } public static void p(float b){ System.out.println(b); } public static void p(double b){ System.out.println(b); } public static void p(boolean b){ System.out.println(b); } public static void p(char b){ System.out.println(b); } public static void p(String b){ System.out.println(b); } }
方法递归
/* 关于方法的递归调用 1、什么是递归? 方法自身调用自身 a(){ a(); } 2、递归是很耗费栈内存的,递归算法可以不用的时候尽量别用 3、以下程序运行的时候发生了这样的一个错误【不是异常,是错误Error】: java.lang.StackOverflowError 栈内存溢出错误 错误发生无法挽回,只有一个结果,就是JVM停止工作。 4、递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误 5、递归即使有了结束条件,即使结束条件是正确的,也可能会发生栈内存溢出错误,因为递归的太深了 注意: 递归可以不使用尽量别用 但是有些情况下该功能的实现必须依靠递归方式 */ public class RecursionTest { // 主方法 public static void main(String[] args){ System.out.println("main begin"); // 调用doSome方法 doSome(); System.out.println("main over"); } // 以下的代码片段虽然只有一份 // 但是可以被重复的调用,并且只要调用doSome方法就会在栈内存中重新分配一块所属的内存空间。 public static void doSome(){ System.out.println("doSome begin"); doSome(); // 这行代码不结束,下一行程序是不能执行 System.out.println("doSome over"); } }
/* 不使用递归,计算1~~N的和【可以不用递归,尽量不用递归】 */ public class RecursionTest { public static void main(String[] args){ /* // 1~4的和 int sum = 0; for(int i=1;i<=4;i++){ sum += i; } System.out.println("sum = " + sum); */ // 直接调用方法即可 int n = 4; int retValue = sum(n); System.out.println(retValue); n = 10; retValue = sum(n); System.out.println(retValue); } // 单独的定义一个方法,这是一个独立的功能,可以完成1~N的求和 public static int sum(int n){ int result = 0; for(int i=0;i<=n;i++){ result += i; } return result; } }
/* 使用递归计算1~N的求和 1 + 2 + 3 + 4 4 + 3 + 2 + 1 n的最初值是4,建议采用这种方式 */ public class RecursionTest { public static void main(String[] args){ // 1~4的和 int n = 4; int retValue = sum(n); System.out.println(retValue); } public static int sum(int n){ if (n == 1) { return 1; } return n + sum(n-1); // 先运算sum(n-1),在跟n相加 } }
/* 先不使用递归,计算N的阶乘 5的阶乘 5 * 4 * 3 * 2 * 1 */ /* public class RecursionTest { public static void main(String[] args){ int n = 5; int Net = method(n); System.out.println(Net); } public static int method(int n){ int sum = 1; for(int i=n;i>0;i--){ sum = sum * i; } return sum; } } */ // 递归方式 // 不懂递归的,必须将以下的程序记住,因为面试题有出 public class RecursionTest { public static void main(String[] args){ int n = 5; int Net = method(n); System.out.println(Net); } public static int method(int n){ if (n == 1){ return 1; } return n * method(n-1); } }
/* 先不使用递归,计算N的阶乘 5的阶乘 5 * 4 * 3 * 2 * 1 */ /* public class RecursionTest { public static void main(String[] args){ int n = 5; int Net = method(n); System.out.println(Net); } public static int method(int n){ int sum = 1; for(int i=n;i>0;i--){ sum = sum * i; } return sum; } } */ // 递归方式 // 不懂递归的,必须将以下的程序记住,因为面试题有出 public class RecursionTest { public static void main(String[] args){ int n = 5; int Net = method(n); System.out.println(Net); } public static int method(int n){ if (n == 1){ return 1; } return n * method(n-1); } }