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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨卓儒 于 2012-9-5 21:30 编辑

public abstract class WeekDay {
        private WeekDay(){}
        
        public final static WeekDay Sun = new WeekDay(){ //这里到底定义的是WeekDay对象Sun还是netDay()方法?
                                                                                //如果不用内部类,应该怎么写?张老师说定义的是weekDay类的子类,哪儿能看出来是他的子类呢???
                @Override
                public WeekDay nextDay() {
                        // TODO Auto-generated method stub
                        return Mon;
                }
               
        };
        public final static WeekDay Mon = new WeekDay(){

                @Override
                public WeekDay nextDay() {
                        // TODO Auto-generated method stub
                        return Sun;
                }
               
        };

        
        public abstract WeekDay nextDay();




真是不明白,求大侠指点迷津,内部抽象类再加个匿名,把我头都搞大了,求指点

10 个回复

正序浏览
明白了,当时我的内部类就没理解太深,这次学习了! 谢谢大家
回复 使用道具 举报
  1. public final static WeekDay Sun = new WeekDay(){

  2.                 @Override
  3.                 public WeekDay nextDay() {
  4.                         // TODO Auto-generated method stub
  5.                         return Sun;
  6.                 }
  7.                
  8.         };

复制代码
由于WeekDay类是抽象类,所以不能直接new WeekDay对象,但是可以用实例化匿名内部类的方式(这跟新建一个类,然后这个类继承WeekDay抽象类,再实例化这个类的对象的方式是一样的原理.),实例化一个WeekDay类的子类对象出来,再用WeekDay类的引用指向该生成出来子类对象,也就形成了多态.
而nextDay()方法是WeekDay类的抽象方法,前面也说过了,实例化出来的匿名内部类对象是WeekDay类的子类,所以子类就要么重写父类的抽象方法,要么不实现抽象方法,子类也将父类的方法抽象出去.但现在的问题是,匿名内部类是特殊的子类,只能实现父类的抽象方法,不可以将父类的抽象方法也抽象出去(这是因为匿名类不可能再有子类的原因造成的),所以在实例化匿名内部类的时候,该匿名类就必须要重写WeekDay类的抽象方法,也就是nextDay()方法.

如果不用内部类,就要这样写:
  1. class WeekDaySon extends WeekDay {
  2.        
  3.         @Override
  4.         public WeekDay nextDay() {
  5.                 return null;
  6.         }
  7.        
  8. }
复制代码
但有个前提,用直接继承的方式来定义WeekDay类的子类,那么WeekDay类的构造方法就不能为private了.
回复 使用道具 举报
public abstract class WeekDay {
        private WeekDay(){}
        
        public final static WeekDay Sun = new WeekDay(){ //这里到底定义的是WeekDay对象Sun
                                                                        
                @Override
                public WeekDay nextDay() {
                        // TODO Auto-generated method stub
                        return Mon;
                }
               
        };
        public final static WeekDay Mon = new WeekDay(){

                @Override
                public WeekDay nextDay() {
                        // TODO Auto-generated method stub
                        return Sun;
                }
               
        };

        
        public abstract WeekDay nextDay();//这里声明了抽象类中的抽象方法nextDay(),所以继承WeekDay的类必须覆写这个方法
--------------------------------------------------------------
张老师说定义的是weekDay类的子类,哪儿能看出来是他的子类呢?
public final static WeekDay Sun = new WeekDay(){ //这里相当于继承了父类,所以是WeekDay的子类
                                                                              
                @Override
                public WeekDay nextDay() {
                        // TODO Auto-generated method stub
                        return Mon;
                }
final 修饰的类不能被子类覆盖,所以抽象类不能用final修饰!这里使用final修饰,说明它已经不是抽象类,已经通过子类向上进行类型转换生成父类的对象!
回复 使用道具 举报
这是一个抽象的类, 它不可以创建实例的,必须被别的类继承并覆盖其中的抽象方法,

而这里 里面写的,new  WeekDay(),创建的这个实例 ,  就肯定有一个类继承了抽象类,而因为抽象类里面只有一个抽象方法,

所以这里用的是匿名内部类, 来继承weekday这个抽象类,
并且在类的内部必须实现 抽象类的抽象的方法。
回复 使用道具 举报
杨卓儒 发表于 2012-9-5 19:23
怎么能看出他是继承了WeekDay呢?

你创建了一个实例,那么就得实现抽象方法。WeekDay sun = new WeekDay(){};这个new WeekDay()就是内部类,是WeekDay的子类,不过前面加个名称。
回复 使用道具 举报
杨卓儒 发表于 2012-9-5 19:23
怎么能看出他是继承了WeekDay呢?

你创建了一个实例,那么就得实现抽象方法。WeekDay sun = new WeekDay(){};这个new WeekDay()就是内部类,是WeekDay的子类,不过前面加个名称吧
回复 使用道具 举报
杨卓儒 发表于 2012-9-5 19:23
怎么能看出他是继承了WeekDay呢?

你创建了一个实例,那么就得实现抽象方法。WeekDay sun = new WeekDay(){};
这个new WeekDay()就是内部类,是WeekDay的子类,不过前面加个名称吧
回复 使用道具 举报
本帖最后由 尤洋 于 2012-9-5 20:40 编辑

基础要学扎实啊,不然很简单的问题也要想很久。

匿名内部类的格式:new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }
          对比一下    new    WeekDay()   { -----code--------}

知道怎么看出他是继承了WeekDay了吧!
回复 使用道具 举报
彭润生 发表于 2012-9-5 19:11
public abstract class WeekDay {
         private WeekDay(){}
         

怎么能看出他是继承了WeekDay呢?
回复 使用道具 举报
public abstract class WeekDay {
         private WeekDay(){}
         
         public final static WeekDay Sun = new WeekDay(){ //这儿是WeekDay的一个对象sun,抽象类中有一个抽象的方法,所以要实现nextDay方法。
                                                                                 //如果不用内部类,那么就继承该类,也要实现nextDay方法。
                 @Override
                 public WeekDay nextDay() {
                         // TODO Auto-generated method stub
                         return Mon;
                 }
                 
        };
        public final static WeekDay Mon = new WeekDay(){

                @Override
                 public WeekDay nextDay() {
                         // TODO Auto-generated method stub
                         return Sun;
                 }
                 
        };

        
         public abstract WeekDay nextDay();


类里面有抽象的方法,继承必须实现抽象的方法,new WeekDay(){/*这里要实现这个类中的抽象方法*/}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马