一 对象类型的转换
对象类型的转换在java编程中经常遇到,主要包括向上转型和向下转型。
1.向上转型
可以理解为:父类引用指向子类对象
public class TestPoly {
public static void main(String[] args){
Animal a = new Dog();
a.shout();
}
}
class Animal{
public void shout(){
System.out.println("叫了一声");
}
}
class Dog extends Animal{
public void shout(){
System.out.println("汪汪汪");
}
}
class Cat extends Animal {
public void shout() {
System.out.println("喵喵喵喵!");
}
}
其中
Animal a = new Dog();
就是向上转型,父类引用指向子类对象。这是因为狗是动物的一种,是动物的一个实例。那么可以将狗看成是动物的一个对象。
试想一下狗类对象可以作为shout()方法的参数,猫类对象也可以做shout()方法的参数,如果在动物类中的shout()方法中根据不同子类情况设置不同的处理就可以做到在父类中定义一个方方完成各个子类的功能,这样可以使同一份代码用在不同类型上,这是多态机制的基本思想。
之后将对多态进行介绍。
扩展到所有父类子类也是一个道理。
2.向下转型
通过向上转型可以推理出向下转型就是将较抽象的类转换为具体的类。
public class TestPoly {
public static void main(String[] args){
Animal a = new Dog();
//Dog d = a;//报错。
Dog d = (Dog)a;//正确
}
}
将父类对象赋予子类对象,需要强制转换为子类型。简单来理解就是狗是动物,但动物不一定都是狗。父类对象不一定是子类的实例。越是具体的对象具有的特性越多,抽象的对象具有的特性越少,所以在做向下转型是将特性范围小的转换为特性范围大的对象肯定会出问题,需要将父类对象强制转换为某个子类对象,这种转换称为显示转换。
二. 多态
由向上转型原则,狗类对象可以作为shout()方法的参数,猫类对象也可以做shout()方法的参数,如果在动物类中的shout()方法中根据不同子类情况设置不同的处理就可以做到在父类中定义一个方方完成各个子类的功能,这样可以使同一份代码用在不同类型上,很好的解决代码冗余问题。
多态的实现有以下几个条件:
1.多态是方法的多态,不是属性的多态(多态与属性无关)。封装的是属性,属性全部设为private,方法全部设为public。
2.多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
3.父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
public class TestPoly {
public static void main(String[] args){
Animal a = new Animal();
Animalcry(a);
//Animalcry(new Animal);与上等价
Animalcry(new Dog());
Animalcry(new Cat());
}
public static void Animalcry(Animal a){//多态的条件三:父类引用指向子对对象,实现多态
a.shout();
}
/* 如果没有多态,我们这里需要写很多重载的方法。
* 每增加一种动物,就需要重载一种动物的喊叫方法。非常麻烦。
static void animalShout(Dog d) {
d.shout();
}
static void animalShout(Cat c) {
c.shout();
}*/
}
class Animal{
public void shout(){
System.out.println("叫了一声");
}
}
class Dog extends Animal{//多态的条件一:继承
public void shout(){//多态的条件二:方法的重写
System.out.println("汪汪汪");
}
}
class Cat extends Animal {
public void shout() {
System.out.println("喵喵喵喵!");
}
}