Java入门(十三)
Java 方法详解
- 什么叫做方法?日常生活中就是我们要解决某些事情而要采取的解决办法。比如你们今天要来学校学习,你要怎么过来呢?你是通过公交车、打的?这些解决问题的东西都叫做方法。
- 在Java当中方法是用来完成某些事情的,比如写一个添加的方法叫做add() ,把 1 和 2 添加进去 add(1,2)他就会返回一个3 。这就是加法的方法,以前用过的println()这些都是方法。
- 首选了解什么是方法
- 方法的定义及调用
- 方法重载
- 命令行传参
- 可变参数
- 递归
什么是方法?
- System.out.println() ,是什么呢?他是输出语句,但为什么呢?结构是什么呢?System他是一个系统的类,out是System下一个输出的对象,println() 他就是一个方法。回想之前的scanner.nextLine() 这些方法都是点"."出来的,这些东西都是Java里面的方法
- System.out.println() 就是调用系统中输出对象的out中的方法println。
- 方法是语句的集合,他们在一起能够执行一个功能。我们用经常用a+b去计算会非常麻烦,我们就用一个公共的东西把他提取出来
- 方法的命名规则是首字母小写,后面是驼峰命名规则。
- 每次我们输入 public static void main (String[] args) 就出现了一个main方法。这个方法是交给程序管的,不是我们自己去写的。我们要写的方法一般都会写在他的外面。
- 先写一个加法,int是他的返回值,比如main方法里面修饰main的是void,他代表一个返回值,执行完就结束了。但是咱们加法 1+1要等于2,所以int就是这里来的。我们加法需要两个数,就给他设置两个参数int a 和 int b。这两个数是形式的,待会用的时候要给他传实际的。return一个 a+b
public static void main(String[] args) {
}
//加法
public int add(int a,int b){
return a+b;
}
- 那么写完之后就要用,但是在main里面直接调用add()是用不了的。我们要在 前面加上一个static让他变成一个类变量就可以使用了。这时候我们给他返回一个值
public static void main(String[] args) {
int sum = add(1, 2);
System.out.println(sum);
}
//加法
public static int add(int a,int b){
return a+b;
}
- 使用debug分析为什么等于3 。首选进main方法的参数是空的
- 下一步到了add方法直接跳到了add()里面执行 ,a=1,b=2,他就会把值进行一些运算。
- 在下一步就是3了,它相当于调用了一个方法去执行的。
- 方法是解决一类问题的步骤的有序组合,方法包含于类或对象中,方法在程序中被创建,在其他地方被引用。我们可以把写好的功能都抽取成一个一个的功能,要用的直接去用就好了。
- 设计方法的原则:一个方法只完成1个功能,这样有利于我们后期的扩展。
- 比如说之前写的一个功能:用for循环输出1-100能被5整除的数,并且每行输出3个
for(int i = 0;i<=100;i++){
if(i%5==0){
System.out.print(i+"\t");
}
if(i%15==0){
System.out.println();
}
}
- 那么我们把这一段功能提出来
public static void test(){
for(int i = 0;i<=100;i++){
if(i%5==0){
System.out.print(i+"\t");
}
if(i%15==0){
System.out.println();
}
}
- 调用方法的时候直接使用 test就可以了
public static void main(String[] args) {
// int sum = add(1, 2);
// System.out.println(sum);
test();
}
- main方法要时刻保持简介干净,尽量把一些公共模块都通过方法形式提取到外面来。
方法的定义
- Java方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,定义一个方法包含以下语法:修饰符、返回值类型、方法名、参数类型、方法体。
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值
}
-
修饰符可以有多个(public、static、final),可写可不写。
-
方法的返回值,上面写了一个int类型和一个void类型,加减乘除以他会返回一个数字,returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值,returnValueType是关键字void。
-
方法名:Java里面所有东西都需要有一个名字,方法名就是方法实际的名字,名字要遵循驼峰命名规范。
-
参数类型:参数就是我们可以给他传递一些具体的值,让他运算。像上面写的test()我们没有传递参数也是可以直接运行的。参数更像是一个占位符。方法里面有两个东西,一个叫做实参,一个叫做形参。实参就是调用方法实际传递给他的参数,形参就是定义方法的时候随便给他编的。比如 add(int a , int b) 这个就是形式上给他定义的两个参数。调用方法的时候 int sum = add(1,2) 就把 1赋值给了a,2赋值给了b。这就是实际调用给他传递的参数,叫做实参。
-
方法体:是方法里面包含的任何语句,他定义的一些功能。
-
return:如果方法存在返回值,一定要把返回值通过return关键字返回出去。如果是void就不用了。
-
来写一个比大小的方法。首先要写一个public,公共的,代表每个人都可以使用它。static相当于告诉大家我要直接调用它,是一个类变量。比大小的方法会返回一个数,那么写int。方法名max。
public static int max()
- 比大小必须要有两个形式参数,那么给两个int 数。如下面代码,return一般不写在if里面,而是写在最外面。
public static int max(int num1,int num2){
if (num1 > num2){
return num1;
}
}
- 那怎么把num1返回出来呢?可以定义一个变量
public static int max(int num1,int num2){
int result;
if (num1 > num2){
result = num1;
}
return result;
}
- return 这个result会有一条红线,告诉你没有初始化值。
- 比如初始化的值为-1,不管取多少,都会被下面的代码给覆盖掉
public static int max(int num1,int num2){
int result = 0;
if (num1 > num2){
result = num1;
}
return result;
}
- 在加个判断,return除了返回的意思,还有终止方法的意思。程序一旦碰到return,这个方法就结束了。
public static int max(int num1,int num2){
int result;
if (num1 == num2){
System.out.println("num1==num2");
return 0;
}
if (num1 > num2){
result = num1;
}else{
result = num2;
}
return result;
}
- 现在我们比一下大小
public static void main(String[] args) {
int max = max(10, 20);
System.out.println(max);
}
- 方法调用的方式有两种,如果方法有返回值的时候,一般方法调用会当做一个值来处理。如果方法为空(void),那么方法调用一定是一条语句,比如System.out.println 。点击println()这个方法进去看 。println就是传递x的值进去
- 返回的结果是
- 再来比较相同的结果 10 跟 10
- java是值传递,main方法是被java虚拟机调用的,除此main方法和普通正常的方法没有任何区别。java中只有值传递,有个拷贝的概念。方法可以实现共用,后面学到对象,就可以通过类调用到他。
方法的重载
- 重载就是在一个类中,有相同的函数名称,但形参不同的函数。比如上面的max方法,只适用于int,如果我给他传了一个double,10.0 ,他就比不了大小了
- 我们可以再定义一个一模一样的方法,把类型改成double,最后返回值也改成double,那么他就会比较两个double了。
double max = max(10.0, 10.0);
System.out.println(max);
}
public static int max(int num1,int num2){
int result;
if (num1 == num2){
System.out.println("num1==num2");
return 0;
}
if (num1 > num2){
result = num1;
}else{
result = num2;
}
return result;
}
public static double max(double num1,double num2){
double result;
if (num1 == num2){
System.out.println("num1==num2");
return 0;
}
if (num1 > num2){
result = num1;
}else{
result = num2;
}
return result;
}
- 这时就把一个普通的方法变成一个重载的方法了。
- 如果现在比较 10 跟 20,那么他还是会走double,因为现在还是 double max = max (10,20) 。所以我们把它改回来
int max = max(20, 10);
- 名字都用max,但是你调用int就用int类型的方法,调用double就用double类型的方法,这就是方法的重载。说白了就是一个类里面有两个相同的方法,只是参数不同,如果参数一样就崩了。jvm的编译器会根据方法的参数类型,判断到底执行哪个。
- 方法重载可以让程序更加清晰易读,比如我们还可以来3个数比较大小,只要你理清了逻辑就行。方法可以有无限多重名的,但是要确定参数类型不同。
public static int max(int num1,int num2 ,int num3){
}
- 参数列表必须不同(个数不同、或类型不同、或参数排列顺序不同等)
- 方法的返回类型可以相同也可以不相同。方法名称相同的时候,java编译器会根据调用方法的参数个数,参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。比如我再加一个参数的时候他匹配不到对应参数个数,就会报错
命令行传参
- 比如java、javac命令可以在命令行上面操作,java程序也是可以的。有时候你希望在命令行上给程序传递消息,就需要把参数传递给main方法实现。
- main方法的构成是 public static void main (String args[]) ,其中String args[]里面是可以给他传递参数的。args[] 是一个数组,我们可以把他里面的东西打印出来看到。
- args.length表示数组的长度,下面代码的含义就是遍历每一个参数
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
}
}
- 我们可以通过下标来看,数组里面有很多元素,可以通过下标访问。从0开始看到每一个元素。然后给他添加一些修饰的词可以看到当前第几个值是什么。
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("args[" + i + "]: " + args[i]);
}
}
- 在idea下面有一个terminal
- 我们可以再这个终端里面执行一下他,结果报错
javac Demo03.java
- 我们知道代码里面有个package,如果路径不对是执行不了的。退到base上一级,然后java执行全路径的文件
java base/Chaptor12/method/Demo03
java base.Chaptor12.method.Demo03
- 上面执行因为没有给参数所以没有显示任何的东西。之前说过String[] args 我们可以给他丢一个数组一样的东西。
java base.Chaptor12.method.Demo03 this is kuangshen
可变参数
- 在方法有很多不确定的参数的时候,我们会写很多类,然后写很多方法代替他。我们可以用可变参数把他替代,可变参数(不定项参数)可以传递很多值给他。
- 在方法声明中,在指定参数类型后加一个省略号(…)
- 一个方法只能指定一个可变参数,他必须是方法的最后一个参数,任何普通参数都必须在他之前声明。 eg:
public static void printMax( double... numbers){
if (numbers.length == 0){
System.out.println("No argument passwd");
return;
}
double result = numbers[0];
//排序1
for (int i = 1; i< numbers.length; i++){
if (numbers[i] > result){
result = numbers[i];
}
}
System.out.println("The max value is " + result);
}
- 比如说我们想写一个可边长参数。写一个test方法,然后new一个类,他会返回当前。实参什么都不写会输出一个对象的值
public static void main(String[] args) {
Demo05 demo05 = new Demo05();
demo05.test();
}
public void test(int... i){
System.out.println(i);
}
- 比方说现在传递输出一个数组,会报一个异常
System.out.println(i[0]);
- 可边长参数必须在最后面,所有传递参数必须一个类型。
- 刚才上面写了一个排序代码。意思是打印最大的参数,但是不确定传递的有多少参数。判断传递的参数是否等于0,如果等于0就代表你没有传递参数,就打印一个参数然后返回。result返回值是一个数组。for循环如果他遍历出来的数比result大一点,就把遍历出来的数赋值给result。
public static void printMax( double... numbers){
if (numbers.length == 0){
System.out.println("No argument passwd");
return;
}
double result = numbers[0];
//排序1
for (int i = 1; i< numbers.length; i++){
if (numbers[i] > result){
result = numbers[i];
}
}
System.out.println("The max value is " + result);
}
- 跑一下
public static void main(String[] args) {
printMax(34,3,3,2,56.5);
printMax(new double[]{1,2,3});
}