5.定义交通工具、汽车、火车、飞机这些类,注意它们的继承关系,为这些类提供超过3个不同的构造器,并通过实例初始化块提取构造器中的通用代码。
疑问:实例初始化块能够提取的,通用代码,不都是可以放在构造器之外的吗?为什么还需要提取出来呢?
我懂了,在构造器内是可以执行比如 System.out.println(),这样的方法的,而在构造器外是不行的,除非是放在实例初始化块中或者类初始化块中,
Vehicle.java 交通工具抽象类
package vehicle;
/**
* 一个交通工具抽象类,因为没有一种叫做交通工具的交通工具,
* 所以不能创造叫做交通工具的实例
* @author 程序代号
* @version 1.0
*/
public abstract class Vehicle
{
private String name;//名称
private String speed;//每小时的行驶速度
//提供默认构造器
public Vehicle()
{
System.out.println("Vehicle的无参数构造器");
}
public Vehicle(String name)
{
this.name = name;
System.out.println("Vehicle的name参数构造器");
}
public Vehicle(String name , String speed)
{
this(name);
this.speed = speed;
System.out.println("Vehicle的全部参数构造器");
}
/**
* 交通工具启动的方法
*/
public void start()
{
System.out.println(name+"启动了");
}
/**
* 交通工具停止的方法
*/
public void stop()
{
System.out.println(name+"停下了");
}
/**
* name的set方法
* @param name 交通工具的名称
*/
public void setName(String name)
{
this.name = name;
}
/**
* name的get方法
* @return name 返回交通工具的名称
*/
public String getName()
{
return name;
}
/**
* speed的set方法
* @param speed 交通工具的速度
*/
public void setSpeed(String speed)
{
this.speed = speed;
}
/**
* speed的get方法
* @return speed 交通工具的速度
*/
public String getSpeed()
{
return speed;
}
}
Car.java
package vehicle;
public class Car extends Vehicle
{
private int wheelnum;//轮子的数量,两个轮子的是摩托车,四个轮子的是汽车
//提供构造器
public Car()//默认构造器
{
System.out.println("汽车造好了");
}
public Car(String name )
{
super(name);
System.out.println("汽车造好了");
}
public Car(String name,String speed)
{
super(name, speed);
System.out.println("汽车造好了");
}
public Car(String name ,String speed,int wheelnum)
{
super(name,speed);
this.wheelnum = wheelnum;
System.out.println("汽车造好了");
}
public Car(int a)
{
System.out.println("特立独行的构造器"+a);
}
/**
* 汽车转弯的方法
*/
public void turn()
{
System.out.println(getName()+"转弯了");
}
/**
* 汽车加速的方法
*/
public void accelerate()
{
System.out.println(getName()+"汽车加速了");
}
/**
* 汽车人变身方法
*/
public void trans()
{
System.out.println(getName()+"变身了,变成了"+getName()+"人");
}
/**
* wheelnum的set方法
* @param wheelnum 轮胎的数目
*/
public void setWheelNum(int wheelnum)
{
this.wheelnum = wheelnum;
}
/**
* wheelnum的get方法
* @return wheelnum 轮子的数量
*/
public int getWheelNum()
{
return wheelnum;
}
}
Train.java
package vehicle;
public class Train extends Vehicle
{
private int number ; //有几节车厢
//如果说不用实例初始化块 会报错
{
System.out.println("火车造好了");
}
//构造器
public Train()//默认构造器
{
}
public Train(String name)
{
super(name);
}
public Train(String name,String speed)
{
super(name,speed);
}
public Train(String name ,String speed, int number)
{
super(name, speed);
this.number = number;
}
/**
* 火车呜呜呜的方法
*/
public void wuwuwu()
{
System.out.println(getName()+"呜呜呜");
}
/**
* 火车喷烟的方法
*/
public void fake()
{
System.out.println(getName()+"喷出了黑色的烟雾");
}
/**
* number的set方法
* @param number 几节车厢
*/
public void setNumber(int number)
{
this.number = number;
}
/**
* number 的get方法
* @return number 返回车厢的数量
*/
public int getNumber()
{
return number;
}
}
AirCraft.java
package vehicle;
/**
* 飞机类,可能速度稍微会快一点
* @author 程序代号
* @version 1.0
*/
public class AirCraft extends Vehicle
{
//成员变量
private String type; // 类型 民用还是军用
//实例初始化块
{
System.out.println("飞机造好了");
}
//构造器
public AirCraft(){}//默认构造器
public AirCraft(String name)
{
super(name);
}
public AirCraft(String name ,String speed)
{
super(name, speed);
}
public AirCraft(String name, String speed, String type )
{
super(name, speed);
this.type = type;
}
/**
* 飞机起飞的方法
*/
public void fly()
{
System.out.println(getName()+"起飞了");
}
/**
* 飞机降落的方法
*/
public void landing()
{
System.out.println(getName()+"降落了");
}
/**
* type的set方法
* @param type 飞机的类型
*/
public void setType(String type)
{
this.type = type;
}
/**
* type的get方法
* @return type 返回飞机的类型
*/
public String getType()
{
return type;
}
}
程序入口
Main.java
package vehicle;
/**
* 程序入口
* @author 程序代号
* @version 1.0
*/
public class Main
{
public static void main(String[] args)
{
//尝试一下命令行传入的方法
for(int i =0 ; i < args.length; i++)
{
System.out.println("参数"+(i+1)+"是"+args[i]);
}
//创建一个汽车人
Car car = new Car("五菱宏光","250");
car.start();
car.turn();
car.accelerate();
car.trans();
car.stop();
//创建一个火车人
Train train = new Train("复兴号","3000");
train.start();
train.wuwuwu();
train.fake();
train.stop();
//创建一个飞机人
AirCraft ac = new AirCraft("无尽号","50000","军用");
ac.start();
ac.fly();
ac.landing();
ac.stop();
}
}