序言:
向上转型和向下转型这两个知识点,是为后面的java类和对象三大特性之多态服务的,我之所以分开讲解,是因为我害怕读者会出现知识凌乱的问题,因为我之前在学习这些内容的时候也会出现知识点很多,很乱的问题,本章的内容,不会讲解向上转型和向下转型的应用。
1.向上转型
(1).认识向上转型
向上转型是什么?通俗的讲,就是父类的引用变量,引用了子类对象,是小范围向大范围的转换,例如:(这个例子我会从头用到尾,读者请务必看懂)
class Animals{
String name = "小白" ;
int age = 18;
public void eat(){
System.out.println("正在吃饭");
}
}
class Dog extends Animals{
public void bark(){
System.out.println("汪汪汪");
}
}
这段代码中,我创建了一个父类Animals和子类Dog,Dog类继承Animals类,然后,我再创建一个主类,去实例化这些类,如下
public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
Animals animal1 = dog1;
}
}
你会发现,本来,父类的引用变量是用来引用父类的对象的,但是我这里干了一件事,就是让父类的引用变量去引用子类的对象,如图
向上转型了之后,animal1可以访问父类的成员,但是不可以访问子类的成员,如图
很显然,编译器把bark()变红了,也就是说报错了,所以说,经过向上转型后的animal1,是无法访问子类的成员的,但是它仍然可以访问父类成员。
(2).向上转型有三种方式
1.直接赋值
直接赋值就不多说了,就是上面Animals类和Dog类的例子
2.传参
如图(还是上面的那个例子),
3.通过返回值
通过返回值向上转型,有两种方式,
第一种:方法的返回值类型是父类
第二种:方法的返回值类型是子类
两种方法的区别并不大,区别就在于func()存的值是Animals类型还是Dog类型,这个留给读者自行思考吧
(3).向上转型的优缺点
1.优点:让代码变得更加灵活(学完多态就能理解到)
2.向下转型的缺陷:不能调用子类的成员
2.向下转型
既然有向上转型,那当然就有向下转型啦,但是向下转型,是基于向上转型的,为什么这么说呢?
你看,
java是不支持这样直接转换的,但是我可以这样
我的animal1经过向上转型后,再强制转换为原来的类型,就是向下转型啦,但是要注意,这个向下转型,只能转为它原本的类型,例如,我现在再创建一个Cat对象 ,如下,
然后再向下转型,用Cat的引用去接收
看着好像没有报错,其实你一旦运行,他就会报错,如图
所以,向下转型只能转为它向上转型之前的类型,通俗的讲,就是还原向上转型。