• Java中的参数传递


    C++中的参数传递

    在我们讨论 “Java中参数传递的类型” 这个问题之前,我们首先需要对参数传递的类型做一些了解。

    众所周知,Java语言的许多概念是传承自C++的,因此我们需要先对C++的参数传递类型做一些了解。C++中参数的传递有三种,分别是:

    传值

      具体操作:在调用函数/方法时,会创建形参列表中的相应对象,并将实参的各项值,复制给新创建的形参。

    下面贴一段代码,进行分析:

    #include <iostream>
    using namespace std;
    
    //成绩类:内含语、数、英 三科成绩
    class Score{
    public:
        double chinese;
        double math;
        double english;
        //构造方法
        Score(){}
        Score(double chinese,double math,double english){
            this->chinese = chinese;
            this->math = math;
            this->english = english;
        }
    };
    
    //学生类:内含年龄、成绩
    class Student{
    public:
        //构造函数
        Student(int age,Score score){
            this->age = age;
            this->score = score;
        }
        void setAge(int age){
            this->age = age;
        }
        void setScore(Score score){
            this->score = score;
        }
        //信息概览
        void show(){
            cout<<"该生今年"<<age<<"岁,语数英三科分别为"<<score.chinese<<" - "<<score.math<<" - "<<score.english<<endl;
        }
    private:
        int age;
        Score score;
    };
    
    void changeStudent(Student student){
        student.setAge(99);
    }
    
    int main()
    {
        //创建一个学生
        Score score(88,90,95);
        Student student(17,score);
      //展示学生信息
        student.show();
    
      //调用修改函数
        changeStudent(student);
    
      //再次展示学生信息
        student.show();
    
        return 0;
    }
    

    从执行结果可以看到,两次show()展示的信息是一样的。这是因为在调用changeStudent()函数时,传的是值——changeStudent()函数会新创建一个形参Student对象,然后把实参的各个属性拷贝到形参中。

    如果在changeStudent函数的头部和底部分别调用student.show方法,就会发现函数内的student的值确实修改了,不过这个student是changeStudent函数临时创建的,它位于方法栈帧内,与主函数中的student除了值相同,没有一分钱的关系,他们的地址并不相同 —— 换言之,他们并不是一个对象。这个临时创建的student会在函数执行完后,随着方法栈帧的弹出自行销毁。

    传指针

      具体操作:在调用函数/方法时,会创建一个形参指针,并将实参指针的值(即被指向变量的地址),拷贝给实参指针(从描述就可以看出,传指针其实就是传值):

    #include <iostream>
    using namespace std;
    
    //成绩类:内含语、数、英 三科成绩
    class Score{
    public:
        double chinese;
        double math;
        double english;
        //构造方法
        Score(){}
        Score(double chinese,double math,double english){
            this->chinese = chinese;
            this->math = math;
            this->english = english;
        }
    };
    
    //学生类:内含年龄、成绩
    class Student{
    public:
        //构造函数
        Student(int age,Score score){
            this->age = age;
            this->score = score;
        }
        void setAge(int age){
            this->age = age;
        }
        void setScore(Score score){
            this->score = score;
        }
        //信息概览
        void show(){
            cout<<"该生今年"<<age<<"岁,语数英三科分别为"<<score.chinese<<" - "<<score.math<<" - "<<score.english<<endl;
        }
    private:
        int age;
        Score score;
    };
    
    void changeStudent(Student *pStudent){
        pStudent->setAge(99);
    }
    
    int main()
    {
        //创建一个学生
        Score score(88,90,95);
        Student student(17,score);
        //创建一个指针
      Student *pStudent = &student;
      //展示学生信息
        student.show();
    
      //调用修改函数
        changeStudent(pStudent);
    
      //再次展示学生信息
        student.show();
    
        return 0;
    }
    

    执行发现两次show()展示的信息改变了。 大体流程如下:我们在调用changeStudent时,创建了一个形参指针,然后将实参的值(即student的地址)赋给形参指针,在方法调用时,首先通过解引用运算符*找到指针所指向的对象,然后将他的年龄修改为99。因此我们在主函数中再次展示学生信息时,发现年龄改变了。

    相信大家对这个结果是没有疑问的,关键在于,传指针这个操作本身,其实还是传值,只不过值由具体的对象变成了地址(指针)。

    传引用

    传指针跟传引用在本质上是一样的,都是传递地址。区别只是引用的指向不可改变(即相当于将方法形参设为const),同时指针和引用调用属性/方法的方式不同(指针使用 -> ,引用使用 .

    总结

    有了以上的分析,我们可以知道,Java的基本数据类型传递很显然是值传递,而Java的引用数据类型的传递,实际上就是传引用(只不过Java中引用的指向默认是可变的,如果用final修饰形参,那么就跟C++中的引用完全一样了),而传引用实际上就是传递地址值,所以有很多人认为Java中只有值传递。

    其实这种论断就是废话,按这种说法,任何语言里的形参传递本质上都是值传递

  • 相关阅读:
    22天学习java基础笔记之day08
    22天学习java基础笔记之day07
    22天学习java基础笔记之day06
    22天学习java基础笔记之day05
    架构师_设计模式_行为型_迭代器
    架构师_设计模式_行为型_命令模式
    架构师_设计模式_行为型_责任链模式
    架构师_设计模式_行为型_模板方法
    架构师_设计模式_结构型_装饰器模式
    架构师_设计模式_结构型_桥接模式
  • 原文地址:https://www.cnblogs.com/simplelong/p/13585696.html
Copyright © 2020-2023  润新知