Java的多态

继承紧接下来就是多态,还真没有注意过多态,当初学习的时候肯定是知道了,当然是没有像今天这么认真的对面下。

多态,主要用到的就是抽象类的定义,所构造的抽象类你要想办法用在你的功能中,最终所设计出来的结果就是要是程序维护性高,拓展性强。

work_1是求长方形和圆的面积,定义一个图形抽象类获取面积方法和周长方法。明白要求之后当然首先是分析,然后设计出UML类图。


父类是一个抽象类,告诉我们有几个功能,而子类自行实现功能,最后也有一个计算类来完成功能的表示。这是我的看法。

这样子的方便之处在于,图形一直变,但总需要的功能是不会变的。多态就是实现在这块了。

然后就是以下的几个类和测试用例

package Java的多态;
/*此例是分别求图形的周长和面积
 *所以有抽象类的定义
 *抽象方法定义求面积和周长*/
public abstract class work_1_Shape {
		
	public abstract double getArea();			//抽象定义求面积
	
	public abstract double getPerimeter();		//抽象定义周长
	
}
抽象类定义时加上了abstract。

package Java的多态;
/*子类圆在这里定义
 * 圆有的特点是半径和PI
 * 然后在这里具体实现周长和面积的方法*/
public class work_1_Cirlce extends work_1_Shape{
	private double r;
	private final static double PI=3.14;
	
	public work_1_Cirlce(double r){
		this.r=r;
	}
	
	//这里具体实现
	public double getArea() {
		return r*r*PI;
	}

	public double getPerimeter() {
		return r*2*PI;
	}
	
	
	
}
依然还是会用到继承

package Java的多态;
/*
 * 然后是长方形子类
 * 此具有的特点就是长和宽*/
public class work_1_Rectangle extends work_1_Shape{
		private double l;
		private double w;
		
		public work_1_Rectangle(double l,double w){
			this.l=l;
			this.w=w;
		}

		public double getArea() {
			return l*w;
		}

		public double getPerimeter() {
			return (l+w)*2;
		}
		
		
}

package Java的多态;
/*多了一个图形面积和周长计算器
 * 没太搞明白啊
 * 貌似好像是具有输出功能
 * 但是这样超级规范的意思吗*/
public class work_1_ShapeCaculate {
		//说是可以计算任何shape子类的面积
		public void calArea(work_1_Shape shape) {
			System.out.println(shape.getArea());
		}
		//同理这个
		public void getPerimeter(work_1_Shape shape) {
			System.out.println(shape.getPerimeter());
		}
}
这个就是一个类,但里面用到了抽象类和抽象方法,大大简化了每个子类自己看到结果,孩子们都使用这个就好了,大致就是这个意思。

package Java的多态;
/*实例测试类*/
public class work_1_test {

	public static void main(String[] args) {
			work_1_ShapeCaculate make=new work_1_ShapeCaculate();
			//用了两种创建实例
			work_1_Shape rectangle=new work_1_Rectangle(3, 4);
			work_1_Cirlce circle=new work_1_Cirlce(3);
			
			System.out.println("长方形的面积:");
			make.calArea(rectangle);
			System.out.println("长方形的周长:");
			make.getPerimeter(rectangle);
			
			System.out.println("圆的面积:");
			make.calArea(circle);
			System.out.println("圆的周长:");
			make.getPerimeter(rectangle);
	}

}
最后就是实例测试,make这个功能很方便,对任何实例都可以用到。

然后work_2是一个模拟饲养员喂养小动物程序,这个还是先展示运行实例吧

————————————————

吃饭时间到了
Dog喜欢吃Bone
饲养员纯纯拿着10克Bone喂养Dog
吃饭时间到了
Cat喜欢吃Fish
饲养员纯纯拿着40克Fish喂养Cat
Dog算术表演
Cat玩冒险表演

————————————————
这个题其实是昨天继承那里的,但是今天多态这里又让改,结果还真明白了改是正确的决定,不愧是书本。

这里设计的类就比较多了

动物类,食物类,饲养员类。


啊哈有点尴尬虚线那里没有搞好-,-

虽然这个类比较多,但是都比较简单

package Java的继承;

public class work_3_Bone extends work_3_Food{
		public work_3_Bone(int w){
			super(w);
		}
		
		public String toString() {
			return "Bone";
		}
}

package Java的继承;

public class work_3_Food {
		private int weight;
		
		public work_3_Food(int w){
			this.weight=w;
		}
		
		public int getWeigth() {
			return weight;
		}
}
package Java的继承;

public class wrok_3_Fish extends work_3_Food{
		public wrok_3_Fish(int w){
			super(w);
		}
		
		public String toString() {
			return "Fish";
		}
}

package Java的继承;
/*动物的总类
 * 是个动物就要吃饭*/
public class work_3_Animal {
		public void eat(work_3_Food food) {
			System.out.println("吃饭时间到了");
			System.out.println(this+"喜欢吃"+food);
		}
}

package Java的继承;

public class work_3_Cat extends work_3_Animal{
	
		public String toString() {
			return "Cat";
		}
		
		public void artCat() {
			System.out.println(this+"玩冒险表演");
		}
}

package Java的继承;

public class work_3_Dog extends work_3_Animal{
		public String toString() {
			return "Dog";
		}
		
		public void artDog() {
			System.out.println(this+"算术表演");
		}
}

package Java的继承;

public class work_3_Feeder{
		private String name;
		public work_3_Feeder(String n){
			this.name=n;
		}
		
		public void feed(work_3_Animal animal,work_3_Food food) {
			animal.eat(food);
			System.out.println("饲养员"+name+"拿着"+food.getWeigth()+"克"+food+"喂养"+animal);
		}
//		//有两个相同名的构造函数,参数不同
//		public void feed(work_3_Dog dog,work_3_Bone bone) {
//			dog.eat(bone);
//			System.out.println("饲养员"+name+"拿着"+bone.getWeigth()+"克"+bone+"喂养"+dog);
//		}
		public void perform(work_3_Animal ani) {
			if (ani instanceof work_3_Dog)
				((work_3_Dog)ani).artDog();
			if (ani instanceof work_3_Cat){
				work_3_Cat cat=(work_3_Cat)ani;
				cat.artCat();
			}
		}
}


看这上面的注释掉的,这就是昨天继承那里,我当时还在想,哇哦定义相同的函数名是可以的啊,当时居然没有想想这样不是很麻烦了

今天在多态这里恍然大悟啊

还有就上每那个Instanceof运算符啊,就是说前者是不是后者的一个实例,是的话返回true。

package Java的继承;

public class work_3_test {

	public static void main(String[] args) {
			work_3_Feeder name=new work_3_Feeder("纯纯");
			work_3_Dog dog=new work_3_Dog();
			work_3_Bone bone=new  work_3_Bone(10);
			name.feed(dog, bone);
			
			name.feed(new work_3_Cat(), new wrok_3_Fish(40));
			
			name.perform(dog);
			name.perform(new work_3_Cat());
	}

}
最后是测试实例,用了两种定义方法,很不错。

这里用多态思想之后,一下子拓展了好多,可以很随意的喂动物了,新手可以随意喂动物了哈哈。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值