多态: 多种形态。是面向对象的三大特性之一。多态是建立在封装和继承之上
方法的多态
方法的重写和重载就是方法的多态的体现形式
class Person {//先声明一个Person类
public void eat () {//定义一个成员方法
System.out.println("吃饭");
}
public void eat (String food) {//对成员方法的重载 方法名必须一样但小括号里的参数可以不同
System.out.println("吃" + food);
}
}
class Man extends Person {//用一个Man类来继承Person类
@Override
public void eat() {//对父类的成员方法进行重写 重写必须是继承关系才能进行方法的重写
System.out.println("吃大盘鸡");
}
@Override
public void eat(String food) {//子类也可以重写父类有参的方法
System.out.println("吃"+ food);
}
}
public class Demo1 {
public static void main(String[] args) {
}
}
对象的多态
1.一个对象编译类型和运行类型是不一样的
2.编译类型在定义对象的时候就已经定义好了
3.运行类型是可以改变的
4.=左边是编译类型 =右边是运行类型
class Animal {//声明一个Animal类
public void cry () {//在类下面写一个cry方法
System.out.println("动物在叫......");
}
}
class Dog extends Animal {//声明一个Dog类来继承Animal类
@Override
public void cry() {//在Dog类中重写Animal类中的cry方法
System.out.println("汪汪汪......");
}
//Dog类自己独有的eat方法
public void eat () {
System.out.println("狗吃狗粮....");
}
}
class Cat extends Animal {//声明一个Cat类来继承Animal类
@Override
public void cry() {//在Cat类中重写Animal类中的cry方法
System.out.println("喵喵喵.....");
}
//Cat类自己独有的sleep方法
public void sleep () {
System.out.println("白天睡觉,晚上乱跳");
}
}
public class Demo1 {
public static void main(String[] args) {
//多态 父类的引用指向子类的对象
Animal animal = new Dog();
animal.cry();
//父类的引用是指向不了子类独有的方法的,就意味着
//父类的引用不能调用子类独有的方法
//animal.eat();
//多态 父类的引用指向子类的对象
Animal animal2 = new Cat();
animal2.cry();
//animal2.sleep();
}
}
注意事项:
1.必须有继承
2.必须有重写
父类的引用指向子类的对象在开发中如何使用
package com.qfedu.duotai;
class Pizza {//声明一个披萨类
private String name;//披萨的名字
private double price;//披萨的价格
private int size;//披萨的尺寸
public String getName() {//名称的get方法
return name;
}
public void setName(String name) {//名称的set方法
this.name = name;
}
public double getPrice() {//价格的get方法
return price;
}
public void setPrice(double price) {//价格的set方法
this.price = price;
}
public int getSize() {//尺寸的get方法
return size;
}
public void setSize(int size) {//尺寸的set方法
this.size = size;
}
public void exhibition() {//定义一个exhibition()方法用来展示产品
System.out.println();
}
}
class SeafoodPizza extends Pizza{//定义一个SeafoodPizza类来继承Pizza类
@Override
public void exhibition() {//重写父类中的exhibition()方法
System.out.println("披萨的名字:" + getName() + ",披萨的价格:" + getPrice() + ",披萨的尺寸" + getSize());
}//打印出来海鲜披萨的信息
}
class BaconPizza extends Pizza{//定义一个BaconPizza类来继承Pizza类
@Override
public void exhibition() {//重写父类中的exhibition()方法
System.out.println("披萨的名字:" + getName() + ",披萨的价格:" + getPrice() + ",披萨的尺寸" + getSize());
}//打印出来培根披萨的信息
}
class PizzaFactory{//声明一个披萨工厂的类
public void createPizza (Pizza pizza) {//写一个方法来制作披萨
pizza.exhibition();
}//用pizza来调用子类的方法
}
public class Demo2 {
public static void main(String[] args) {
Pizza pizza = new SeafoodPizza();
//生产海鲜披萨
pizza.setName("海鲜披萨");
pizza.setPrice(67.9);
pizza.setSize(6);
PizzaFactory pizzaFactory = new PizzaFactory();
pizzaFactory.createPizza(pizza);
//生产培根披萨
Pizza pizza2 = new BaconPizza();
pizza2.setName("培根披萨");
pizza2.setPrice(66.6);
pizza2.setSize(7);
pizzaFactory.createPizza(pizza2);
}
}
多态的转型
多态的向上转型
本质就是:父类的引用指向子类对象
语法格式:
父类 父类引用 = new 子类();
将子类的对象赋值给了父类的引用。小范围(子类) 转为大范围(父类)自动转
父类的引用可以调用父类的所有成员方法,可以调用子类的重写父类的方法,但是不能调用子类独有的方法
class Person {//声明一个Person类
public void eat () {//eat()方法
}
}
class Student extends Person {//声明一个Stdent类继承Person类
@Override
public void eat() {//重写eat方法
System.out.println("学生吃饭,吃披萨");
}
public void sleep () {//子类独有的方法
System.out.println("中午不睡下午崩溃!!!");
}
}
public class Demo1 {
public static void main(String[] args) {
Person person = new Student();//向上转型
person.eat();
//person.sleep();报错
}
}
多态向下转型
语法格式:
父类类型 父类引用 = new 子类();
子类类型 子类引用 = (子类类型)父类的引用;向下转型
class TestA {
//Object 是所有类的父类
public void test (Object obj ) {
//必须给我打印一个String类型的老何,我不要Object类型的狗蛋
int i1 = (int)obj;
System.out.println(i1);
}
}
public class Demo4 {
public static void main(String[] args) {
TestA testA = new TestA();
Object object = "老何";
testA.test(98);
testA.test('没');
}
}