多态概述
多态性是面向对象思想中的一个非常重要的概念,在Java中,多态是指不同对象在调用同一个方法时表现出的多种不同行为。例如,要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫类的叫声,传入犬类对象时就发出犬类的叫声。在同一个方法中,这种由于参数类型不同而导致执行效果不同的现象就是多态。
形式
Java中多态主要有以下两种形式:
(1)方法的重载。
(2)对象的多态性(方法重写)
案例
定义抽象类
abstract class Animal {
abstract void shout();
}
定义Cat类继承Animal抽象类
public class Cat extends Animal {
public void shout(){
System.out.println("喵喵...");
}
}
定义Dog类继承Animal抽象类
public class Dog extends Animal {
public void shout(){
System.out.println("汪汪汪....");
}
}
定义测试类
public class Example14 {
public static void main(String[] args) {
Cat an1 =new Cat();
Dog an2 =new Dog();
an1.shout();
an2.shout();
}
}
对象类型的转换
对象类型转换主要分为以下两种情况:
(1)向上转型:子类对象→父类对象。
(2)向下转型:父类对象→子类对象。
对于向上转型,程序会自动完成,而向下转型时,必须指明要转型的子类类型
转换格式
对象向上转型:父类类型 父类对象 = 子类实例;
对象向下转型:
父类类型 父类对象 = 子类实例;
子类类型 子类对象 = (子类)父类对象;
案例
向上转型案例
//定义类
public class Animal {
public void shout(){
System.out.println("喵喵喵");
}
}
public class Dog extends Animal{
public void shout(){
System.out.println("汪汪汪");
}
public void eat(){
System.out.println("吃骨头");
}
}
public class Example15 {
public static void main(String[] args) {
Dog dog=new Dog();//创建Dog对象
Animal an= dog;
an.shout();
}
}
向下转型案例
public class Animal {
public void shout(){
System.out.println("喵喵喵");
}
}
public class Dog extends Animal{
public void shout(){
System.out.println("汪汪汪");
}
public void eat(){
System.out.println("吃骨头");
}
}
public class Example16 {
public static void main(String[] args) {
Animal an =new Dog();//发生了向上转型
Dog dog =(Dog) an;//发生了向下转型
dog.shout();
dog.eat();
}
}
在向下转型时,不能直接将父类实例强制转换为子类实例,否则程序会报错。
错误案例
Dog dog = (Dog)new Animal(); (//编译错误)