100天JAVA学习计划03-浅谈方法

Posted KingOfCoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天JAVA学习计划03-浅谈方法相关的知识,希望对你有一定的参考价值。

今天是第三天啦,哦,今天是3月30号,一个伟大的日子,本博主的生日!
今天主要简单的了解一下Java中的方法!
在上一篇文章中已经提到了方法长啥样,可能有些小伙伴会说,好像跟C语言里的函数差不多嘛(PS:原谅我会不止一次的提到C语言,毕竟这是博主写代码的启蒙语言!)。从长相上来看,确实差不多,但是地位上可差远了,Java可不是颜控哟!Java之所以称之为面向对象的语言,自然地位最高的就是类和对象,而C语言是结构化的语言,所以在C中函数才如此的重要!在Java中,方法的地位是永远赶不上类和对象的,所以,方法是不能独立存在,也不能独立执行,必须属于类或者对象如果这个方法用了static修饰,那么这个方法属于类,也叫作静态方法,通常使用类.方法名进行调用;如果没有用static修饰,那么使用对象.方法名进行调用,再说一遍,方法只能被类或者对象调用,永远不能独立执行!!!那有的小伙伴就要反驳我了,我试过,在同一个类中,可以在一个方法中直接调用另一个方法!这其实是这么回事,在同一个类中一个方法调用另一个方法,java会自己给它加上调用者的,普通方法就用this关键字,静态方法就用类名啦
下面我们来了解一下java方法的参数传递!在Java中,方法参数的传递方法只有一种,是值传递!值传递的意思就是说,我有一个参数,如果你方法想要我的参数,那我是不会给你参数的,我把参数的值copy一份给你用,但是参数还在我手里!官方一点的说法是,将实际参数值的副本传入方法而方法本身不受影响!下面这段代码就解释了值传递!

import java.util.*;
//值传递演示代码1
public class Main{

    public static void changenum(int num1,int num2){
        int temp = num1;
        num1 = num2;
        num2 = temp;
        System.out.println("在方法中:");
        System.out.println("num1 = "+num1+";num2 = "+num2);
    } 

    public static void main(String[] args){

        int num1 = 1;
        int num2 = 2;
        changenum(num1,num2);
        System.out.println("在main中:");
        System.out.println("num1 = "+num1+";num2 = "+num2);
    }
}

运行结果如图:
技术分享
这里可以清晰的看到在方法中,传入的副本被交换了,而在main中,原来的参数不受任何影响!
小伙伴们再来仔细的看这段代码,changenum(int num1,int num2)方法用了static修饰,也就是说,把他设定为静态方法,那么如果我把这个static去掉会怎么样呢?

import java.util.*;
//值传递演示代码2
//这段代码中和代码1的唯一区别是把 changenum(int num1,int num2)前的static去掉了
public class Main{

    public void changenum(int num1,int num2){//前面没有static了哟!
        int temp = num1;
        num1 = num2;
        num2 = temp;
        System.out.println("在方法中:");
        System.out.println("num1 = "+num1+";num2 = "+num2);
    } 

    public static void main(String[] args){

        int num1 = 1;
        int num2 = 2;
        changenum(num1,num2);
        System.out.println("在main中:");
        System.out.println("num1 = "+num1+";num2 = "+num2);
    }
}

那么如果我们在命令行编译一下会发生什么呢?如下图:
技术分享
哦哦,出错了,这个错误很好地验证了静态成员(用static修饰)不能直接访问非静态成员(不用static修饰)。因为main方法之前加了static,所以它就不能直接访问非静态的changenum方法!注意啦,是不能直接访问,想要访问,还是可以做到的!在main方法中这样写就可以啦!

Main test = new Main();
test.changenum(num1,num2);

创建个对象就搞定啦!
你以为这就是值传递?太天真了,关于值传递,还有如下这样的代码:

import java.util.*;
//值传递演示代码3
public class Main{

    int num1;
    int num2;

    public static void changenum(Main test){
        int temp = test.num1;
        test.num1 = test.num2;
        test.num2 = temp;
        System.out.println("在方法中:");
        System.out.println("num1 = "+test.num1+";num2 = "+test.num2);
    } 

    public static void main(String[] args){
        Main test = new Main();
        test.num1 = 1;
        test.num2 = 2;
        changenum(test);
        System.out.println("在main中:");
        System.out.println("num1 = "+test.num1+";num2 = "+test.num2);
    }
}

先来看运行结果吧:
技术分享
这下方法里的main中的结果一样了,是不是就不是值传递了呢?
当然还是值传递,这次我们传的是个对象,是个引用变量,上一篇我们讲过,引用变量里面存的是个地址,那我现在把这个地址复制给另一个引用(方法中的),那么两个引用指向了同一个对象,都对同一个对象进行操作,所以无论是在方法中进行操作还是在main函数中进行操作都是一样,因为他们都指向了同一个对象呀!
关于方法,还有几个小玩意需要了解一下:
第一,方法的形参可以是不固定的!如果你不知道一个方法到底有几个形参,那么可以在最后一个形参类型后面加三个点(…)表示程序员已经疯掉了无语了妥协了因为他不知道到底有几个参数!就像这样

import java.util.*;
//形参可变演示代码
public class Main{
    public static void meetingpeople(int num,String... name){
        System.out.print(num);
        for(String temp:name){
            System.out.print(temp);
        }
    }
    public static void main(String[] args){
        meetingpeople(3,"小张","小李","小王");
    }
}

运行结果:
技术分享
第二,方法重载。方法重载就是说一个类中可以包含2个或者以上的同名方法,只要形参列表不一样就可以了。那么在实际调用的时候,根据方法名和形参表就可以判断出来到底调用的是哪个方法。比如下面这个例子:
import java.util.*;
//方法重载演示代码
public class Main{

public static void fangfa(){
    System.out.println("我是方法1");
}

public static void fangfa(String say){
    System.out.println(say);
}

public static void fangfa(int num){
    System.out.println("我是方法"+num);
}

public static void main(String[] args){
    Main test = new Main();
    test.fangfa();
    test.fangfa("我是方法2");
    test.fangfa(3);
}

}
运行结果:
技术分享






















以上是关于100天JAVA学习计划03-浅谈方法的主要内容,如果未能解决你的问题,请参考以下文章

使用逻辑回归预测用户是否会购买SUV

二分法浅谈

你只管学,其他的我来安排;100天python从入门到就业保姆式学习指南(内附学习计划笔记分享)

深度学习100例 | 第29天-ResNet50模型:船型识别

深度学习100例 | 第29天-ResNet50模型:船型识别

深度学习100例 | 第51天-目标检测算法(YOLOv5)