一、实现多态的前提:
1.要有继承关系。
2.要有方法的重写。
3.要有父类的引用指向子类的对象(只有继承关系/实现关系才可以这么写)。
二、多态的好处:
1.提高了程序的维护性(由继承保证)。
2.提高了程序的扩展性(由多态保证)
三、 例子:
class Animal{
String name;
int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("吃");
}
public void sleep(){
System.out.println("睡");
}
}
class Tiger extends Animal{
public Tiger() {
}
public Tiger(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("🐅吃🥩");
}
@Override
public void sleep() {
System.out.println("🐅趴着睡");
}
}
class Bear extends Animal{
public Bear() {
}
public Bear(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("🐻吃🐅");
}
@Override
public void sleep() {
System.out.println("🐻侧着睡");
}
}
class Snake extends Animal{
public Snake() {
}
public Snake(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("🐍吃🐀");
}
@Override
public void sleep() {
System.out.println("🐍蜷着睡");
}
}
class Monkey extends Animal{
public Monkey() {
}
public Monkey(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("🐒吃🍌");
}
@Override
public void sleep() {
System.out.println("🐒倒挂睡");
}
}
class AnimalTool{
public static void useAnimal(Animal animal){
animal.eat();
animal.sleep();
}
}
public class DuoTaiDemo1 {
public static void main(String[] args) {
Tiger t1 = new Tiger("跳跳虎1", 3); //需求1:我想养一只🐅
AnimalTool.useAnimal(t1); // new Tiger("跳跳虎1", 3)
Tiger t2 = new Tiger("跳跳虎2", 2);//需求2:我还想养一只🐅
AnimalTool.useAnimal(t2);
Bear b1 = new Bear("熊大", 1);//需求3:我想养一只🐻
AnimalTool.useAnimal(b1);
Bear b2 = new Bear("熊二", 2);
AnimalTool.useAnimal(b2);
Snake s1 = new Snake("小青", 18); //需求4:我现在想养一只🐍
AnimalTool.useAnimal(s1); // new Snake("小青", 18)
Monkey m = new Monkey("孙悟空", 10);//养一只🐒
AnimalTool.useAnimal(m); // new Monkey("孙悟空", 10)
}
}
四、向下转型
class Fu{
public void fun1(){
System.out.println("这是父类中的方法fun1");
}
}
class Zi extends Fu{
@Override
public void fun1() {
System.out.println("这是重写后的fun1方法");
}
public void show1(){
System.out.println("hello world");
}
}
public class DuoTaiDemo2 {
public static void main(String[] args) {
Fu f = new Zi();
f.fun1();//这是重写后的fun1方法
Zi z=(Zi) f;
((Zi) f).show1();//hello world
}
}
注意事项:
ClassCastException:类型转换异常。
能够转换的两个类之间必须是存在继承关系或者实现关系。