Java中,存在向上转型和向下转型。
向上转型
子类转换为父类称为向上转型。
子类转换为父类属于小范围转换成大范围,属于自动类型转换。
例:
public class Test{
public static void main(String[] args) {
Animal cat = new Cat(); //Cat类转换为Animal类,向上转型
Animal dog = new Dog(); //Dog类转换为Animal类,向上转型
cat.Method();
dog.Method();
}
}
class Animal{
void Method(){
System.out.println("animal");
}
}
class Dog extends Animal{
void Method(){
System.out.println("dog");
}
}
class Cat extends Animal{
void Method(){
System.out.println("cat");
}
}
输出结果:
可以看到,将子类Cat类和Dog向上转换成了Animal类,实现了多态。
向上转型是多态实现的重要步骤,只有类和类之间有继承关系才能向上转型。
当我们需要多个同父的对象调用某个方法时,通过向上转换后,则可以确定参数的统一.方便程序设计。
向上转型时,父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的.
编译看左边,运行看右边。编译器只直到cat是Animal类,如果是Animal类中不存在的方法,编译器会报错。
如果想要调用子类中特有的方法,需要向下转型。
向下转型
父类转换成子类属于向下转型。
向下转型属于大类型转换成小类型,不能自动转换,需要强制转换。
例:
public class Test{
public static void main(String[] args) {
Animal animal = new Cat();
Cat cat = (Cat)animal; //将Animal类向下转型为Cat类,这是先创建对象后向下转型
Dog dog = (Dog) new Dog(); //将Animal类向下转型为Dog类 ,直接向下转型。
cat.Method2();
dog.Method2();
}
}
class Animal{
void Method(){
System.out.println("animal");
}
}
class Dog extends Animal{
void Method(){
System.out.println("dog");
}
void Method2(){
System.out.println("我是狗独有的" );
}
}
class Cat extends Animal{
void Method(){
System.out.println("cat");
}
void Method2(){
System.out.println("我是猫独有的");
}
}
输出结果:
通过强制的向下转型,可以调用子类中特有的方法。
强制类型转换必须保证是相同类型之间的转换,只有是Cat类才能转换为Cat类。有时候我们并不知道类名,所以这个时候就需要使用关键字instanceof。
instanceof是用来判断引用指向的对象类型。instanceof(a of A),返回值是boolean类型。如果a引用的对象类型是A类型,则返回true,如果不是,则返回false。
例:
public class Test{
public static void main(String[] args) {
Animal animal = new Cat();
if(animal instanceof Cat){ //判断animal是否是Cat类型
Cat cat = (Cat)animal;
cat.Method2();
}
if(animal instanceof Dog){ //判断animal是否是Dog类型
Dog dog = (Dog)animal;
dog.Method2();
}
}
}
class Animal{
void Method(){
System.out.println("animal");
}
}
class Dog extends Animal{
void Method(){
System.out.println("dog");
}
void Method2(){
System.out.println("我是狗独有的" );
}
}
class Cat extends Animal{
void Method(){
System.out.println("cat");
}
void Method2(){
System.out.println("我是猫独有的");
}
}
输出结果:
我们发现,输出结果只有猫,没有狗,因为animal是Cat类型的不是Dog类型的。
我们在开发过程中有时根本不知道类名和类和类之间的关系,所以instanceof关键字十分重要,只有instanceof返回为true了,才能向下转型。