- java的多态
- 引入的原因
- 多态(羊皮狼)
- 练习
public class Test {
public static void main(String[] args) {
Master master = new Master("tim");
Dog dog = new Dog("金毛");
Cat cat = new Cat("蓝猫");
Fish fish = new Fish("小鱼干");
Bone bone = new Bone("鸡锁骨");
master.feed(dog,bone);
master.feed(cat,fish);
}
}
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());
}
随着多个动物,食物的增加,对于代码整体而言,代码复用性不高,不利于代码维护,所以引入多态
多态(羊皮狼)
方法或对象具有多种形态,是面对对象的第三特征,多态是建立在封装和继承基础之上的
(1)方法的多态
重载和重写就体现多态
(2)对象的多态(核心)
- 一个对象的编译类型和运行类型可以不一致
Animal animal = new Dog();
2. 编译类型在定义对象时,就确定了不能改变
3. 运行类型是可以变化的
4. 编译类型看定义时 等号的最左边, 运行类型看 等号的最右边
练习Animal animal = new Dog();
animal 只是对象引用, new Dog() 才是对象对象的多态: 可以让一个父类的引用 指向 一个子类的对象
animal 的编译类型是Animal,运动类型是Dog
animal= new Cat(); animal 的编译类型是Animal,运动类型变成了Cat
package com.hspedu.Poly_.objectpoly_;
public class Dog extends Animal{
public void cry() {
System.out.println("狗:你在狗叫什么...");
}
}
package com.hspedu.Poly_.objectpoly_;
public class Cat extends Animal{
public void cry() {
System.out.println("猫:你在猫叫什么");
}
}
package com.hspedu.Poly_.objectpoly_;
public class Animal {
public static void main(String[] args) {
Animal animal_1 = new Animal();//编译类型是Animal,运行类型是Animal
Animal animal_2 = new Dog();//编译类型是Animal,运行类型是Dog
animal_2.cry();//此时的编译类型是Animal,运行类型是Dog
animal_2 = new Cat();//此时的编译类型仍然是Animal,但运行类型变成了Cat
animal_2.cry();//此时的编译类型是Animal,运行类型是Cat
}
public void cry() {
System.out.println("Animal动物在叫....");
}
}
2.
//animal 编译类型是 Animal,可以指向Animal子类的对象
//food 编译类型是 Food,可以指向Food子类的对象
public void feed(Animal animal,Food food) { System.out.println(this.name+"给"+animal.getName()+"喂"+food.getName());
}
public class Test {
public static void main(String[] args) {
Master master = new Master("Jack");
Dog dog = new Dog("金毛");
Cat cat = new Cat("蓝猫");
Fish fish = new Fish("小鱼干");
Bone bone = new Bone("鸡锁骨");
master.feed(dog ,bone);
master.feed(cat,fish);
}
}



