初学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,产生的对象用这两个方法赋值取值。