目录
向下转型: 子类引用指向父类(父类的引用给到子类对象),需要进行强制转化
常规声明对象赋值过程:
Animal animal = new Animal() ;
向上转型: 父类的引用指向子类对象 ,自动转化,安全。
此时,将 = 号右边更换子类对象
Animal animal1 = new Dod() ; Animal animal2 = new Cat() ;
这种将子类对象赋值给父类的操作是先向上转型。也就是父类的引用指向子类对象。此时符合is a 原则。此时不会报错,会自动向上转型。实际上就是创建一个子类对象,将其当作父类对象来使用。把一个小对象转成大对象。
注意:
- 上转型对象不可以访问子类新增的成员变量和子类自己新增的方法,因为这是子类独有的,而父类中没有;
- 上转型对象可以访问子类继承的方法或者是子类重写的方法,这个时候当上转型对象去调用这个方法时,一定是调用了子类重写后的方法;
- 不可以将父类创建的对象的引用赋值给子类声明的对象,也就是下面的这两句代码,这很明显和我们的上转型对象相反的,我们是将子类对象给到父类的引用,但这是将父类的引用给到子类的对象,完全就是颠倒黑白【就和猫是动物,动物却不是猫一个道理】
向下转型: 子类引用指向父类(父类的引用给到子类对象),需要进行强制转化
Animal animal1 = new Dod() ;
Animal animal2 = new Cat() ;
Dog dog = (Dog)animal1 ; Cat cat = (Cat) animal2 ;
向下转型前提,得确定Animal是Dog的类型。否则会报 java.lang.ClassCastException 错误
所以括号进行强制转换指定类型。但为保证向下转型成功。通过进行instanceof 进行判断。
instanceOf的作用是测试它左边的对象是否是它右边类的实例,并返回 boolean类型的数据。
if(animal instanceof Dog){
Dog dog = (Dog)animal1 ;
}
if(animal instanceof Cat){
Cat cat = (Cat) animal2 ;
}
疑问?
向下转型之前必须向上转型嘛?
在Java中,向下转型(downcasting)是指将一个父类引用变量转换为子类引用变量。在向下转型之前,必须进行向上转型(upcasting)。
向上转型是指将一个子类对象转换为父类引用变量。这样做不会丢失对象的任何信息,只是扩展了对象的类型。向上转型是安全的,因为子类是父类的特殊形式,所以子类对象可以被当作父类对象来处理。
向下转型是将已经进行过向上转型的对象再次进行类型转换,将其转换为子类引用变量。在进行向下转型时,必须保证父类引用变量实际上指向了一个子类对象,否则会导致ClassCastException
异常。
class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("The dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal(); // 向上转型
Dog dog = (Dog) animal; // 尝试向下转型,抛出ClassCastException异常
}
}
在上面的代码中,我们首先创建了一个Animal对象,并将其向上转型为父类引用变量。然后,我们尝试将该引用变量向下转型为Dog对象,但由于该引用变量实际上并没有指向一个Dog对象,因此会导致ClassCastException
异常。所以应该在向下转型之前进行向上转型:
Animal animal = new Dog(); // 向上转型