喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

$5.95 Web Hosting     

上一主题 下一主题
 14  1/2  1  2  > 
     
标题: 关于函数的调用的问题!  
 
全职杀手王 (全职杀手王)
注册会员
Rank: 2
一般会员



UID 64617
精华 0
积分 63
帖子 59
金钱 63 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-6-8
状态 离线
[广告]: Enom域名自助付费 自助注册 自助PUSH 主流域名COM等一律57.99元年
关于函数的调用的问题!

最近在研究java中函数的调用的时候遇到点问题,请看下面的程序:
class StringTest
{
        public static void Change(int x,int y)
        {
                x=x+y;
                y=x-y;
                x=x-y;
        }
        public static void Change(int[] num)
        {
                num[0]=num[0]+num[1];
                num[1]=num[0]-num[1];
                num[0]=num[0]-num[1];
        }
        public static void Change(Point pt)
        {
                pt.x=pt.x+pt.y;
                pt.y=pt.x-pt.y;
                pt.x=pt.x-pt.y;
        }
        public static void main(String[] args)
        {
                int x=646;
                int y=989;
                Change(x,y);
                System.out.println("x="+x+","+"y="+y);
                int[] num=new int[]{646,989};
                Change(num);
                System.out.println("x="+num[0]+","+"y="+num[1]);
                Point pt=new Point();
                pt.x=646;
                pt.y=8897;
                Change(pt);
                System.out.println("x="+pt.x+","+"y="+pt.y);
                System.out.println(pt.toString());
        }
       }

class Point
{
        int x,y;       
}


其中第二个和第三个change程序都实现了x和y值得的对调,惟独第一个change方法经过main函数的调用后x和y的值没有对调。这是为什么?教材上解释说:
在Java中,传参时,都是以传值的方式进行。
对于基本数据类型,传递的是数据的拷贝;对于引用类型,传递的引用的拷贝。

对于这段话不是很明白,因为我一直对java的内存使用管理方式不是很熟悉,所以理解时有些问题。希望高手解释一下!
2006-2-28 08:56 PM#1
查看资料  发短消息  QQ  顶部
 
全职杀手王 (全职杀手王)
注册会员
Rank: 2
一般会员



UID 64617
精华 0
积分 63
帖子 59
金钱 63 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-6-8
状态 离线
[广告]: Enom域名自助付费 自助注册 自助PUSH 主流域名COM等一律57.99元年
呵呵,我个人认为在学习中碰上一个良师益友是幸运的并且幸福的!愿我们一起提高自己的水平,实现自己的梦想!

由于我上的大学比较烂,所以只学了c语言,连c++都没开多少时间的课。所以java是我的第一个真正开始学习的面向对象的语言,所以我对java中一些与c区别很大的概念是相当生疏的,尤其是这个对象的概念,其实在学习中我一直想java中难道没有类似c中的指针一样的东西?那么java是用什么方法传递变量参数的内存地址的?看来还是需要时间思索的!

通过这个程序,我可不可以这样认为:作为基本数据类型,所谓的传递数据的拷贝,只是将定义的x,y值拷贝到另一个内存地址中,而在main函数调用中,调用的仍然是在main函数中的定义的x,y值。而作为引用类型,所谓传递引用的拷贝,是不是就相当于仅传递一个内存地址给change中的形式参数,而调用change函数后,是对相同地址中的实际内容做调换,所以在main函数中调用print时,内存地址不变,既引用没变,但是变量中内容却调换了。其实我对java中堆内存和栈内存的作用还是有些模糊,主要就是在涉及对象的引用的时候!

关于你的作业,我对integer还不是很熟悉,过两天再给你^_^
2006-3-1 11:02 AM#2
查看资料  发短消息  QQ  顶部
 
stanleyqian
中级会员
Rank: 3Rank: 3
中级会员


UID 29826
精华 0
积分 298
帖子 627
金钱 298 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2004-7-4
来自 Melbourne, Australia.
状态 离线
[推荐阅读] 南京招聘php开发人员及设计师
您的理解在上面的表达里基本正确,以后等你学完Java后,就会更深入地比较C与Java的不同点了,尤其是C的指针和Java的引用的对比。学完Java后就可以一步进入到C#了。

不过我还是认为,一个真正的程序员是来自于C编程,不是其他的任何语言。那些数据结构和算法在C中的实现是最完美和最快的。OOP只不过是用了Object-Oriented概念,编程的能力还是通过C的训练是最有效的(注:不是C++),你看呢?




Stanley Qian at Melboure, Australia
2006-3-1 12:43 PM#3
查看资料  访问主页  Blog  发短消息  Yahoo!  顶部
 
全职杀手王 (全职杀手王)
注册会员
Rank: 2
一般会员



UID 64617
精华 0
积分 63
帖子 59
金钱 63 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-6-8
状态 离线
[推荐阅读] xajax会员注册实例
也就是说,c是一切编程语言的基础?说的也是,毕竟面向对象语言的核心模块还是从面向过程的。没有哪个面向对象语言不用if,for语句的。我同意你的观点。不过现在c已经不大常用了。
2006-3-1 03:12 PM#4
查看资料  发短消息  QQ  顶部
 
全职杀手王 (全职杀手王)
注册会员
Rank: 2
一般会员



