zoukankan      html  css  js  c++  java
  • 参数传递

    先了解

    值传递和地址传递的问题

    引用类型和基本类型的问题.
    基本类型就是java数据的那8种基本类型 ,引用类型字面意思就是把原来的对象引用了,比如字符串、类、方法就是引用类型.

    比如:

    一个类BOOK;

    BOOK book;
    BOOK book=new BOOK();

    可以这么理解:
    引用是放对象的一个内存地址,不是放一个对象
    简单说book是BOOK类一个对象 
    事实上应该说book是包含BOOK对象的引用


    其次是值传递和地址传递的问题.

    以下面例子为例
    int a=1;
    String b="1";

    a就是1,1就是a,当你修改a就是直接改堆栈里面的值. 就是上面说的地址传递  (用equal?)

    b="1",就可以理解成是一个指向内存堆地址的指针,把1赋给变量b。
    当你b的值,其实改的是内存堆里的内容,指针本身是没有改变的,也就是内存地址不变.

     

    在java中,变量的存放的位置主要还是取决于它声明的位置.
    比如:
    在方法参数中的声明或者是局部变量就是放在栈.
    对于new出来的对象和类声明的局部变量,始终还是被JVM放在堆里面.
    例子:
    String str = "abc";
    String str = new String("abc");
        
    例如String str = new String("abc");

    new出的new String("abc")是放在内存堆里面的,内容还是abc,跟上面的String str = "abc"一样.
    但是很显然两者存放的位置是不一样的. 这一点要清楚。

    解释引用变量存放位置的原理:
    对象在创建时将为所有的成员变量分配内存
    对象会在创建时被分配到堆中的空间,因此成员变量就会被分配在堆中
    方法在调用时被JVM线程加载至栈中,局部参数或变量临时分配内存空间,
    局部变量及参数的所在位置存在与栈中,这些局部变量及参数所占空间是临时的,一旦方法调用结束其临时空间就会被释放。

     

    参数传递栗子如下:

     1 class studentsev{
     2     
     3     String name;
     4     int age;
     5     
     6 }
     7 
     8 
     9 public class parapass2 {
    10 
    11     public  void calc1(int n2)
    12     
    13     {
    14         n2=n2+1;
    15         System.out.println("n1="+n2);
    16         
    17         //传递是内存地址.
    18             
    19     }
    20 
    21     public  void calc2(studentsev student){
    22         student.age=student.age+1;
    23     }
    24     //定义在方法里面的变量.都是存放在堆中.传递的只是student的值.方法调用结束后就释放掉.
    25     
    26     public static void main(String[] args){
    27     parapass2 ps2=new parapass2();
    28     int n1=8;
    29     ps2.calc1(n1);
    30     
    31     studentsev stu=new studentsev();
    32     stu.age=18;
    33     ps2.calc2(stu);
    34     System.out.println("n="+n1+" age="+stu.age);
    35     
    36     //最后出来的n=9,n1是全局变量.在方法里面修改了内容之后,就结束了.在内存里面的还是原来的.
    37     //System.out.println("n1="+n2+" age="+stu.age);
    38     
    39     //n2处会出现一个提示信息 :n2 cannot be resolved to a variable
    40     //n2是一个局部变量,出了类方法的范围就不能够在使用了.
    41 
    42     }
    43 
    44 }

    运行结果:_________________
    n1=9
    n=8 age=19

     

  • 相关阅读:
    python实现简单的百度翻译
    有趣的if循环
    用python代码模拟登录网站
    解决kali中的中文乱码问题
    基于linux下的NIST数字测试(下)——测试过程
    基于linux下的NIST数字测试(上)——安装过程
    2019-2020-20199135 《网络攻防实践》第3周作业
    2019-2020-20199135 《网络攻防实践》第2周作业
    2019-2020-20199135《网络攻防实践》第1周作业
    20199135网络攻防与实践作业
  • 原文地址:https://www.cnblogs.com/Ansonrelovisa/p/5950383.html
Copyright © 2011-2022 走看看