- public final static WeekDay Sun = new WeekDay(){
- @Override
- public WeekDay nextDay() {
- // TODO Auto-generated method stub
- return Sun;
- }
-
- };
复制代码 由于WeekDay类是抽象类,所以不能直接new WeekDay对象,但是可以用实例化匿名内部类的方式(这跟新建一个类,然后这个类继承WeekDay抽象类,再实例化这个类的对象的方式是一样的原理.),实例化一个WeekDay类的子类对象出来,再用WeekDay类的引用指向该生成出来子类对象,也就形成了多态.
而nextDay()方法是WeekDay类的抽象方法,前面也说过了,实例化出来的匿名内部类对象是WeekDay类的子类,所以子类就要么重写父类的抽象方法,要么不实现抽象方法,子类也将父类的方法抽象出去.但现在的问题是,匿名内部类是特殊的子类,只能实现父类的抽象方法,不可以将父类的抽象方法也抽象出去(这是因为匿名类不可能再有子类的原因造成的),所以在实例化匿名内部类的时候,该匿名类就必须要重写WeekDay类的抽象方法,也就是nextDay()方法.
如果不用内部类,就要这样写:- class WeekDaySon extends WeekDay {
-
- @Override
- public WeekDay nextDay() {
- return null;
- }
-
- }
复制代码 但有个前提,用直接继承的方式来定义WeekDay类的子类,那么WeekDay类的构造方法就不能为private了. |