多态

多态

  多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。

  这里用java来实现,实现一下最简单的多态。

例题: 当顾客在商场购物时,卖家需要根据顾客的需求提取商品。对于汽车销售商场也是如此。用户需要先指定购买的车型,然后商家去提取该车型的汽车。模拟该场景,编写一个父类Car,可以获得车的具体信息,包括车品牌,价格等,然后编写多个子类,用户输入不同的品牌,要求得到对应的车和价格,例如输入“宝马”,输出:您获得一辆宝马车,价格30万。

Car类:

public class Car {
	private String carName;
	private double price;
	
	public Car() {
		super();
	}

	public Car(String carName, double price) {
		super();
		this.carName = carName;
		this.price = price;
	}

	public String getCarName() {
		return carName;
	}

	public void setCarName(String carName) {
		this.carName = carName;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "Car [carName=" + carName + ", price=" + price + "]";
	}
	//输出Car的对象的信息
	public void print() {
		System.out.println(toString());
	}
	
}

Bmw类:

public class Bmw extends Car {
	public Bmw() {
		super();
	}
	
	public Bmw(String name, double price) {
		super(name,price);
	}
	//重写print(),输出Bmw对象信息
	public void print() {
		System.out.println(getCarName() + "车,价格" + getPrice());
	}
}

Lamborghini类:

public class Lamborghini extends Car {
	public Lamborghini() {}
	
	public Lamborghini(String name, double price) {
		super(name, price);
	}
	//重写print(),输出Lamborghini对象信息
	public void print() {
		System.out.println(getCarName() + "车,价格" + getPrice());
	}
}

CarTest测试类:

import java.text.Collator;
import java.util.Locale;
import java.util.Scanner;

public class CarTest {
	public static void main(String[] args) {
		String 		LMB 		= "兰博基尼";
		String 		BMW 		= "宝马";
		Scanner 	sc 			= new Scanner(System.in);
		Collator 	co 			= Collator.getInstance(Locale.CHINA);//用来比较汉字
		Car 		car 		= new Car("车类", 1.0);
		Car 		bmw 		= new Bmw("宝马",1000000);
		Car 		lamborghini = new Lamborghini("兰博基尼", 3000000);
		
		System.out.println("输入车型:");
		String str = sc.nextLine();
		str = str.trim();
		
		if (co.compare(str, BMW) == 0) {
			print(bmw);
		} else if (co.compare(str, LMB) == 0) {
			print(lamborghini);
		} else {
			print(car);
		}
		
		sc.close();
	}

	private static void print(Car car) {
		//判断对象类型
		if (car instanceof Bmw) {
			((Bmw) car).print();
		} else if (car instanceof Lamborghini) {
			((Lamborghini) car).print();
		} else {
			car.print();
		}
	}
}

  主要看测试类的 print 方法,print 方法首先判断 Car 对象是哪个类的对象,由判断执行不同的方法。在判断过程使用了 instanceof 运算符,它是用来判断对象类型的一个运算符。当判断出它的类型之后,再对其进行类型转换,得到原始类型后就可以调用它的类所特有的方法了。