A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1334724053 中级黑马   /  2014-7-9 16:17  /  1898 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

主函数中调用了函数,而这个函数用到了主函数的数据,调用完之后,会对主函数的数据用影响吗。

13 个回复

倒序浏览
当然不会。而且,Java里习惯叫方法
回复 使用道具 举报
  1. class  Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int num=10;
  6.                 Func_1(num);
  7.                 char[] chs=new char[]{'a','b','c','d'};;
  8.                 Func_2(chs);
  9.                 System.out.println("Hello World!");
  10.         }
  11.         public static void Func_1(int count)
  12.         {
  13.                 return;
  14.         }
  15.         public static void Func_2(char[] arg)
  16.         {
  17.                 return;
  18.         }
  19. }
复制代码


拿函数调用主函数中定义的变量举例:

1.对于        int num=10;
                Func_1(num);
                方法Func_1(int count)中“count”为形参,而“num”作为该方法的一个实参。
                当调用该方法时,程序在内存栈中为“count”分配一个内存空间,
                并且把“num”的值传递赋值给“count”,而“num”本身的内存空间并没有发生改变。
                所以改变count的值不会影响num的值。(两个根本不在同一块空间内存放)
2.对于 char[] chs=new char[]{'a','b','c','d'};
                Func_2(chs);
                同理,方法Func_2(char[] arg)中“arg”为形参,而“chs”作为了该方法的一个实参。
                chs作为数组类型(引用类型的一种),在分配内存空间时,
                会在一个称作“堆”的内存空间分配一块空间,用于存放数组数据,
                并把刚分配的空间的首地址记录下来,放在为数组名chs在“栈”上分配的空间里。
                当调用Func_2方法时,程序在内存栈中为数组名为“arg”分配一个空间,并把存储在“chs”数组名中的数组数据存储的首地址赋值给“arg”,
                此时,“arg”和“chs”会指向“堆”中同一块空间,当修改“arg”中的数据时,其实就是修改的“堆”中的内容,而“arg”和“chs”又指向“堆”中的
                同一块内存空间,所以修改“arg”会改变“chs”。

我建议你可以看一下视频中讲函数内存调用过程那一节。第一次回复技术性问题,有不清楚或者不对的地方,希望多多原谅。

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
如果主函数传参的是一个容器的话,则会影响的,否则不会影响,java中的容器包括:数组,StringBuilder,StringBuffer以及集合。
回复 使用道具 举报 1 0
不会,你是调用而不是覆盖,所以没有影响。
回复 使用道具 举报
o(︶︿︶)o 唉。。正在学习中,感觉 可能赶不上40期了,
回复 使用道具 举报
tc庄稼汉 发表于 2014-7-9 18:17
拿函数调用主函数中定义的变量举例:

1.对于        int num=10;

class lianxi5
{
        public static void main(String[] args)
        {
       int[] a=new int[]{5,1,6,4,2,8,9};
           //System.out.println(a);  这个只会打印地址值,因为a为堆内存,里面存放的是地址
           daying(a);
           bijiao(a);
           daying(a);
        }
        public static void bijiao(int[] b)
        {
       for(int x=0;x<b.length-1;x++)
           {
                   for(int y=x+1;y<b.length;y++)
                   {
             int num=0;
                         if (b[y]>b[x])
                         {
                 num=b[y];
                                 b[y]=b[x];
                                 b[x]=num;
                         }
                   }
           }
        }
        public static void daying(int[] a)
        {   
                System.out.print("[");
                for(int x=0;x<a.length;x++)
                {
                  if(x!=a.length-1)
                  System.out.print(a[x]+", ");
                  else
          System.out.print(a[x]+"]");
                }
               
        }

在这个函数中,bijiao函数调用了主函数中的数组,当daying函数打印数组中的值时,数值已经改变。这不是改变了数组中的数值吗。
回复 使用道具 举报
yangcy 发表于 2014-7-9 18:29
如果主函数传参的是一个容器的话,则会影响的,否则不会影响,java中的容器包括:数组,StringBuilder,Str ...

我现在还没学到你那里,你说的有些听不懂。感谢你的回答,谢谢。
回复 使用道具 举报
jwx555 发表于 2014-7-9 17:41
当然不会。而且,Java里习惯叫方法

谢谢你的回答。
回复 使用道具 举报
对于这个问题,一两句说不清楚的,总之原数据不是说不会改变的...
你看看这个,是我查找资料和自己总结的希望对你有些帮助
http://bbs.itheima.com/thread-128320-1-1.html

回复 使用道具 举报
1334724053 发表于 2014-7-9 20:17
class lianxi5
{
        public static void main(String[] args)

对的。数组a作为bijiao(int[] b)方法的实参传递进去,所以数组a和数组b指向了内存堆中同一块空间,你现在操作数组b,其实也是在操作数组a指向的堆中的数据。
回复 使用道具 举报
云的牧羊人 来自手机 中级黑马 2014-7-9 21:58:30
12#
请先了解局部变量的作用域问题。
回复 使用道具 举报
燿陚√揚葳 发表于 2014-7-9 20:49
对于这个问题,一两句说不清楚的,总之原数据不是说不会改变的...
你看看这个,是我查找资料和自己总结的希 ...

谢谢,你总结的很好。我有一点懂了,我自己再琢磨琢磨。
回复 使用道具 举报
tc庄稼汉 发表于 2014-7-9 21:50
对的。数组a作为bijiao(int[] b)方法的实参传递进去,所以数组a和数组b指向了内存堆中同一块空间,你现在 ...

谢谢,你说的很好,我有点懂了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马