一、多态是什么?
1.什么是多态:
多态就是多种状态:同一个行为,不同的子类表现出来不同的形态。
多态指的就是同一个方法调用,然后由于对象不同会产生不同的行为。
2.多态的好处:
为了提高代码的扩展性,符合面向对象的设计原则:开闭原则。
开闭原则:指的就是扩展是 开放的,修改是关闭的。
注意:多态可以提高扩展性,但是扩展性没有达到最好,以后我们会学习 反射
3.多态的要素
(1)继承: Cat extends Animal ,Pig extends Animal, Dog extends Animal
(2)重写:子类对父类的方法shout()重写
(3)父类引用指向子类对象(父类做参数/返回值类型)
Pig p = new Pig();
Animal an = p;
将上面的代码合为一句话:
Animal an = new Pig();
=左侧:编译期的类型
=右侧:运行期的类型
二、具体实例
1.比萨制作
要求:编写程序实现比萨制作。需求说明编写程序,接收用户输入的信息,选择需要制作的比萨。可供选择的比萨有:培根比萨和海鲜比萨。
实现思路及关键代码
1)分析培根比萨和海鲜比萨
2)定义比萨类
a)属性:名称、价格、大小
b)方法:展示
3)定义培根比萨和海鲜比萨继承自比萨类
4)定义比萨工厂类,根据输入信息产生具体的比萨对象
程序运行结果如图所示
2.代码部分:
(1)比萨作为父类
ipackage info.duotai318.pizza;
public class Pizza {
private String name;
private int price;
private int size;
public Pizza(String name, int price, int size) {
this.name = name;
this.price = price;
this.size = size;
}
public void show(){
System.out.println("名称:"+name);
System.out.println("价格:"+price);
System.out.println("大小"+size);
}
public Pizza() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
(2)培根比萨作为子类
package info.duotai318.pizza;
public class BaconPizza extends Pizza {
private int number;
@Override
public void show() {
super.show();
System.out.println("培根克数:"+getNumber());
}
public BaconPizza(String name, int price, int size, int number) {
super(name, price, size);
this.number = number;
}
public BaconPizza() {
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
(3)海鲜比萨作为子类
package info.duotai318.pizza;
public class SeafoodPizza extends Pizza {
private String ingredients;//配料
public SeafoodPizza(String name, int price, int size, String ingredients) {
super(name, price, size);
this.ingredients = ingredients;
}
public SeafoodPizza() {
}
@Override
public void show() {
super.show();
System.out.println("配料:"+ingredients);
}
public String getIngredients() {
return ingredients;
}
public void setIngredients(String ingredients) {
this.ingredients = ingredients;
}
}
(4)比萨加工厂作为另一条线,把父类比萨作为返回值返回
package info.duotai318.pizza;
import java.util.Scanner;
public class Pizzafactory {
public Pizza make(){
Pizza pizza;
Scanner input=new Scanner(System.in);
System.out.println("请选择要制作的披萨(1.培根披萨 2海鲜披萨)");
if(input.nextInt()==1){
System.out.println("请输入培根克数");
int ks=input.nextInt();
System.out.println("请输入披萨大小");
int size=input.nextInt();
System.out.println("请输入披萨价格");
int price=input.nextInt();
pizza=new BaconPizza("培根披萨",price,size,ks);
}else{
System.out.println("请输入配料信息");
String info=input.next();
System.out.println("请输入披萨大小");
int size=input.nextInt();
System.out.println("请输入披萨价格");
int price=input.nextInt();
pizza=new SeafoodPizza("海鲜披萨",price,size,info);
}
return pizza;
}
}
(5)测试类代码部分,声明父类new子类,然后调用
package info.duotai318.pizza;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Pizzafactory pizzafactory=new Pizzafactory();
//声明 父类 new 子类
Pizza pizza= pizzafactory.make();
pizza.show();
(6)运行结果:
总结
多态指的是方法的多态,而不是属性的多态。
多态:肯定是两条线;两条线一定有交点;多态体现在第二条业务线上