日期:2014-05-20  浏览次数:20706 次

初学Java, 关于继承的例子
书上的例子,为毛跟书上答案不同。
1.为什么“创建荧光灯”之后,不先出现"构造 Lamp..."?
2.还有下面两句什么意思?
 public Filament getFilament(){
        return filament;
    }
    public void setFilament(Filament filament){
        this.filament=filament;
    }

run:
创建白炽灯
构造 Lamp...
开始构造灯丝...
开始创建白炽灯...
创建荧光灯
开始构造灯丝...
构造 Lamp...
开始创建荧光灯...
创建节能灯
构造 Lamp...
开始创建荧光灯...
开始创建节能灯...
BUILD SUCCESSFUL (total time: 0 seconds)
//------------
public class LampTest{
    public LampTest(){
        System.out.println("构造 Lamp...");
    }
    public void light(){
        System.out.println("发光...");
    }
    public static void main(String[] arguments){
        System.out.println("创建白炽灯");
        IncandecentLamp iLamp=new IncandecentLamp();
        System.out.println("创建荧光灯");
        LuorescentLamp l1=new LuorescentLamp();
        System.out.println("创建节能灯");
        EnergySavingLamp el=new EnergySavingLamp();
    }
}

class Filament{
    public Filament(){
        System.out.println("开始构造灯丝...");
    }
}
class IncandecentLamp extends LampTest{
    private Filament filament=new Filament();
    public IncandecentLamp(){
        System.out.println("开始创建白炽灯...");
    }
    public Filament getFilament(){
        return filament;
    }
    public void setFilament(Filament filament){
        this.filament=filament;
    }
}
class LuorescentLamp extends LampTest{
    public LuorescentLamp(){
        System.out.println("开始创建荧光灯...");
    }
    private static Filament filament=new Filament();
    public static Filament getFilament(){
        return filament;
    }
    public static void setFilament(Filament filament){
        LuorescentLamp.filament=filament;
    }
}
class EnergySavingLamp extends LuorescentLamp{
    public EnergySavingLamp(){
        System.out.println("开始创建节能灯...");
    } 
}

------解决方案--------------------
在Class LuorescentLamp 中存在静态成员变量:
private static Filament filament=new Filament();
在Java中,会先执行这条,再进入父类构造。

Java中执行顺序:
1. 父类的静态成员变量定义与静态初始化块
2. 子类的静态成员变量定义与静态初始化块
3. 父类的非静态成员变量定义与动态初始化块
4. 父类构造方法
5. 子类的非静态成员变量定义与动态初始化块
6. 子类构造方法
------解决方案--------------------
后面那两句话在程序中不会被执行,只是成员变量set和get方法,
因为成员变量是private,产生的对象用这两个方法赋值取值。