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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 董波 中级黑马   /  2013-5-6 08:17  /  1357 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 董波 于 2013-5-6 11:46 编辑
  1. abstract class WeekDay{
  2.     private WeekDay(){};
  3.     public final static WeekDay SUN=new WeekDay(){
  4.            public WeekDay nextDay(){
  5.                 return MON;//执行该段代码的时候,“MON”不是还没被创建吗,怎么能返回它呢??
  6.            }
  7.     };
  8.     public final static WeekDay MON=new WeekDay(){
  9.            public WeekDay nextDay(){
  10.                 return SUN;
  11.            }
  12.     };
  13.     public abstract WeekDay nextDay();
  14.     public String toString(){
  15.          return this==SUN?"SUN":"MON";
  16. }
  17. }

  18. class Test{
  19.    public static void main(String[] args){
  20.        WeekDay weekday=WeekDay.MON;
  21.        System.out.println(weekday.nextDay());
  22.    }
  23. }
复制代码
问题如代码中所示。
一直对内部类比较困惑,想知道这段代码的执行顺序。求指教。。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

3 个回复

倒序浏览
因为MON和SUN都被static静态修饰。
所以会随着类的加载而加载。
也就是说会在这里new WeekDay();
WeekDay weekday=WeekDay.MON;//这里你调用的是MON。
System.out.println(weekday.nextDay());//返回结果就是SUN。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘海东 于 2013-5-6 09:36 编辑
  1. abstract class WeekDay
  2. {
  3.     private WeekDay(){};
  4.     public final static WeekDay SUN=new WeekDay()//SUN修饰之后为全局对象
  5.     {                                                                                        //这里是用内部类的形式将抽象方法复写再实例化
  6.            public WeekDay nextDay()
  7.            {
  8.                 return MON;//执行该段代码的时候,“MON”不是还没被创建吗,怎么能返回它呢??
  9.            }
  10.     };
  11.     public final static WeekDay MON=new WeekDay()//MON修饰之后为全局对象
  12.     {                                                                                        //这里是用内部类的形式将抽象方法复写再实例化
  13.            public WeekDay nextDay()
  14.            {
  15.                 return SUN;
  16.            }
  17.     };
  18.     public abstract WeekDay nextDay();//这里是一个抽象方法,返回值类型为WeekDay类型
  19.     public String toString()
  20.     {
  21.          return this==SUN?"SUN":"MON";
  22.     }
  23. }

  24. class Test2
  25. {
  26.    public static void main(String[] args)
  27.    {
  28.        WeekDay weekday=WeekDay.MON;//创建weekDay对象等于MON
  29.        System.out.println(weekday.nextDay());//MON的nextDay()方法返回的是SUN
  30.    }
  31. }
复制代码
我也是似懂非懂
我的理解是你的那两个对象被static修饰之后
就随类的加载而一起加载了

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
被static修饰的成员,是随着类的加载而加载的,随着类的消失而消失的,静态成员的生命周期是很长的。你的代码中的MON和SUN 是被static修饰的WeekDay类型的变量,所以在主函数中使用 这个语句 WeekDay weekday=WeekDay.MON;的时候,首先:WeekDay类在内存中得到加载,这时候静态变量MON和SUN便被加载了,也就是说MON和SUN变量已经存在了。然后 =WeekDay.MON 这时候才开始进行MON内部类的加载。
这是我的理解,希望各位能够指正其中错误的地方,谢谢。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马