黑马程序员技术交流社区

标题: 一个关于 值调用 和引用调用的java问题 [打印本页]

作者: 李元峰    时间: 2012-6-16 14:16
标题: 一个关于 值调用 和引用调用的java问题
大伙看看 本来我是要排序的 但是 打印出来的结果却没有
但是用上面的 注释掉的 for 循环却能正确排序
我想很多人都认为 java 有引用调用
但是 java 只用值调用 没有引用调用!
我想很多人都碰到过这样的问题 我觉得 很人会在这个地方犯错
希望大家注意
  1. package javatext;

  2. public class DateFound {


  3.         public static void main(String[] args) {
  4.               Date[] dates = new Date[5];
  5.              
  6.               dates[0]=new Date(2012,9,23);
  7.               dates[1]=new Date(2012,5,25);
  8.               dates[2]=new Date(2012,12,4);
  9.               dates[3]=new Date(2013,5,2);
  10.               dates[4]=new Date(2010,3,31);
  11.             
  12.               //打印排序前的dates
  13.               for(int i=0; i<dates.length;i++){
  14.              
  15.                       System.out.println(dates[i]);
  16.                       }
  17.              
  18.               System.out.println();
  19.               Date d = new Date(2012,12,4);
  20.              // System.out.println(d);
  21.               System.out.println();
  22.              
  23.               //对dates 数组排序(冒泡排序 从小到大)
  24. /*              for(int i=0; i<dates.length-1; i++){
  25.                       for(int j=0; j<dates.length-i-1; j++){
  26.                               if(dates[j].compare(dates[j+1])==1){
  27.                                       Date date = new Date();
  28.                                       date = dates[j];
  29.                                       dates[j]=dates[j+1];
  30.                                       dates[j+1]=date;

  31.                               }
  32.                       }
  33.               }*/
  34.              
  35.               dates = Date.sortDates(dates);
  36.              
  37.              
  38.              /* int index = Date.binaryFound(dates,d);*/
  39.               //打印排序后的 dates
  40.               for(int i=0; i<dates.length;i++){
  41.                      
  42.                       System.out.println(dates[i]);
  43.                       }
  44.              /* System.out.println(index);*/
  45.   
  46.              
  47.         }
  48.        
  49.        


  50. }

  51. class Date {
  52.         private int year;
  53.         private int month;
  54.         private int day;
  55.        
  56.         public Date(){}
  57.         public Date(int year, int month, int day){
  58.                 this.year=year;
  59.                 this.month=month;
  60.                 this.day=day;
  61.         }
  62.        
  63.         //比较两个Date 数的大小
  64.         public int compare(Date date){
  65.                 return year>date.year?1:
  66.                            year<date.year?-1:
  67.                                     month>date.month?1:
  68.                                     month<date.month?-1:
  69.                                             day>date.day?1:
  70.                                         day<date.day?-1:0;
  71.                                                    
  72.         }
  73.        
  74.        
  75.         //查找一个 给定的 Date 对象 在已经排好序的 Date[] 数组中的索引 (二分法)
  76.         public static int binaryFound(Date[] dates, Date date){
  77.                 int length = dates.length;
  78.                 if(length==0)return -1;
  79.                 int startPosition,endPosition,midPosition;
  80.                 startPosition =0;
  81.                 endPosition =length-1;
  82.                 midPosition =(startPosition+endPosition)/2;
  83.                 while(startPosition<=endPosition){
  84.                         if(date.compare(dates[midPosition])==0){
  85.                                   return midPosition;
  86.                         }
  87.                                 if(date.compare(dates[midPosition])>=0){
  88.                                         startPosition=midPosition+1;
  89.                                 }else{
  90.                                         endPosition=midPosition-1;
  91.                                 }
  92.                         midPosition =(startPosition+endPosition)/2;
  93.                 }
  94.                 //如果程序执行到这里 说明没有找到
  95.                 return -1;
  96.                
  97.                
  98.                
  99.         }
  100.        
  101.        
  102.        
  103.         //对给定数组排序
  104.         public static Date[] sortDates(Date[] dates){
  105.                    for(int i=0; i<dates.length-1; i++){
  106.                               for(int j=0; j<dates.length-i-1; j++){
  107.                                       if(dates[j].compare(dates[j+1])>1){
  108.                                               Date date = new Date();
  109.                                               date = dates[j];
  110.                                               dates[j]=dates[j+1];
  111.                                               dates[j+1]=date;

  112.                                       }
  113.                               }
  114.                       }
  115.                   
  116.                    return dates;
  117.         }
  118.        
  119.        
  120.        
  121.        
  122.        
  123.     public String toString(){
  124.             return "["+year+","+month+","+day+"]";
  125.     }
  126.        
  127. }
复制代码

作者: 刘笑    时间: 2012-6-16 14:26
Java的对象参数传递是值调用.下面例子更简单:
public class Employee {
public String name=null;
public Employee(String n){
this.name=n;
}
//将两个Employee对象交换
public static void swap(Employee e1,Employee e2){
Employee temp=e1;
e1=e2;
e2=temp;
System.out.println(e1.name+" "+e2.name); //打印结果:李四 张三
}
//主函数
public static void main(String[] args) {
Employee worker=new Employee("张三");
Employee manager=new Employee("李四");
swap(worker,manager);
System.out.println(worker.name+" "+manager.name); //打印结果仍然是: 张三 李四
}
}
虽然形参对象e1,e2的内容交换了,但实参对象worker,manager并没有互换内容。这里面最重要的原因就在于形参e1,e2是实参worker,manager的地址拷贝。
由上可看出Java的对象参数传递是值调用,而不是引用调用

作者: 胡大强    时间: 2012-6-16 14:30
楼主太强大了。。赞一个~!。这个问题确是很容易出错。。是要注意。。。。

是不是java里面相当于值调用了就自动装起来了。。。下次再用值并没有变?
作者: 李元峰    时间: 2012-6-16 15:32
胡大强 发表于 2012-6-16 14:30
楼主太强大了。。赞一个~!。这个问题确是很容易出错。。是要注意。。。。

是不是java里面相当于值调用了 ...

java里面只有值调用  和自动包装机制没有关系
自动包装机制 看javaAPI文档  说的是 基本类型和对应的对象类型之间的自动封装与解封装
比如 int  有对应 的 Integer
  double  对应 Double
  float   对应 float
  boolean 对应 Boolean .....等等
你可以自己写两个程序 验证验证
作者: 胡大强    时间: 2012-6-16 15:43
李元峰 发表于 2012-6-16 15:32
java里面只有值调用  和自动包装机制没有关系
自动包装机制 看javaAPI文档  说的是 基本类型和对应的对 ...

好的。。。感谢楼主的信息~!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2