狂神JAVASE系列-03方法篇
1.0 方法的定义及其调用
调用系统类 System 中的标准输出对象 out 中的方法 println()
Java方法可以理解成其他编程语言中的函数,将某一类功能抽象出来,也就是解耦,目的也是为了可扩展性,即:方法就是完成特定功能的一段代码。
那么如何定义方法?
语法格式:
修饰符 返回值类型 方法名(参数类型 参数名){ ... 方法体 ... return 返回值;}
代码示例:
public class Demon01 { //main方法 public static void main(String[] args) { int sum = add(1,2); System.out.println(sum); test(); } //加法方法 public static int add(int a,int b){ return a+b; } public static void test(){ //循环输出1-1000之间能被5整除的数,并且每行输出3个 for (int i = 0; i < 1000; i++) { if(i%5==0){ System.out.print(i+"\t"); } if(i%(5*3)==0){ System.out.println("\n"); } }
参数说明:(参考Javav-菜鸟教程:)
- 修饰符:修饰符(可选参数)告诉编译器如何调用该方法以及定义了该方法的访问类型。
- 返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法没有返回值,那么关键字为void。
- 方法名:一个方法具体叫什么?。
- 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 方法体:方法体包含具体的语句,定义该方法的功能。
*方法调用
*注:若方法返回值是void,方法调用一定是一条语句。
代码示例
public class Demon02 { public static void main(String[] args) { int shuru = max(1,1); //方法调用 System.out.println(shuru); } public static int max(int num1,int num2){ if(num1==num2){ System.out.println("num1==num2"); return 0; } if(num1>num2){ return num1; }else { return num2; } }}
分析:上述代码包含 两个方法,分别是main 方法和 max 方法。
其中,main 方法是被 JVM 调用的,除此之外,main 方法和其它方法没什么区别。
main 方法的头部是不变的:
public static void main(String[] args) {}
public 和 static为修饰符,返回 void 类型值,方法名字是 main, String[] 类型参数。String[] 表明参数是字符串数组。
2.0 值传递
定义一个方法需要传参,例如上述方法max(int a,int b),那么调用此方法时,需要提供参数且必须按照参数列表指定的顺序提供。
代码示例:
public class Demon03 { public static void main(String[] args) { int num1 = 1; int num2 = 2; System.out.println("交换前 num1 的值为:" + num1 + " ,num2 的值为:" + num2); swap(num1, num2); //方法调用 } /** 定义swap方法, */ public static void swap(int a1, int a2) { int temp = a1; a1 = a2; a2 = temp; System.out.println("\t\t交换后 n1 的值为 " + a1 + ",n2 的值:" + a2); }}
说白了,如果这个方法需要传参,那么传参的要按照顺序来进行。要做到实参和形参一一对应。
3.0 方法重载
代码示例:
public static int max(int num1,int num2){ if(num1==num2){ System.out.println("num1==num2"); return 0; } if(num1>num2){ return num1; }else { return num2; }
分析上述代码:上述定义的max方法只能比较两个int型数据。如果想比较1.2和2.2,即比较两个浮点数值的大小怎么办?
public static int max(float num1,float num2){ if(num1==num2){ System.out.println("num1==num2"); return 0; } if(num1>num2){ return num1; }else { return num2; }
我们将max方法中传参的类型改为float即可实现我们的需求。那么创建一个有相同方法名但是参数不同的方法,就像上面那样,这叫什么?---------------->方法重载
谈到这边呢,容易产生一个问题:既然两个方法名都一样,那么我在调用的时候怎么调?,也就是程序如何知道我是想比较int型还是float型?
示例:
public class Demon04 { public static void main(String[] args) { //显然,方法名一样,但是程序会根据传递参数的类型,来准确的识别该调那种 int result1 = max(10,20); double result2 = max(1.2,1.1); System.out.println(result1); System.out.println(result2); } public static int max(int a,int b){ if(a>b){ return a; }else { return b; } } public static double max(double a,double b){ if(a>b){ return a; }else { return b; } }}
分析上述可知: 根据传递参数的类型,即可确定时该如何调用的问题。也就是如果传递的是int型参数,则那么int型参数的max方法就会被调用,反之亦然。
方法重载总结:
- 在一个类中,具有相同的方法名,但是具有不同的参数列表(什么是方法重载,3个条件)
- 什么是不同的参数列表?例如参数个数不同,类型不同,参数排列顺序不同等)
- 重载的方法必须拥有不同的参数列表。不能仅仅依据修饰符或者返回类型的不同来重载方法。那么有个隐含的条件在这里,就是这个修饰符和返回类型可以一样。
- Java编译器根据参数列表的差异性进而判断哪个方法应该被调用。
- 方法重载有什么好处?可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字
4.0 构造方法
构造方法和它所在类的名字相同,但构造方法没有返回值。
不管你是否自定义构造方法,所有的类都有构造方法,因为 Java 自动提供了一个默认构造方法,默认构造方法的访问修饰符和类的访问修饰符相同(类为 public,构造函数也为 public;类改为 protected,构造函数也改为 protected)。
一旦你定义了自己的构造方法,默认构造方法就会失效。(菜鸟教程)
5.0 命令行传参(了解即可)
有时候希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。
命令行参数是在执行程序时候紧跟在程序名字后面的信息。
public class CommandLine { public static void main(String[] args){for(int i=0; i<args.length; i++){ System.out.println("args[" + i + "]: " + args[i]); } }}
注:如果想直接运行一个class文件,需要找到其包路径,然后才能加载,否则是执行不了的。如上面报错一样,必须回退到这个src。
6.0 可变参数
- JDK1.5开始,Java支持传递同类型可变参数给一个方法
- 在方法声明中,在指定参数类型加一个省略号
public class Demon05 { public static void main(String[] args) { Demon05 demon05 = new Demon05(); demon05.test(1); demon05.test(1,2,3,4,5); }//你也不知道你要传递几个参数 public void test(int ... i){ System.out.println(i[0]); }}
- 一个方法中只能指定一个可变参数,且必须是方法的最后一个参数,任何普通的参数在它之前进行声明。例如 int x, int ... i就不会报错,而int ... i,int x就会报错。
- int... i 这个参数必须都是int 也就是是一个类型的。
示例:
代码示例:
public class Demon05 { public static void main(String[] args) { //调用可变参数的方法 printMax(34,3,3,2,56.5); printMax(new double[]{1,2,3}); } public static void printMax(double... numbers){ if(numbers.length==0){ System.out.println("No argument"); } double result = numbers[0]; //排序 for (int i = 1; i result){ result = numbers[i]; } } System.out.println("The max value is"+ result); }}