在学习了Java的多态以后,对多态有了进一步的理解,下面通过一个例子来展示:
动物类:Pet
package polymorphism;
public class Pet {
//写了一个call的方法,模拟动物的叫
public void call(){
System.out.println("我是动物,我会叫");
}
}
动物的Cat类,继承了动物Pet类,重写call方法;
package polymorphism;
public class Cat extends Pet{
@Override
public void call() {
System.out.println("猫的叫声:喵喵喵");
}
}
动物的Dog类,继承了动物Pet类,重写call方法;
package polymorphism;
public class Dog extends Pet{
@Override
public void call() {
System.out.println("狗的叫声:汪汪汪");
}
public void bite(){
System.out.println("狗会咬人");
}
}
编写一个测试启动类Application
package polymorphism;
public class Application {
public static void main(String[] args) {
Cat cat = new Cat();
cat.call();
Dog dog = new Dog();
dog.call();
}
}
运行结果:
可以很清楚的看到,Cat类和Dog类的调用了重写的call方法和bite方法;
并没有执行父类Pet的这句代码:
public void call(){
System.out.println("我是动物,我会叫");
}
因此,从这里可以看出,Pet类的call方法可以看作一个接口,对于具体的动物他们所具有的行为(方法),只需要重写即可。
通俗来讲:猫和狗都是动物,他们都会叫,但是他们叫的方式不一样,所以只需要重写父类Pet方法,这便是Java中多态的体现!
我们修改一下Application的代码:
package polymorphism;
public class Application {
public static void main(String[] args) {
Dog dog = new Dog();
dog.call();
dog.bite();
Pet pet = new Dog();
pet.call()
pet.bite();
}
}
可以很明显的看到,父类的pet对象可以调用call方法不能调用bite方法,这是为什么呢?
子类继承父类,将会得到除父类static,final,private修饰的所有方法。(当然,不包括构造方法)Pet pet = new Dog();`是一个对象的上转型对象,即父类引用指向子类对象。方法的调用除了本类的对象可以调用,在方法重写里还可以通过父类对象的引用来调用自己;bite方法是子类Dog自己的方法,并不是继承父类的方法。父类并不能调用子类特有的方法;
多态是方法的多态,属性没有多态!
父类和子类有联系,类型转换异常!ClassCastException!
存在条件:继承关系,方法需要重写!



