向上转型:
由子类转换成为父类,在继承图上是向上移动的,称之为向上转型。
特点:
1、首先是安全的,但是可能会导致子类的方法的丢失。
2、父类的引用指向子类的对象
与之相反的是向下转型
特点:
1、不安全,向下转型的时候首先需要向上转型
2、子类的对象指向父类的引用
class Animal{
String name;
public Animal(String name){
this.name=name;
}
public void eat(){
System.out.println("我有吃的方法");
}
}
class Cat extends Animal{
public Cat(String name) {
super(name);
}
public void eat(){
System.out.println("猫吃鱼");
}
public void swimming(){
System.out.println("我会游泳");
}
}
class Dog extends Animal{
public Dog(String name) {
super(name);
}
public void shout(){
System.out.println("我会叫");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
//向上转型,首先是安全的 ,但是会导致子类的方法的丢失,因为引用只会调用到子类重写父类的方法或者是父类本身已有的方法,子类自己的方法不会被调用到
Animal a1= new Cat("我是猫");
//Animal a2=new Dog("我是狗");
//向下转型,第一部首先是其向上转型。特点:是不安全的 ,因为系统不会知道引用到底是指向的哪一个子类
Cat cat=(Cat) a1;
cat.swimming();
//但是这样就会报错,因为狗指向了猫,相当于把狗转换成为了猫,但是编译不会报错,执行之后会报异常
/*Dog dog= (Dog) a1;
dog.shout();*/
//执行之后回报 java.lang.ClassCastException异常,处理方法:instanceof运算符
//instanceof运算符用来在运行是返回一个布尔值来指出对象类是否是特定类或者是他的子类的一个实例
/**用法:
* result=object instanceof class
* result:布尔类型
* object:必选项,任意对象表达式
* class:必选项:任意已定义的对象类
* 说明:如果object是class或者其定义的一个实例,则result返回true,如果不是或者object是null,则返回一个false
*/
//看引用是否指向狗,没有指向的话就不会执行,也就不会报错
if (a1 instanceof Dog) {
Dog dog= (Dog) a1;
dog.shout();
}
}
}