正文
多态的存在有三个必要的条件:
要有继承(两个类之间存在继承关系,子类继承父类)
要有重写(在子类里面重写从父类继承下来的方法)
-
父类引用指向子类对象
这三个条件一旦满足,当你调用父类里面被重写的方法的时候,实际当中new的是哪个子类对象,就调用这个子类对象的方法。下面以代码进行说明:
这里创建了一个Animal
类,作为父类:
package com.mlin;
public class Animal {
//私有成员变量
private String name;
//构造方法
Animal(String name){
this.name = name;
}
//这里定义了一个方法
public void call(){
System.out.println("动物......");
}
}
创建两个子类,分别为Cat
类和Dog
类,它们都继承Animal
类:
package com.mlin;
public class Cat extends Animal {
//定义自己的私有成员变量
private String catColor;
//构造方法
Cat(String name ,String catColor) {
super(name);//在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name),把子类对象里面的父类对象先造出来
this.catColor = catColor;
}
//这里是重写了call方法
public void call(){
System.out.println("我是cat哦....");
}
}
package com.mlin;
public class Dog extends Animal {
//定义自己的私有成员变量
private String dogColor;
//构造方法
Dog(String name ,String dogColor) {
super(name);//在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name),把子类对象里面的父类对象先造出来
this.dogColor = dogColor;
}
//这里是重写了call方法
public void call(){
System.out.println("我是dog哦....");
}
}
创建一个person类,用于饲养宠物:
package com.mlin;
public class Person {
//定义两个私有成员变量
private String name;
private Animal pet;
/**
* 在person类里面定义构造方法,第二个参数是Animal类型给程序带来了灵活性
* 因为这个Animal类型的参数是父类对象的引用类型,因此当我们传参数的时候,
* 可以把这个父类的子类对象传过去,即传Dog、Cat都可以。
* @param name
* @param pet
*/
Person(String name,Animal pet){
this.name = name;
this.pet = pet;
}
public void myCall(){
pet.call(); //传了什么对象进来,就让这个对象去调用它自己的call方法
}
public static void main(String arg[]){
//这里分别new了一个cat对象和dog对象,这两个都包含一个父类Animal对象
Cat cat = new Cat("catname", "black");
Dog dog = new Dog("dogname","yellow");
//这里new了两个person对象,分别为p1,养了一个cat,另一个是p2,养了一只dog
Person p1 = new Person("andy", cat);
Person p2 = new Person("andy", dog);
//两个person对象调用了myCall方法,使他们自己的宠物调用自己的call方法
p1.myCall();
p2.myCall();
}
}
运行结果如下:
以上就实现了动态绑定,也就是多态。
原创作者:凌小样
作品链接:https://www.jianshu.com/p/c8160a2bd019
【原创不易,转载请注明出处,感谢理解】
一位爱生活,爱创作,爱分享,爱自己的90后女程序员一枚,记录工作中的点点滴滴,一起学习,共同进步,期待能和优秀的您交上朋友
网友评论