目录
一、何为多态性
多态性可以理解为一个事物的多种态性。在Java中指的是对象的多态性:父类的引用指向子类的对象(或子类的对象赋值给父类的引用)。
二、多态的使用
有了对象多态性后,在编译期间,只调用父类声明的方法,但在执行期实际执行的是子类重写父类的方法。(简称:编译时,看左边,运行时看右边)
在多态的情况下:
①“看左边”:看的是父类引用(父类中不具备子类特有的方法)
②“看右边”:看到是子类的对象(实际运行的是子类重写父类的方法)
需要注意的是:对象的多态性,只适用于方法,不适用于属性
2.1多态性使用的前提
①要有类的继承关系
②要有方法的重写
三、多态的应用举例
创建一个Animal类作为父类,再创建Dot类、Cat类作为子类。
在Animal类之中定义eat方法和shout方法,并在子类中分别进行重写。
package cn.polymorphism.contact;
class Animal {
public void eat() {
System.out.println("动物吃东西");
}
public void shout() {
System.out.println("动物的叫声");
}
}
class Dot extends Animal{
public void eat() {
System.out.println("狗吃骨头");
}
public void shout() {
System.out.println("汪!汪!汪!");
}
public void doing() {
System.out.println("狗看家");
}
}
class Cat extends Animal{
public void eat() {
System.out.println("猫吃鱼");
}
public void shout() {
System.out.println("喵!喵!喵!");
}
public void doing() {
System.out.println("猫捉老鼠");
}
}
创建一个Animal的测试类Animaltest
package cn.polymorphism.contact;
public class Animaltest {
public static void main(String[] args) {
//对象的多态性,父类的引用指向子类的对象
Animal animal1 = new Dot(); //这就是多态
Animal animal2 = new Cat();
//多态的使用,当调用子父类同名同参数方法时,实际调用的是子类重写父类的方法
animal1.eat();
animal1.shout();
//animal1.doing(); //无法调用,因为在父类之中并没有定义这个方法(这个方法是Dot类独有的)
animal2.eat();
animal2.shout();
//animal2.doing(); //无法调用,因为在父类之中并没有定义这个方法(这个方法是Cat类独有的)
}
}
还可以这么写
package cn.polymorphism.contact;
public class Animaltest {
public static void main(String[] args) {
//对象的多态性,父类的引用指向子类的对象
Animaltest animal3 = new Animaltest();//这就是多态
animal3.funs(new Dot());
animal3.funs(new Cat());
}
//还可以这么写
public void funs(Animal animal) {
animal.eat();
animal.shout();
}
}
四、多态和重载的区别
Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。对于重载而言,在方法调用之前,编译器就已经确认了所要调用的方法。(这也称之为“早绑定”或“静态绑定”)
对于多态,只有在方法调用的那一刻,解释运行器才会确定所要调用的具体方法。(这也称之为“晚绑定”或“动态绑定”)
五、下向下转型和instanceof关键字的使用
Instanceof是Java的保留关键字,测试左边的对象是不是右边类的实例。
例:a instanceof A 判断对象a是否是类A的实例,如果是返回true,不是放回false。
为避免在向下转型时发生异常,在向下转型时可以配合instanceof使用,一旦放回true,则执行向下转型,放回false,则不执行向下转型。
5.1向下转型的应用举例
package cn.polymorphism.contact;
public class Animaltest {
public static void main(String[] args) {
Animal animal4 = new Dot();
//animal4.doing(); //无法调用
Dot animal5 = (Dot)animal4;
animal5.doing();
//Cat animal6 = (Cat)animal4; //使用强转,可能会出现异常(这里虽然编译过了但,运行后还是报异常了)
//animal6.doing();
//这里可以使用instanceof进行强转前的判断
if(animal4 instanceof Dot) {
Dot animal6 = (Dot)animal4;
animal6.doing();
System.out.println("************Dot类***************");
}
if(animal4 instanceof Cat) {
Cat animal6 = (Cat)animal4;
animal6.doing();
System.out.println("************Cat类***************");
}
if(animal4 instanceof Animal) {
System.out.println("************Animal类************");
}
if(animal4 instanceof Object) {
System.out.println("***********Object类*************");
}
}
}
最后到这里,文章就结束了,如果在内容上有问题,恳请各位大佬指出。