java练习--货船问题

针对java的异常处理机制的练习

public class CargoBoat {
	//装载的重量
	int realContent;
	//最大的装载量
	int maxContent;
	public void setMaxContent(int c){
		maxContent=c;
	}
	public void loading (int m)throws DangerException{
		realContent+=m;
		if(realContent>maxContent){
			realContent-=m;
			throw new DangerException();
		}
		System.out.println("目前装载了"+realContent+"吨货物。");
	}
	
	
}

public class DangerException  extends Exception{
	final String message="超重";
	public String warnMess(){
		return message;
	}

}

测试类:

public class test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CargoBoat ship=new CargoBoat();
		ship.setMaxContent(1000);
		int m=600;
		try{
			ship.loading(m);
			m=400;
			ship.loading(m);
			m=367;
			ship.loading(m);
			m=555;
			ship.loading(m);
			
		}catch(DangerException e){
			System.out.println(e.warnMess());
			System.out.println("无法在装载的重量是"+m+"吨");
		}
		finally{
			System.out.print("货船将正点起航!");
		}
	}

}


输出结果:


<think>好的,我现在要解决这个实验题目。首先,题目要求设计一个抽象类Spaceship,包含私有成员变量engineNum和crewCapacity,构造方法,以及抽象方法display()。然后,CargoShip和FighterShip继承Spaceship并实现display方法,最后在main中向上转型调用display。 首先,我需要确认抽象类的定义。在Java中,抽象类使用abstract关键字,而抽象方法没有方法体。Spaceship类需要定义两个私有整型变量,所以应该这样写: abstract class Spaceship { private int engineNum; private int crewCapacity; public Spaceship(int engineNum, int crewCapacity) { this.engineNum = engineNum; this.crewCapacity = crewCapacity; } public abstract void display(); } 这里构造方法用来初始化变量,display是抽象方法。接下来,CargoShip和FighterShip需要继承这个抽象类并实现display方法。例如,CargoShip类: class CargoShip extends Spaceship { public CargoShip(int engineNum, int crewCapacity) { super(engineNum, crewCapacity); } @Override public void display() { System.out.println("货船引擎数量:" + ... ); } } 但是,这里有个问题:engineNum和crewCapacity是Spaceship的私有变量,子类无法直接访问。因此,Spaceship类需要提供公共的getter方法,比如getEngineNum()和getCrewCapacity(),这样子类才能获取这些值。我是不是漏了这一点? 所以应该在Spaceship中添加: public int getEngineNum() { return engineNum; } public int getCrewCapacity() { return crewCapacity; } 这样,在子类的display方法中,就可以通过getter方法获取变量的值。比如CargoShip的display方法: System.out.println("货船引擎数量:" + getEngineNum() + ",乘员容量:" + getCrewCapacity()); 同样,FighterShip的display方法也是如此,只是输出信息不同。 然后,在main方法中创建对象并向上转型: public static void main(String[] args) { Spaceship cargo = new CargoShip(4, 10); Spaceship fighter = new FighterShip(2, 2); cargo.display(); fighter.display(); } 这样应该能正确调用各自的display方法,因为虽然变量类型是Spaceship,但实际对象是子类实例,运行时多态会调用正确的方法。 总结步骤: 1. 定义抽象类Spaceship,包含私有变量、构造方法、getter和抽象display方法。 2. 子类继承并实现display,使用getter获取变量值。 3. main中向上转型,调用display验证多态。 现在检查是否满足所有实验要求,特别是抽象类的使用和向上转型后的方法调用是否正确。可能需要注意子类构造方法是否正确调用super,以及getter方法的正确性。</think>以下是分步解答: ### 步骤 1:定义抽象类 Spaceship ```java abstract class Spaceship { // 私有成员变量 private int engineNum; private int crewCapacity; // 构造方法初始化变量 public Spaceship(int engineNum, int crewCapacity) { this.engineNum = engineNum; this.crewCapacity = crewCapacity; } // 提供公共getter方法(关键点:子类需通过getter访问私有变量) public int getEngineNum() { return engineNum; } public int getCrewCapacity() { return crewCapacity; } // 定义抽象方法 public abstract void display(); } ``` ### 步骤 2:实现 CargoShip 子类 ```java class CargoShip extends Spaceship { // 构造方法调用父类构造 public CargoShip(int engineNum, int crewCapacity) { super(engineNum, crewCapacity); } // 实现display方法(输出货船信息) @Override public void display() { System.out.println("货船引擎数量:" + getEngineNum() + ",乘员容量:" + getCrewCapacity()); } } ``` ### 步骤 3:实现 FighterShip 子类 ```java class FighterShip extends Spaceship { public FighterShip(int engineNum, int crewCapacity) { super(engineNum, crewCapacity); } // 实现display方法(输出战斗机信息) @Override public void display() { System.out.println("战斗机引擎数量:" + getEngineNum() + ",乘员容量:" + getCrewCapacity()); } } ``` ### 步骤 4:编写主类测试 ```java public class Main { public static void main(String[] args) { // 向上转型:父类引用指向子类对象 Spaceship cargo = new CargoShip(4, 10); Spaceship fighter = new FighterShip(2, 2); // 多态调用(实际执行子类重写的方法) cargo.display(); // 输出货船信息 fighter.display(); // 输出战斗机信息 } } ``` ### 关键点解析 1. **抽象类与抽象方法** - 使用 `abstract` 定义抽象类和抽象方法 - 抽象类不能直接实例化,必须通过子类实现 2. **私有变量访问** - 子类通过 `getter` 方法访问父类私有变量(直接访问会编译报错) 3. **向上转型与多态** - 将子类对象赋值给父类引用(`Spaceship cargo = new CargoShip(...)`) - 运行时根据实际对象类型调用方法(动态绑定) ### 执行结果 ``` 货船引擎数量:4,乘员容量:10 战斗机引擎数量:2,乘员容量:2 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值