1.实现多态的必要条件:继承(或者实现接口),重写,向上转型
2.在程序运行过程中分为两个时期:
编译期,javac检查animal中是否有eat()方法的声明,抽象方法也能通过编译
运行期,JVM去内存中调用真正的对象,Cat或Dog然后调用他们的eat方法
例子:
父类:
package neuedu9.one;
public abstract class Animal //包含抽象方法的类叫抽象类,抽象类里不能创建对象
{
protected int age;//抽象类可以声明变量来被其他类继承
protected String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void eat();//抽象方法没有方法体
}
子类:
package neuedu9.one;
public class Cat extends Animal
{
private String style;
public String getStyle() {
return style;
}
public void setStyle(String style) {
this.style = style;
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("猫吃鱼");
}
}
package neuedu9.one;
public class Dog extends Animal
{
private int LegCount;
public int getLegCount() {
return LegCount;
}
public void setLegCount(int legCount) {
LegCount = legCount;
}
@Override
public void eat()
{
// TODO Auto-generated method stub
System.out.println("狗吃骨头");
}
}
测试类:
package neuedu9.one;
public class MainTest {
//多态三个条件:继承(接口),重写,向上转型
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal a=new Cat();//向上类型转换
Animal b=new Dog();
a.eat();
b.eat();
//编译时,javac检查Animal是否有eat()方法的声明,抽象方法也能通过编译
//运行时,JVM去内存中调用真正的对象,Cat或Dog然后调用他们的eat方法
}
}
运行结果:
猫吃鱼
狗吃骨头
总结:
多态就是不同的对象对于同一消息做出不同的响应,就像上述的例子中,猫类对象a和狗类对象b都调用eat方法,得到的结果却不一样,这就是多态的体现。
向上转型和向下转型:
向上转型就是将子类引用的对象转为父类类型,上面的例子中Animal a=new Cat();就是向上转型
向下转型就是将父类对象转为子类对象,例如Son son=(Son) father;