黑马程序员技术交流社区
标题:
本类中创建子类对象
[打印本页]
作者:
李政
时间:
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