JAVA基础知识之方法调用

一、方法调用

       1. 指通过对象对类的各个方法调用以便实现方法

       2. 常见形式就是对象名.方法名(参数列表)

       3.方法调用可以多次,没有限制

public class People
{

    public int age;

    public String name;

    public void getInformation()
    {

        System.out.println("这是方法");

    }

    /**
     * 方法调用
     */

    public static void main(String[] args)
    {
        People test=new People();
        
        System.out.println("我好");
        
        test.getInformation();
        
        System.out.println("你好");
                
        
    }

}

执行结果为:



二、方法调用执行顺序

              1. JAVA是遇方法则进方法,如A方法调用B方法,B方法调用C方法,那么执行时会依次进入ABC三个方法

              2. JAVA是必须执行完被调用方法后才可回到调用方法中,如A方法调用B方法,那么执行到调用时,必须等B方法执行完后再执行剩余的代码

public class People
{

    public int age;

    public String name;

    /**
     * 这是A方法
     */

    public void A()
    {

        System.out.println("这是A方法");
            
        this.B(); //调用B方法   
        System.out.println("A方法执行完毕");

    }

    /**
     * 这是B方法
     */

    public void B()
    {

        System.out.println("这是B方法");

        System.out.println("B方法执行完毕");

    }

    /**
     * 方法调用
     */

    public static void main(String[] args)
    {
        People test = new People();

        System.out.println("开始方法调用");

        test.A(); // 进行方法调用

        System.out.println("方法调用结束");

    }

}

执行结果: 程序运行先执行main方法,而后往下执行时遇到A方法调用,进入到A方法执行,遇到B方法调用,进入到B方法执行

B执行完毕后,回到A执行,A执行完后回到main方法



三、方法参数传递

             1、方法调用时传递参数必须要类型一致,否则编译报错

               

2、JAVA参数传递是哪种模式?

        1)程序设计语言中方法参数传递有两种模式,一种是按值传递,一种是按引用传递

        2)按值传递:方法接受的是调用者提供的参数的值

        3) 按引用传递:方法接受的是调用者提供的参数地址(参数引用)

        4)JAVA中方法参数总是按值传递的

当参数是基本数据结构时,是按值传递,方法无法改变参数的值

public class People
{
    /**
     * 这是change方法
     */

    public void Change(int a,int b)
    {
        
       a=a+1;
       
       b=b*10;
    }

    /**
     * 方法调用
     */

    public static void main(String[] args)
    {
        People test = new People();

        int x=1;
      
        int y=10;
        
        test.Change(x, y);
        
        System.out.println(x);
        
        System.out.println(y);
    }

}

控制台输出:1 10

若是按照引用传递,那么调用方法的时候传递的是x、y这两个变量,然后对变量值修改,得到的结果应该是2,100,但是实际结果却是1,10说明传递的并不是参数变量

若按照值传递,那么调用方式传递了1和10过去,到了change方法内部后,变量a赋值为1,变量b赋值为10,而后的操作都是对a和b执行的,因此对x和y变量没有影响,因此最后结果是1,10


当参数是对象时,传递的是对象的拷贝引用,而不是参数引用

public class People
{

    private int age;

    // 设置年龄
    public void setAge(int number)
    {
        age = number;
    }

    // 获取年龄
    public int getAge()
    {
        return age;
    }

    /**
     * 交换对象
     */

    public void ChangeAge(People x,People y)
    {
      
        People temp=x;
        
        x=y;
        
        y=temp;
        
        System.out.println(x.getAge());
        
        System.out.println(y.getAge());
        
    }

    /**
     * 方法执行
     */

    public static void main(String[] args)
    {
        People a = new People();
        
        People b = new People();
        
        People test= new People();
        
        a.setAge(200);
        
        b.setAge(300);
        
        test.ChangeAge(a, b);
        
        System.out.println("分割线");
        
        System.out.println(a.getAge());
        
        System.out.println(b.getAge());
        
    }

}

若按引用传递,传递的是对象a和b,那么经过方法中对象交换,那么最后a的age是300、b的age是200,但是结果却如下所示

若按值传递,传递的是对象的拷贝引用,即变量x和变量y是拷贝的,引用指向变量a和变量b的对象

然后通过红线指引的1、2、3步完成了方法changeAge()的三步交换

最终x指向300的age对象,y指向200的age对象

变量a和变量b的指向从未改变,因此结果如控制台


通过上述图,深入了解下,是否可以通过拷贝的引用改变对象状态,这样原变量指向的对象状态也会改变?

public class People
{

    private int age;

    // 设置年龄
    public void setAge(int number)
    {
        age = number;
    }

    // 获取年龄
    public int getAge()
    {
        return age;
    }

    /**
     * 改变对象状态
     */

    public void ChangeAge(People x)
    {
      
        x.setAge(500);
        
    }

    /**
     * 方法执行
     */

    public static void main(String[] args)
    {
        People a = new People();
        
        People test= new People();
        
        a.setAge(200);
        
        test.ChangeAge(a);
        
        System.out.println(a.getAge());
        

        
    }

}

控制台输出:500,达到了改变指向对象状态的目的

图解:



因此可以得出以下结论:

1、方法不能改变基本数据类型变量的值

2、方法可以改变一个对象的状态

3、方法不能改变一个对象变量的引用(即变量始终指向该对象)






猜你喜欢

转载自blog.csdn.net/ai_bao_zi/article/details/80843412