黑马程序员技术交流社区

标题: 本类中创建子类对象 [打印本页]

作者: 李政    时间: 2013-8-2 22:21
标题: 本类中创建子类对象
本帖最后由 杜光 于 2013-8-4 10:16 编辑

package com.heima;

public abstract class WeekDay {
        private WeekDay(){}
        
        public static final WeekDay SUN = new WeekDay(){

                @Override
                public WeekDay nextDay() {
                        // TODO Auto-generated method stub
                        return MON;
                }
               
        };
        
        public static final WeekDay MON = new WeekDay(){

                @Override
                public WeekDay nextDay() {
                        // TODO Auto-generated method stub
                        return SUN;
                }
               
        };
        
        public abstract WeekDay nextDay();
        
        public String toStirng(){
                return this==SUN?"SUN":"MON";
        }
        
        
}

//张老师讲到枚举的时候,用了一个匿名内部类
我有个疑问,这个匿名内部类里面是不是会继承父类的SUN和MON这两个全局常量,然后这个内部里也会再出现一个匿名内部类,
然后这样无限的循环下去。如果这样的话,程序不是一直在创建新对象吗,这样子就没有办法结束了。
但是程序的运行结果是正常的。

谁给说说这事怎么回事呢 就是在本类中创建子类对象,这样不就无限循环了吗


作者: 夜空闪亮    时间: 2013-8-3 01:02
final表示最终的意思,被final修饰的类是不可以被继承的,被final修饰的方法可以被继承,但不能被重写,被final修饰的变量不能被改变。所以这个类并不会无限循环下去,在这个类里边创建的两个子类对象SUN和MON只是重写了父类Weekday里的虚方法nextdDay(),因为这两个类被final修饰,所以并不会在产生子类。这两个类都是静态的,都可以通过父类名来调用。所以尽管父类构造方法私有,但仍可以通过类名调用的方法得到父类内的成员和方法,所以程序的运行是正常的!!
作者: 单凯    时间: 2013-8-3 09:18
首先呢,sun和mon这两个不是全局常量,而是在本类中定义的两个静态对象,而且还被final修饰了,表明这两个对象在内存里只被创建了一次,而且不会被修改,不会循环创建下去,这是static的特点.
另外,这个匿名类只是重写了本类中的nextday方法,这是个抽象方法,还没有具体实现,但返回值类型是对象类型,注意只是重写了这个方法,而不是构造函数,不会默认被调用.
此方法被调用时返回一个mon对象后不会触发mon对象再返回sun对象,原因很简单,因为mon对象不会自己调用自己的nextday方法,所以不存在循环.

作者: 李政    时间: 2013-8-3 11:37
本帖最后由 李政 于 2013-8-3 11:47 编辑

即使不写final,程序一样正常
还是不太明白,先放放这个问题吧 谢谢各位





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