向上转型

把子类的实例化对象转化成父类的实例化对象称为“向上转型”。
语法:父类 对象名=new 子类();
用父类声明对象名,用子类创建实例化对象,把子类创建的实例化对象的内存空间给用父类声明的对象名。由于子类的对象也一定就是父类的对象,所以向上转型总是安全的,好比如“平行四边形是四边形”一样。
image.png

向下转型

把父类的实例化对象转化成子类的实例化对象称为“向上转型”。
但是向下转型不可以使用“子类 对象名=new 父类():”的方法来操作,因为父类对象不一定是子类的实例,这样转型是不安全的,就好比我们可以说“平行四边形是四边形,但不能说四边形是平行四边形”,这时候就需要使用强制转化了。
语法:如果对象1(父类的实例)是子类的实例,那么可以使用强制转换“子类 对象名2=(子类)对象名1
image.png
image.png

instanceof关键字

instancof关键字可以用来判断一个实例对象是否属于某一个类或者一个类是否实现了某个接口(详见《多态),在执行向下转型前要判断需要转型的父类对象是否为子类的实例。
语法:myobject instanceof OneClass
返回值是boolean型,其中myobject是某类对象的引用,OneClass是某个类。
image.png
image.png
然后对比下图:
image.png
new关键字后面都修改为Phone,由于huawei_phone和apple_phone都无法确定是不是huawei和apple的实例对象,因此不满足下面四个if语句的条件。
再来看下面的代码:
image.png
image.png
instanceof后面接geometry类时无法通过编译,原因是apple_phone所属的apple类和geometry没有任何的继承关系,两个没有任何继承关系的两个类是不能使用instanceof关键字的,这一点注意一下。