import java.util.*;
public class test2 {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
int index1 = c.get(Calendar.MONTH);
System.out.println("现在是今年的第"+index1+1+"个月");

System.out.println("现在是今年的第"+Calendar.MONTH+1+"个月");//上面的是标准,该行是错的,
//我的问题是为什么直接用Calendar.MONTH是错的,这个Calendar类的get(~)方法内部是怎么实现
//的呀.实在想不明白.请大神别复制了源代码然后不给解释呐,我看不懂才来问的.大神9我
}
}

解决方案 »

  1.   

    Calendar.MONTH是个常量,get是方法,获取Calendar.MONTH执行的字段的信息打个比方有个类class A {
        public static final int MONTH = 0;    public static int get(int field) {
            return 100;
        }
    }LZ觉得System.out.println(A.MONTH)和System.out.println(A.get(A.MONTH))是一样吗?
      

  2.   

    直接看源码里面 public int get(int field)
        {
            complete();
            return internalGet(field);
        }    protected final int internalGet(int field)
        {
            return fields[field];
        }可以看出Calendar.MONTH只是一个数组索引,而get方法返回的是数组里面的值,两者是不同的
      

  3.   

    但是不管我把系统时间改成什么年月日,我发现System.out.println(Calendar.MONTH)永远是打印2的啊.
    既然永远打印的是2,那java凭什么通过c.get(Calendar.MONTH)能获得对应的月,那为什么用了c.get(Calendar.MONTH)能随着系统时间更改成改变成对应月了呢?
      

  4.   

    还是先看一下源码 // Field descriptor #98 I
      public static final int ERA = 0;
      
      // Field descriptor #98 I
      public static final int YEAR = 1;
      
      // Field descriptor #98 I
      public static final int MONTH = 2;
      
      // Field descriptor #98 I
      public static final int WEEK_OF_YEAR = 3;
      
      // Field descriptor #98 I
      public static final int WEEK_OF_MONTH = 4;
      
      // Field descriptor #98 I
      public static final int DATE = 5;
    Calendar.MONTH  不是指现在是现在的月份 而是字段,当你传入Calendar.MONTH是,java将其转换成字段2 ,这说明你要取得是月份,然后从特定的数组中取出月份 ,所以不管几月份 Calendar.MONTH永远是2,相同的当你传入Calendar.YEAR,java转成1,java才去取年份