在Java开发中,我们的程序设计体系架构是这样的:
操作系统底层 => Java虚拟机 => class文件(字节码) => Java源码
所以我们需要与Java虚拟机交互,我们编写的代码需要经过编译变成字节码,也就是 .class文件,然后交付Java虚拟机,这也就是为何Java可以write once,run everywhere 的原因!然后我们的虚拟机首先会去寻找我们的主方法,作为函数的入口,这里的方法是可以理解为c++的函数,所以首先要要有一个和文件名同名的public类,里面写有主方法,便于虚拟机寻找!
这个public类是至多只能有一个!因为public类是老大,是程序的处理入口和主体,然后其他的自定义类经过编译会生成独立的 .class 文件,作为public生成的 .class 文件的数据源,向public类提供数据。所以,如果有两个public类,那么其他的数据源,该给谁提供数据呢?所以一山不容二虎,只会有唯一的public类!
在Java中,类可以理解为一个大的工程项目,类里面的方法是组成工程项目的零件部位!可以多类编程,但是其他的类是拿来给public类提供数据的(也许我有说错,请指出!),这一点和c++很不一样,c++中,多类编程是为了丰富对象的类型,便于对整个工程乃至对整个世界类型化,世界中的元素就是类型的实例,更加轻便的编程!但是Java中多类编程到底作用在哪里呢?我还没有学到,还得到后面才能回答!
如果是一个类中的方法,可以直接像c++调用函数那样去调用,但是如果是跨类调用,则会报错!需要用如下格式: 类名.方法名 去调用,因为这样,Java虚拟机才能正确的找到书写了这个方法的代码段的位置,可以认为Java虚拟机是在类中寻找方法(也许我有说错,请指出!)
方法可以分为两类,这个和函数一样,就是分为带返回值的和不带返回值的。带返回值的必须以return语句结束方法!如果想结束不带返回值的方法,就要用:return ;(和c++一样)
这个也和c++一样,具体的看我下面的代码示例,会有注释说明
这个还是和c++一样,就不说了,这些都很简单!
package Main; import java.util.Scanner; public class Main { // 主方法是程序的入口 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt();int b = sc.nextInt(); // 加有 "static" 的方法,应该用 " 类名 + '.' " 的方式调用 // 在这个类:Main 种,调用 add() 方法,就是:Main.add(参数1, 参数2); System.out.println("不带返回值的方法测试:"); Main.Add(a, b); // 带有返回值的 方法 的使用 System.out.println("带有返回值的方法测试:"); int res = Main.Mul(a, b); System.out.println(a + "*" + b + "=" + res); // 测试跨类调用方法 // 跨类调用方法的时候,类名. 是不可以省略的,因为我们调用方法的时候会在当前本类的虚拟机中搜索方法 // 跨类调用是搜索不到的,所以需要加上 类名. 去到另一个类中去搜索方法 System.out.println("方法的跨类调用测试:"); MyClass.TestNewClass(); int f = sc.nextInt(); int ans = MyClass.Fac(f); if(-1 == ans) System.out.println("The num is too big!"); else System.out.println("The result is :" + ans); // 方法的重载: /* * 1.函数名称保持一致 * 2.函数修饰列表保持一致 * 3.函数类型保持一致 * 4.函数的参数列表不同: * 4.1 参数的个数不同 * 4.2 参数的类型不同 * 4.3 参数的顺序不同 */ System.out.println("方法的重载测试:"); System.out.println("Double's result is:" + Main.NumSum(1.0, 2.0) + " Int's result is:" + Main.NumSum(3, 4) + " Three nums add is:" + Main.NumSum(5, 6, 7)); // 方法的递归调用测试 System.out.println("方法的递归调用测试:"); int m = sc.nextInt(); int FibAns = MyClass.Fib(m); System.out.println(FibAns); // 及时关闭输入扫描线,做到 0 warning sc.close(); } // 类内方法: public static void Add(int a, int b) { int sum = a + b; System.out.println(a + "+" + b + "=" + sum); } public static int Mul(int a, int b) { return a * b; } // 方法的重载: public static int NumSum(int a, int b) { return a + b; } public static double NumSum(double a, double b) { return a + b; } public static int NumSum(int a, int b, int c) { return a + b + c; } } // 自定义类,实验跨类调用方法(不能写public!) class MyClass{ public static void TestNewClass() { System.out.println("MyClass' Test Function is used! Hello!"); } public static int Fac(int n) { if(n >= 49) { return -1; // 不然算的太慢了 } int res = 1; for(int i = 1;i <= n;i++) res *= i; return res; } // 方法的递归调用 public static int Fib(int n) { if(n <= 1) return 1; return Fib(n - 1) + Fib(n - 2); } }