Java的多态快速入门
基本介绍:
方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承之上的
方法的多态:
package com.polymorphic.poly;public class PolyMethod {public static void main(String[] args) {//方法重载体现多态B b = new B();System.out.println(b.sum(10,20));System.out.println(b.sum(10,20,30));//我们通过不同的参数个数去调用sum方法//因此对于sum方法来说,就是多态的体现//方法重写体现多态A a = new A();a.say();b.say();}
}
class A{public void say(){System.out.println("A类的say()方法被调用");}
}
class B extends A{public int sum(int n1,int n2){//和下面的sum构成重载return n1 + n2;}public int sum(int n1,int n2,int n3){return n1 + n2 + n3;}public void say(){System.out.println("B类的say()方法被调用");}
}
对象的多态:
(1)一个对象的编译类型和运行类型可以不一致
(2)编译类型在定义对象时,就确定了,不能改变
(3)运行类型是可以变化的
(4)编译类型看定义时 = 号的左边,运行类型看 = 号的右边
Animal animal = new Dog();
//可以让父类的引用指向子类的对象
//animal的编译类型Animal,运行类型Doganimal = new Cat();
//animal的运行类型变成了Cat,编译类型仍然是Animal
一个赋类的对象引用可以指向它的子类,并且运行时是以运行类型为主的
public class Animal {public void cry(){System.out.println("Animal cry() 动物在叫唤");}
}
public class Cat extends Animal{@Overridepublic void cry() {System.out.println("Cat cry() 小猫喵喵叫");}
}
public class Dog extends Animal{@Overridepublic void cry() {System.out.println("Dog cry() 小狗汪汪叫");}
}
public class polyObject {public static void main(String[] args) {//体验对象多态的特点//animal编译类型就是Animal,运行类型就是DogAnimal animal = new Dog();//执行到下面第十行时,animal的运行类型是Dog,所以它就会去找Dog的cryanimal.cry();//animal此时的运行类型是Dog,输出小狗汪汪叫//此时animal的编译类型是Animal,运行类型是Catanimal = new Cat();animal.cry();//输出小猫喵喵叫}
}
快速入门案例:
使用多态的机制来解决主人喂食物的问题
动物类:
public class Animal {private String name;public Animal(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public class Cat extends Animal{public Cat(String name) {super(name);}
}
public class Dog extends Animal{public Dog(String name) {super(name);}
}
public class Pig extends Animal{public Pig(String name) {super(name);}
}
食物类:
public class Food {private String name;public Food(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public class Bone extends Food{public Bone(String name) {super(name);}
}
public class Fish extends Food{public Fish(String name) {super(name);}
}
public class rice extends Food{public rice(String name) {super(name);}
}
主人类:
public class Master {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public Master(String name) {this.name = name;}//使用多态机制,可以统一的管理主人喂食物的问题//animal的编译类型是Animal,可以指向(接收)Animal子类的对象//food编译类型是Food,可以指向(接收)Food子类的对象public void feed(Animal animal,Food food){System.out.println("主人" + name + "给" + animal.getName() + "吃" + food.getName());}// //主人给小狗喂食骨头
// public void feed(Dog dog,Bone bone){
// System.out.println("主人" + name + "给" + dog.getName() + "吃" + bone.getName());
// }
// public void feed(Cat cat,Fish fish){
// System.out.println("主人" + name + "给" + cat.getName() + "吃" + fish.getName());
// }
}
测试类:
public class poly01 {public static void main(String[] args) {Master tom = new Master("tom");Dog dog = new Dog("dahuang");Bone bone = new Bone("大棒骨");tom.feed(dog,bone);Cat xiaohua = new Cat("xiaohua");Fish fish = new Fish("黄花鱼");tom.feed(xiaohua,fish);//添加 给小猪喂米饭Pig xiaohua1 = new Pig("xiaohua");rice rice = new rice("米饭");tom.feed(xiaohua1,rice);}
}