Java的向上转型和向下转型

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

向上转型和向下转型的概念:

我们已经学了继承这个概念,那么,向上转型和向下转型讲的就是父类和子类之间的关系:

1. 向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口。

2. 向下转型:父类引用的对象转换为子类类型称为向下转型。

通俗点来说,就是父类类型和子类类型的互相转换,但是子类是继承了父类的所有成员,而父类少了子类的一些成员(新建的一些成员),所以在向上转型的时候还要注意到这一点。

实例操作:

向上转型可能会发生的错误是父类用了子类里面有,而父类里面没有的方法

//Break易站实例:
public class Animal {
public void eat(){
System.out.println("animal is eatting...");
}
}
class Fish extends Animal{
public void eat(){
System.out.println("Fish is eatting...");
}
public void swim(){
System.out.println("Fish is swimming...");
}
}
class Main{
public static void main(String[] args) {
Animal f=new Fish(); //向上转型
f.eat();
f.swim(); //此处提示在Animal中没有定义swim方法,所以运行会出错
}

向下转型的话,如果父类引用的对象是父类本身,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。

//Break易站实例:
public class Animal {
public void eat(){
System.out.println("animal is eatting...");
}
}
class Fish extends Animal{
@Overwrite
public void eat(){
System.out.println("Fish is eatting...");
}
public void swim(){
System.out.println("Fish is swimming...");
}
}
class main{
public static void main(String[] args) {
Animal f=new Fish(); //向上转型
f.eat();
Fish f2=(Fish)f; //向下转型,编译和运行皆不会出错
f2.eat();
f2.swim();
Animal a = new Animal();
//Fish f3=(Fish)a; //这个向下转型,运行会出错的
//f3.eat();
//f3.swim();
if(f3 instanceof Fish){
Fish f3=(Fish)a; //这个向下转型,运行不会出错
f3.eat();
f3.swim();
}
}

总结:

1. 向上转型时,子类中新定义的成员方法会丢失。就像Animal访问不到swim的方法一样

2. 子类引用不能指向父类对象。Fish c = (Fish)new Animal()这样是不行的。但是父类引用可以指向子类对象

3. 向上转型的好处是减少重复代码,使代码变得简洁和提高系统扩展性,符合Java的面向对象的过程。

4. 向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)或者用instanceof,这样才会正确

5. 向下转型只能转型为本类对象(鱼是不能变成鸟的)。

 

  •   本文标题:Java的向上转型和向下转型 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/994.html

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读