Java 方法
方法其实就是函数,就是将一段代码语句组合在一起实现一个功能,这样使得程序变得简短而清晰,有利于维护,可以提高程序的开发效率,提高代码的重用性和可读性。
方法的定义
语法:
修饰符 返回值类型 方法名(参数类型 参数名){
方法体
return 返回值
}
- 修饰符 可选,告诉编译器如何调用这个方法。
- 返回值类型 类似于 TypeScript,void 表示没有返回值,其他的对应方法的返回值的类型。
- 方法名 方法的实际名称。
- 参数类型和参数名 类似于 TypeScript 中的形参。
- 方法体 方法的具体代码,定义了该方法实际做的事儿。
例子:定义一个找数组中最大值的方法
public class Methods {
public static int getMaxValueFn(int[] arr) {
int maxValue = arr[0];
for (int num : arr) {
if (num > maxValue) {
maxValue = num;
}
}
return maxValue;
}
}
public class Funcs {
public static void main(String[] args) {
int[] arr = { 1, 5, 9, 5, 23, 65, 4 };
int maxValue = Methods.getMaxValueFn(arr);
System.out.println(maxValue); // 65
}
}
方法的调用
在上个例子中其实已经有做方法的调用:
和大多数编程语言一样,调用方法就是直接在方法名后面加小括号,如果方法有定义参数,直接在小括号中传入对应的参数,如果方法有返回值,也可以定义一个相应类型的变量来接收返回值。
方法的重载
java 允许在一个类中定义多个名称相同,但是参数的类型或者个数不相同的方法。
比如:我们在一个类中定义 add 静态方法,但我们需要让字符串相加,有时候也需要 int 类型的数字相加,这是我们就可以用重载来声明两个名称相同的的不同方法:
public class Mthods {
public static int getMaxValueFn(int[] arr) {
int maxValue = arr[0];
for (int num : arr) {
if (num > maxValue) {
maxValue = num;
}
}
return maxValue;
}
public static int add(int a, int b) {
System.out.println("Int Add fn called");
return a + b;
}
public static String add(String a, String b) {
System.out.println("String Add fn called");
return a + b;
}
}
public class Funcs {
public static void main(String[] args) {
int[] arr = { 1, 5, 9, 5, 23, 65, 4 };
int maxValue = Mthods.getMaxValueFn(arr);
System.out.println(maxValue); // 65
// 测试方法重载
int num1 = 10, num2 = 11;
System.out.println(Mthods.add(num1, num2)); // 21
System.out.println(Mthods.add("abc", "def")); // abcdef
}
}
因此:Java 程序中确定一个方法需要的三个要素:
- 调用者:就是方法的所属者,可以是类或者是对象;
- 方法名:方法的标识;
- 形参列表:当调用方法时,系统将会根据传入的实参列表匹配。
重载方法的要求是两同一不同:即同一个类中方法名相同,参数列表不同。至于方法 de 的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。
变量的作用域
和其他编程语言的作用域定义相同:变量的作用域就是就是程序中变量可以被引用(访问)的部分。
方法内定义的变量被称为局部变量,局部变量的作用范围从声明处开始,知道包含他的代码块结束。方法的参数实际上也可以理解为方法内部的局部变量。for 循环初始化部分声明的变量,其作用范围在整循环,但是循环体内定义的变量值在档次循环中有效。
命令行参数
之前一直在定义 main 方法,没有介绍 main 方法的参数,其实一个 java 程序的 main 方法的参数就是在运行程序的时候后命令行参数:
public class CommandArgs {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
然后如果通过如下命令运行这个程序:
java CommandArgs arg1 arg2
传入的arg1和arg2参数会以字符串数组项的形式传递给main方法。
构造方法
- 当一个对象被创建的时候(new一个class),构造方法用来初始化该对象。构造方法和他所在的类名字相同,但构造方法没有返回值(也不能用void去修饰构造方法的返回值)。
- 我们通常会使用构造方法给新建的类的实例变量赋值,或者执行其他必要的步骤来创建一个完整的对象。
- 如果我们没有在类中定义构造方法,java也会提供默认的构造方法,因此用new操作符创建对象的时候一定会执行类的构造方法。(默认构造方法的访问修饰符和类的访问修饰符相同)
public class ConstructFn {
String name;
int age;
public ConstructFn(String name) {
System.out.println("Construtor Called"); //Construtor Called
this.name = name;
this.age = 18;
}
public static void main(String[] args) {
ConstructFn test = new ConstructFn("ConstructorName");
System.out.println(test.name); // ConstructorName
System.out.println(test.age); // 18
}
}