1.理解多态性
可以理解为一个事物的多种形态
2.何为多态性
多态性指的是对象的多态性,即父类引用指向子类的对象
3.多态的使用:虚拟方法的调用
有了对象的多态性以后,我们在编译期只能调用父类中声明的方法,但在运行期我们实际执行的是子类重写父类的方法。
总结:编译看左边,运行看右边
4.多态的使用前提
存在:
- 类的继承关系
- 方法的重写
5.多态性的使用举例
package polymorphism.test;
/**
* @BelongsProject: untitled
* @BelongsPackage: polymorphism.test1
* @Author: mcc
* @CreateTime: 2020-08-16 09:29
* @Description:
*/
public class AnimalTest {
public static void main(String[] args) {
AnimalTest animalTest = new AnimalTest();
animalTest.func(new Dog());
}
/**
* Animal animal = new Dog();此处声明一个Animal,但是实际上是new Dog(),这就是
* 多态中子类对象的形式;在方法体里面调用功能时,由于声明的是Animal类型的,所以只能够
* 调用Animal的方法,但是实际上new Dog(),所以运行上执行的是Dog重写Animal的方法
* @param animal
*/
public void func(Animal animal) {
animal.eat();
animal.shout();
}
}
class Animal {
public void eat() {
System.out.println("动物:进食");
}
public void shout() {
System.out.println("动物:叫");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗:吃骨头");
}
@Override
public void shout() {
System.out.println("汪!汪!汪!");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫:吃鱼");
}
@Override
public void shout() {
System.out.println("喵!喵!喵!");
}
}
如果不使用多态性:
package polymorphism.test;
/**
* @BelongsProject: untitled
* @BelongsPackage: polymorphism.test1
* @Author: mcc
* @CreateTime: 2020-08-16 09:29
* @Description:
*/
public class AnimalTest {
public static void main(String[] args) {
AnimalTest animalTest = new AnimalTest();
animalTest.func(new Dog());
}
/*
* 没有多态性就意味着要造许多重载的func方法,现在只有两个继承类,当又要
* 增加继承类时,func要重载的次数会更多,代码的冗余就体现了出来*/
public void func(Dog dog) {
dog.eat();
dog.shout();
}
public void func(Cat cat) {
cat.eat();
cat.shout();
}
}
class Animal {
public void eat() {
System.out.println("动物:进食");
}
public void shout() {
System.out.println("动物:叫");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗:吃骨头");
}
@Override
public void shout() {
System.out.println("汪!汪!汪!");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫:吃鱼");
}
@Override
public void shout() {
System.out.println("喵!喵!喵!");
}
}
6.对象的多态性,只适用于方法,不适用于属性
package shuxing.test;
/**
* @BelongsProject: untitled
* @BelongsPackage: shuxing.test
* @Author: mcc
* @CreateTime: 2020-08-16 12:53
* @Description:
*/
public class PersonTest {
public static void main(String[] args) {
Person person = new Student();
System.out.println(person.id);
}
}
class Person {
int id = 10;
public void eat() {
System.out.println("人:吃饭");
}
}
class Student extends Person {
int id = 20;
@Override
public void eat() {
System.out.println("学生:吃有营养的食物");
}
}
通过现有的知识很难去推论出来,这儿只能通过结论来明确java是怎么规范的。运行结果是调用了person的id,所以对于属性来说编译与运行均看左边。