黑马程序员技术交流社区

标题: 关于枚举中抽象方法的问题! [打印本页]

作者: 真真姐    时间: 2012-4-23 22:15
标题: 关于枚举中抽象方法的问题!
本帖最后由 真真姐 于 2012-10-21 14:29 编辑
  1. public abstract class WeekDay{
  2.           private WeekDay(){
  3.           }
  4.           public abstract WeekDay nextDay();

  5.          public final static WeekDay SUN = new WeekDay(){ //这讲到了大括号就是子类,有点忘记了,该去怎么理解,请分解代码
  6.                 public WeekgDay nextDay(){
  7.                      return MON;
  8.                 }
  9.          public final static WeekDay MON= new WeekDay(){ //这讲到了大括号就是子类,有点忘记了,该去怎么理解,请分解代码
  10.                 public WeekgDay nextDay(){
  11.                      return SUN;
  12.                 }
复制代码

作者: 施俊    时间: 2012-4-23 22:23
抽象类不能直接new对象,如果new了对象就一定要是他的子类,并且子类覆盖了父类的所有抽象方法。跟了大括号说明并不是在new抽象类,而是new了一个匿名内部类对象,其父类为抽象类,所以内部需要覆盖父类的抽象方法。
加注释的语句涉及多态,匿名内部类,抽象类相关知识。
作者: 徐鑫    时间: 2012-4-23 22:30
本帖最后由 徐鑫 于 2012-4-23 22:38 编辑

public abstract class WeekDay{
          private WeekDay(){
          }
          public abstract WeekDay nextDay();
         public final static WeekDay SUN = new WeekDay(){ //这边是创建一个匿名内部类并赋值给了WeekDay类型的SUN,由于WeekDay是个抽象类,所以要实现它的抽象方法nextDay()
                public WeekgDay nextDay(){
                     return MON;
                }
         public final static WeekDay MON= new WeekDay(){ //同上
                public WeekgDay nextDay(){
                     return SUN;
                }

作者: 真真姐    时间: 2012-4-23 22:46
施俊 发表于 2012-4-23 22:23
抽象类不能直接new对象,如果new了对象就一定要是他的子类,并且子类覆盖了父类的所有抽象方法。跟了大括号 ...

太模糊,请把上面的代码分解开,这样的话更直观
作者: 真真姐    时间: 2012-4-23 22:47
本帖最后由 真真姐 于 2012-10-21 14:59 编辑
徐鑫 发表于 2012-4-23 22:30
public abstract class WeekDay{
          private WeekDay(){
          }

你这是什么个意思..跟我的代码一摸一样!  张老师说的意思是 有大括号是子类如何理解
作者: 真真姐    时间: 2012-4-23 23:03
本帖最后由 真真姐 于 2012-10-21 14:59 编辑

仔细考究了会:可以这样去理解可能分解的更清楚一点:匿名类可以用作接口或抽象类的“实例化”,就像上面那样,看起来像是抽象类被实例化了,其实是存在的一个匿名实现类,是这个匿名类先实现了抽象类,而后才有这个匿名类的实例。

匿名类和内部类常常结合在一起这样使用。




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