1. 程式人生 > >java多型例項

java多型例項


public class Test {
	/*
	 * 開發一個食物類Food,具體要求如下:
		1.具有私有屬性:營養值,提供公有的get方法和保護的set方法。
		2.有一個保護的無參的構造方法,在該方法內營養值由1-10之間的隨機數產生
		3.包含一個公有的獲取食物名稱的方法
		4.新增主方法測試
		
		分別開發Food類的三個派生類:肉製品類、澱粉類和水果蔬菜類,要求:
		1.這三個類均顯式編寫無參的構造方法,並分別對營養值乘以1.2 ,  0.7  , 0.9 處理;
		2.這三個類均重寫父類的獲取食物名稱的方法,
		3.並測試。
		
		
		開發一個猴子類Monkey,具體要求如下:
		1.具有私有屬性:名稱,體重(直接賦初值10.0),兩者均提供公有的get方法。
		2.僅有一個公有的有參構造方法:構造方法的引數為名稱
		3.具有一個公有的,引數是Food型別,無返回值的eat(Food food)方法,其功能是吃食物(
		在控制檯列印猴子名稱和食物名稱等資訊),同時體重會增加,體重增加量是:營養值*0.1
		4.具有一個公有的,無參的,無返回值的game()方法,其功能是遊戲(可在控制檯列印資訊),
		體重降低0.5,若體重在5以下不再下降。
		5.重寫toString方法
		6.新增主方法測試。
		
		開發一個管理類,該類功能如下:
		建立1個猴子,猴子進行100次吃食物和遊戲,具體每次吃食物還是遊戲是隨機的,
		而且獲取食物也是隨機的可能是肉製品,水果蔬菜製品和澱粉製品。最後輸出這個猴子的名稱和體重。
		注:可以根據需要自由設計該類。
	 * 
	 */
	
	
	public static void main(String[] args) {
		Monkey m = new Monkey("齊天大聖");
		Food food = null;
		for(int i=1;i<=100;i++){
			int num = (int)(Math.random()*2+1);
			//當數字是1的時候,吃食物,2的時候玩遊戲
			if(num==1){
				int num1 = (int)(Math.random()*3+1);
				if(num1==1){ //肉
					food = new Meat();
					food.setName("紅燒肉");
					m.eat(food);
				}else if(num1==2){//澱粉
					food = new Starch();
					food.setName("土豆");
					m.eat(food);
				}else{//水果
					food = new Fruit();
					food.setName("香蕉 ");
					m.eat(food);
				}
				
				//吃食物資訊列印
				System.out.print(m.getName()+"吃:"+food.getName()+"體重:");
				System.out.printf("%.1f",m.getWeight());
				System.out.println();
			}else{
				m.game();
				//玩遊戲資訊列印
				System.out.print(m.getName()+"玩遊戲體重:");
				System.out.printf("%.1f",m.getWeight());
				System.out.println();
			}
			
			
		}
	}

}


/*
 *      1.具有私有屬性:營養值,提供公有的get方法和保護的set方法。
		2.有一個保護的無參的構造方法,在該方法內營養值由1-10之間的隨機數產生
		3.包含一個公有的獲取食物名稱的方法
		4.新增主方法測試
 */
public class Food {
	
	private double  cuilinarylValue;
	private String name;
	
	public Food(){
		this.cuilinarylValue = Math.random()*9+1;
	}

    
	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public double getCuilinarylValue() {
		return cuilinarylValue;
	}

	public void setCuilinarylValue(double cuilinarylValue) {
		this.cuilinarylValue = cuilinarylValue;
	}
	
	
}

public class Fruit extends Food {
	
	 private String name;
	 public Fruit(){
		  this.setCuilinarylValue(super.getCuilinarylValue()*0.9);   
		  
	   }
	 //重寫父類的獲取食物的名稱方法
   @Override
	public String getName() {
		
		return this.name;
	}

   public void setName(String name) {
		this.name = name;
	}
}

/*
 * 分別開發Food類的三個派生類:肉製品類、澱粉類和水果蔬菜類,要求:
	1.這三個類均顯式編寫無參的構造方法,並分別對營養值乘以1.2 ,  0.7  , 0.9 處理;
	2.這三個類均重寫父類的獲取食物名稱的方法,
	3.並測試。
 */
public class Meat extends Food {
	
	private String name;
	
	public Meat(){
		super();
		//肉類的營養值
		this.setCuilinarylValue(super.getCuilinarylValue()*1.2);
	}

	
	
	public void setName(String name) {
		this.name = name;
	}



	//重寫父類的獲取食物的名稱方法
	@Override
	public String getName() {
		
		return this.name;
	}

	
	
}

public class Starch extends Food {
	/*
	 * /*
	 * 分別開發Food類的三個派生類:肉製品類、澱粉類和水果蔬菜類,要求:
		1.這三個類均顯式編寫無參的構造方法,並分別對營養值乘以1.2 ,  0.7  , 0.9 處理;
		2.這三個類均重寫父類的獲取食物名稱的方法,
		3.並測試。
	 */
	private String name;
	   public Starch(){
		  this.setCuilinarylValue(super.getCuilinarylValue()*0.7);  
	   }
	 //重寫父類的獲取食物的名稱方法
	   @Override
		public String getName() {
			
			return this.name;
		}

	   public void setName(String name) {
			this.name = name;
		}
}

public class Monkey {
	/*
	 * 開發一個猴子類Monkey,具體要求如下:
		1.具有私有屬性:名稱,體重(直接賦初值10.0),兩者均提供公有的get方法。
		2.僅有一個公有的有參構造方法:構造方法的引數為名稱
		3.具有一個公有的,引數是Food型別,無返回值的eat(Food food)方法,
		 其功能是吃食物(在控制檯列印猴子名稱和食物名稱等資訊),同時體重會增加,體重增加量是:營養值*0.1
		4.具有一個公有的,無參的,無返回值的game()方法,其功能是遊戲(可在控制檯列印資訊),體重降低0.5,
		若體重在5以下不再下降。
		5.重寫toString方法
		6.新增主方法測試。
	 * 
	 */
	private String name;
	private double weight = 10.0;
	//引數傳遞Food型別 父類型別,方法那一頭,傳遞子類物件 ,多型的體現形式
	public void eat(Food f){
		this.weight+=f.getCuilinarylValue()*0.1;
		//(在控制檯列印猴子名稱和食物名稱等資訊)
	}
	//具有一個公有的,無參的,無返回值的game()方法,其功能是遊戲(可在控制檯列印資訊),體重降低0.5,
	若體重在5以下不再下降。
	public void game(){
		if(this.weight<5){
			System.out.println("太虛弱了,該進食了!!");
			return;
		}
		this.weight-=1;
		
	}
	

	
	public Monkey(String name){
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	public double getWeight() {
		return weight;
	}
	
	
	

}