多态---

多态

概述: 同一个对象,在不同时刻表现出来的不同形态。
在这里插入图片描述
在这里插入图片描述
这里父类引用指向子类对象解释说明:
父类为Animal,子类为Cat
Animal a=new Cat();

多态成员的访问特点

//父类
package myday;

public class Animal {
	public String name="animal";
	public void eat() {
		System.out.println("动物吃东西");
	}
}
//子类
package myday;

public class Cat extends Animal{
	public String name="cattt";
	public int age;
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
//测试
package myday;

public class Demo {
	public static void main(String[] args) {
		Animal cat=new Cat();
		System.out.println(cat.name);//输出:animal
		System.out.println(cat.age);//报错
		//虽然cat的Cat类的,Cat类中有变量age
		//但Animal类中没有age
		//系统编译时会看左边Animal类中是否有该变量
		//没有则会报错
		//变量的编译,运行都是看左边
		//方法的编译看左,执行看右
	}
}

在这里插入图片描述

多态的好处和弊端

当我们有多个动物要完成同一个动作时,每增加一种动物的类,AnimalAll中就要重新定义一个方法。

package myday;

public class Cat {
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
package myday;

public class Dog {
	public void eat() {
		System.out.println("狗吃骨头");
	}
}
//动物操作类
package myday;

public class AnimalAll {
	public void useAnimal(Cat c) {
		c.eat();
	}
	public void useAnimal(Dog d) {
		d.eat();
	}
}
//测试类
package myday;

public class Demo {
	public static void main(String[] args) {
		Cat c=new Cat();
		Dog d=new Dog();
		AnimalAll a=new AnimalAll();
		a.useAnimal(c);//c相当于Cat类,传到AnimalAll的方法中
		a.useAnimal(d);//d相当于Dog类,传到AnimalAll的方法中
		//输出  猫吃鱼
        //      狗吃骨头
	}

}

利用多态改进:

//父类
package myday;

public class Animal {
	public void eat() {
		System.out.println("动物吃东西");
	}
}
//子类
package myday;

public class Cat extends Animal{
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
package myday;

public class Dog extends Animal{
	public void eat() {
		System.out.println("狗吃骨头");
	}
}
//动物操作类
package myday;

public class AnimalAll {
	public void useAnimal(Animal c) {
	//传入Cat c时,相当于Animal c=new Cat();
	//调用方法时编译看左,执行看右
	//Dog d同理
	c.eat();
	}
}
//测试类
package myday;

public class Demo {
	public static void main(String[] args) {
		Cat c=new Cat();
		Dog d=new Dog();
		AnimalAll a=new AnimalAll();
		a.useAnimal(c);
		a.useAnimal(d);
		//输出  猫吃鱼
        //      狗吃骨头
	}

}

多态中,不能访问子类特有功能。
若想使用子类的特有方法:

Cat c=new Cat();
c.playGame();//这样就可以调用子类中特有的playGame方法。

在这里插入图片描述

多态中的转型

向上转型
由子到父
父类引用指向子类对象

//父类
package myday;

public class Animal {
	public void eat() {
		System.out.println("动物吃东西");
	}
}
//子类
package myday;

public class Cat extends Animal{
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
//测试
package myday;

public class Demo {
	public static void main(String[] args) {
		Animal c=new Cat();//向上转型
		a.eat();
	}
}

向下转型
从父到子
父类引用转为子类对象

结合上面提到的,多态中不能调用子类特有的功能,只能重新创建一个子类对象,这样做很麻烦,所以可以用向上转型解决。

Animal c=new Cat();
//此时的对象c不能调用Cat类中特有的功能
//解决方法:向上转型
Cat a=(Cat)c;//强制转换,将父类引用强转为子类对象

注意:不能将其他子类的父类引用强制转换为该类对象。
比如不能将Dog类的父类引用强制向下转型为Cat类的对象,否则输出ClassCastException(类型转换异常)。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值