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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小黑子 中级黑马   /  2014-10-12 17:38  /  1193 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小黑子 于 2014-10-12 20:37 编辑

在看高新技术视频。张老师在:13_用普通类模拟枚举类的实现原理.avi  中
在EnumTest.java中这样写的,这没有什么疑惑。
  1. package cn.itheima.day1;

  2. public class EnumTest {
  3.         public static void main(String[] args) {
  4.                 WeekDay wk1 = WeekDay.SUN;
  5.                 System.out.println(wk1.nextDay());
  6.         }
  7. }
复制代码
然后第一次在WeekDay.java中是这样写,也没什么疑惑
  1. package cn.itheima.day1;

  2. public class WeekDay {
  3.         private WeekDay(){}
  4.         
  5.         public static final WeekDay SUN = new WeekDay();
  6.         public static final WeekDay MON = new WeekDay();
  7.         public static final WeekDay TUE = new WeekDay();

  8.         
  9.         public WeekDay nextDay()
  10.         {
  11.                 if(this==SUN)
  12.                 {
  13.                         return MON;
  14.                 }else if(this==MON)
  15.                 {
  16.                         return TUE;
  17.                 }else
  18.                 {
  19.                         return SUN;
  20.                 }
  21.         }
  22.         public String toString()
  23.         {
  24.                 if(this==SUN)
  25.                         return "SUN";
  26.                 if(this==MON)
  27.                         return "MON";
  28.                 if(this==TUE)
  29.                         return "TUE";
  30.                 return null;
  31.         }
  32. }
复制代码

可是第二次在WeekDay.java中是这样写的,我就不懂了。
  1. package cn.itheima.day1;

  2. public abstract class WeekDay {
  3.         private WeekDay(){}
  4.         
  5.         public static final WeekDay SUN = new WeekDay(){
  6.                 public WeekDay nextDay()
  7.                 {
  8.                         return MON;
  9.                 }
  10.         };
  11.         public static final WeekDay MON = new WeekDay(){
  12.                 public WeekDay nextDay()
  13.                 {
  14.                         return TUE;
  15.                 }
  16.         };
  17.         public static final WeekDay TUE = new WeekDay(){
  18.                 public WeekDay nextDay()
  19.                 {
  20.                         return SUN;
  21.                 }
  22.         };
  23.         
  24.         public abstract WeekDay nextDay();
  25. /*
  26.         
  27.         public WeekDay nextDay()
  28.         {
  29.                 if(this==SUN)
  30.                 {
  31.                         return MON;
  32.                 }else if(this==MON)
  33.                 {
  34.                         return TUE;
  35.                 }else
  36.                 {
  37.                         return SUN;
  38.                 }
  39.         }
  40. */        
  41.         public String toString()
  42.         {
  43.                 if(this==SUN)
  44.                         return "SUN";
  45.                 if(this==MON)
  46.                         return "MON";
  47.                 if(this==TUE)
  48.                         return "TUE";
  49.                 return null;
  50.         }
  51. }
复制代码

在这种方法中,用的匿名内部类。匿名内部类,我也知道,毕老师的视频中有讲。但是好像没讲这种形式。不是说匿名内部有个前提条件:必须继承一个父类或实现一个接口吗??  可是这里没有继承啊或者实现啊!!
第二:为什么要在类中定义一个  public abstract WeekDay nextDay();    ???
第三:张老师说public static final WeekDay SUN = new WeekDay(){   ...        }; 中的new WeekDay(){}; 是WeekDay的子类。为什么是子类呢?=================================================================
PS:刚把毕老师的匿名内部类的视频又看了一遍,明白了:lol:lol:lol



评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 加油!

查看全部评分

4 个回复

倒序浏览
大神哪里有?
回复 使用道具 举报
new WeekDay(){}这个创建子类方式记住就行了,刚开始也不能接受,后来也就习惯了
回复 使用道具 举报
Nullifier 发表于 2014-10-12 20:31
new WeekDay(){}这个创建子类方式记住就行了,刚开始也不能接受,后来也就习惯了 ...

嗯,现在明白 了,谢谢。
回复 使用道具 举报
我们从最后一个问题开始解决, WeekDay是一个抽象类对吧——“public abstract class WeekDay”最开始的定义
“抽象类是不能实例化的 换句话说抽象类是不能创建对象的”  这个你知道吧
那么为什么可以new WeekDay呢,因为这里new的不是说WeekDay的实例化对象 而是WeekDay的一个子类 ,这不过这个子类没有名字,只有一个方法,而且这个方法覆盖了父类方法,如果觉得复杂我给你举个例子吧,我简单些,不那么规范了
第一步 class FU
{  fangfa(){} }
class ZI_1 extends FU
{ fangfa(){ daima1 }  }class ZI_2 extends FU
{ fangfa(){ daima2 } }
...很多个子类  FU类里面只有一个抽象方法,引用时没有任何意义的,子类方法覆盖父类方法,
如果主函数里面要引用子类的方法,由于父类不能实例化,所以只能创建子类对象


FU obj = new ZI_1();obj.fangfa()这里懂了那么
第二步 这个子类可以写到FU类里面 作为内部类 这没有任何问题吧
class FU
{    class ZI_1    /* extends FU */内部类会隐示的继承外部类
         { fangfa() { daima1 } }
      fangfa(){}
}
第三步 如果只引用一次子类的方法 那么还要单独写一个类是不是很麻烦 这样就产生了匿名内部类
class FU
{  
      new FU(){ fangfa() { daima1 } }  若前面有变量名字 那么这个名字是这个(匿名子类的对象)的名字,也就是说子类没名字,但它的对象有名字
      fangfa(){}
}

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