Java三大特性之一-多态

多态: 多种形态。是面向对象的三大特性之一。多态是建立在封装和继承之上

方法的多态

方法的重写和重载就是方法的多态的体现形式


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('没');
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值