UID 64617
精华 0
积分 63
帖子 59
金钱 63 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-6-8
状态 离线
[推荐阅读] [杭州]代友招php程序员
Integer封装类的函数调用方法:
class StringTest
{
        public static void Change(Integer X,Integer Y)
        {
          X=X+Y;
                       Y=X-Y;
                       X=X-Y;
                       System.out.println("X="+X+","+"Y="+Y);
        }
public static void main(String[] args)
        {
                Integer X=new Integer(6);
                Integer Y=new Integer(7);
                Change(X,Y);  
                      }
2006-3-7 02:31 PM#5
查看资料  发短消息  QQ  顶部
 
stanleyqian
中级会员
Rank: 3Rank: 3
中级会员


UID 29826
精华 0
积分 298
帖子 627
金钱 298 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2004-7-4
来自 Melbourne, Australia.
状态 离线
[推荐阅读] 请问哪里有电子商务整站原码下载??
:)
不过你再看看,哪有X+Y的?(X和Y是对象啊)。你再改改。只有原始数据类型的变量才可以运算和赋值的。把int变成Integer叫Boxing,反之叫Unboxing.




Stanley Qian at Melboure, Australia
2006-3-8 12:30 AM#6
查看资料  访问主页  Blog  发短消息  Yahoo!  顶部
 
全职杀手王 (全职杀手王)
注册会员
Rank: 2
一般会员



UID 64617
精华 0
积分 63
帖子 59
金钱 63 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-6-8
状态 离线
[推荐阅读] AJAX的open问题
那应该是这样?:

class StringTest
{
public static void Change(Integer X,Integer Y)
{
           X.x=X.x+Y.y;
          Y.y=X.x-Y.y;
          X.x=X.x-Y.y;
)
public static void main(String[] args)
{
Integer X=new Integer();
Integer Y=new Integer();
                X.x=7;
                Y.y=8;
                Change(X,Y);
                System.out.println("X="+X.x+","+"Y="+Y.y);
}

class Integer
{
  int x,y;
  public String toString()
        {
                return "X="+x+","+"Y="+y;
        }

}
2006-3-8 10:01 AM#7
查看资料  发短消息  QQ  顶部
 
全职杀手王 (全职杀手王)
注册会员
Rank: 2
一般会员



UID 64617
精华 0
积分 63
帖子 59
金钱 63 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-6-8
状态 离线
[推荐阅读] PHPMailer模块谁有?
看来我对对象的概念还是模糊的!
2006-3-8 10:03 AM#8
查看资料  发短消息  QQ  顶部
 
stanleyqian
中级会员
Rank: 3Rank: 3
中级会员


UID 29826
精华 0
积分 298
帖子 627
金钱 298 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2004-7-4
来自 Melbourne, Australia.
状态 离线
[推荐阅读] 數據庫存放 session 的類
Integer类在JDK中本来就有。

class StringTest2
{
    public static Integer[] Change(Integer X,Integer Y)
    {
        Integer[] Z = new Integer[2];
        Z[0] = new Integer(Y.intValue());
        Z[1] = new Integer(X.intValue());
        return Z;
    }

    public static void main(String[] args)
    {
        Integer X=new Integer(7);
        Integer Y=new Integer(8);
        System.out.print("Before change: X=" + X.intValue() + ", ");
        System.out.print("Y= " + Y.intValue());
        System.out.println();
        Integer[] A = Change(X,Y);
        System.out.print("After change: ");
        System.out.println("X="+A[0].intValue()+","+"Y="+A[1].intValue());
    }
}

你的另一个关于Reflection的问题,我没有用过Reflection。如果没有其他人回答的话,我会一个星期后给你答复。




Stanley Qian at Melboure, Australia
2006-3-8 05:43 PM#9
查看资料  访问主页  Blog  发短消息  Yahoo!  顶部
 
全职杀手王 (全职杀手王)
注册会员
Rank: 2
一般会员



UID 64617
精华 0
积分 63
帖子 59
金钱 63 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-6-8
状态 离线
[推荐阅读] 各位英语好的进来帮忙翻译一下,感谢
你的代码我调试了,有10个错误:
F:\JAVALesson\lesson4>javac StringTest.java
StringTest.java:30: 找不到符号
符号: 方法 intValue()
位置: 类 Integer
         Z[0] = new Integer(Y.intValue());
                             ^
StringTest.java:30: 内部错误;无法将位于 Integer 的 Integer.<init> 实例化为 ()
         Z[0] = new Integer(Y.intValue());
                ^
StringTest.java:31: 找不到符号
符号: 方法 intValue()
位置: 类 Integer
         Z[1] = new Integer(X.intValue());
                             ^
StringTest.java:31: 内部错误;无法将位于 Integer 的 Integer.<init> 实例化为 ()
         Z[1] = new Integer(X.intValue());
                ^
StringTest.java:56: 找不到符号
符号: 构造函数 Integer(int)
位置: 类 Integer
               Integer X=new Integer(7);
                         ^
StringTest.java:57: 找不到符号
符号: 构造函数 Integer(int)
位置: 类 Integer
               Integer Y=new Integer(8);
                         ^
StringTest.java:58: 找不到符号
符号: 方法 intValue()
位置: 类 Integer
               System.out.print("Before change: X=" + X.intValue() + ", ");
                                                       ^
StringTest.java:59: 找不到符号
符号: 方法 intValue()
位置: 类 Integer
               System.out.print("Y= " + Y.intValue());
                                         ^
StringTest.java:63: 找不到符号
符号: 方法 intValue()
位置: 类 Integer
               System.out.println("X="+A[0].intValue()+","+"Y="+A[1].intValue())
;
                                        ^
StringTest.java:63: 找不到符号
符号: 方法 intValue()
位置: 类 Integer
               System.out.println("X="+A[0].intValue()+","+"Y="+A[1].intValue())
;
                                                                 ^
10 错误


你再看看,因为我对integer类不是很熟悉,所以只能采取覆盖的方法,而且,因为tostring是采用16进制编码的,所以我还要覆盖tostring,我个人感觉那样写简单些,你认为呢?
2006-3-9 09:46 AM#10
查看资料  发短消息  QQ  顶部
 14  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.029042 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP