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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李元峰 中级黑马   /  2012-6-16 14:16  /  1432 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大伙看看 本来我是要排序的 但是 打印出来的结果却没有
但是用上面的 注释掉的 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. }
复制代码

评分

参与人数 1黑马币 +20 收起 理由
职业规划-刘倩老师 + 20 不错的分享!赞一个!

查看全部评分

4 个回复

倒序浏览
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:31
回复 使用道具 举报
楼主太强大了。。赞一个~!。这个问题确是很容易出错。。是要注意。。。。

是不是java里面相当于值调用了就自动装起来了。。。下次再用值并没有变?
回复 使用道具 举报
胡大强 发表于 2012-6-16 14:30
楼主太强大了。。赞一个~!。这个问题确是很容易出错。。是要注意。。。。

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

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

好的。。。感谢楼主的信息~!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马