多态的含义,简单来说就是一类事物在不同时刻表现出不同的状态。
就像是:
小猫和小狗都属于动物类,小猫吃鱼,小狗吃骨头。一只小动物在吃鱼的时候就是小猫,在吃骨头的时候就是小狗。吃鱼和吃骨头就像是两个方法,都是小猫和小狗所特有的。
例如:
public abstract class Animal {
public abstract void eat();
}
class Cat extends Animal{
public void eat(){
System.out.println("小猫吃鱼");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("小狗吃骨头");
}
}
class Test {
public static void main(String[] args) {
Test test = new Test();
Animal dog = new Dog();
Animal cat = new Cat();
test.feed(dog);
test.feed(cat);
}
public void feed(Animal animal){
animal.eat();
}
}
动物类Animal类为小猫类和小狗类的父类,在定义对象时,将小猫类和小狗类自动转换成为动物类,因为满足已成关系所以这里的语法也是成立的,这样创建对象的方式满足,编译看左边,运行看右边。再在测试类中定义一个方法来调用动物类中的eat();方法,这样在调用时,dog对象则会调用Dog类中的eat();方法,而cat对象则会调用Cat类中的eat();方法,从而实现同类事物在不同时刻表现出不同的状态。
多态需要满足的条件:
1、子类继承父类
2、在子类中要有父类方法的重写
3、在创建对象时父类引用指向子类对象。如下:
Animal dog = new Dog();
Animal cat = new Cat();
什么是编译看左边,运行看右边呢?
简单来说:
程序的运行一般分为两个阶段,一个是编译阶段,一个是运行阶段。
class Test {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.eat();
cat.eat();
}
}
如果将测试类改成这样也是可以运行通过的,就是因为程序在编译期间,左边为父类,右边为子类。在调用方法时,编译时,会先看父类中有没有eat();方法,在运行时,再运行右边的子类中的eat();方法,不论这两个条件哪个都不满足,则程序便会运行不了。
在多态中还存在多态之间的转型:
多态的转型类似于基本类型转换,
自动类型转换:子类转换为父类,子类上升为父类
一般使用这种方法来实现多态
强制类型转换:父类转换为子类
如果子类存在父类中没有的方法,并且在创建子类对象时自动转换成为了父类,如果想要调用子类特有的方法,则必须先把类型强制转换为子类类型。
语法格式为:
Dog(子类类型的类型名) dog1(变量名) = (Dog) dog(父类类型变量名);
如果不知道创建的对象引用变量是什么类型的话,可以使用下面的方法先来判断一下:
if(dog instanceof Dog){ }//这句话的意思是:判断dog1是否为Dog类型
基本格式为:
父类引用 instanceof 具体子类类型
以上则是我所理解的多态,望采纳。