当前位置: 首页 > 编程笔记 >

Java向上转型和向下转型实例解析

高正初
2023-03-14
本文向大家介绍Java向上转型和向下转型实例解析,包括了Java向上转型和向下转型实例解析的使用技巧和注意事项,需要的朋友参考一下

这篇文章主要介绍了Java向上转型和向下转型实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白。没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法。

首先看下怎么用转型。

要转型,首先要有继承。继承是面向对象语言中一个代码复用的机制,简单说就是子类继承了父类中的非私有属性和可以继承的方法,然后子类可以继续扩展自己的属性及方法。

向上转型:子类对象转为父类,父类可以是接口。公式:Father f = new Son();Father是父类或接口,son是子类。

向下转型:父类对象转为子类。公式:Son s = (Son)f;

例子:向上转型

package multistate;

public class Human {

  public void sleep() {
    System.out.println("Human sleep..");
  }

  public static void main(String[] args) {
    Human h = new Male();// 向上转型
    h.sleep();
    Male m = new Male();// 干嘛要向上转型
    m.sleep();
    // h.speak();此方法不能编译,报错说Human类没有此方法
  }
}

class Male extends Human {
  @Override
  public void sleep() {
    System.out.println("Male sleep..");
  }

  public void speak() {
    System.out.println("I am Male");
  }
}

class Female extends Human {
  @Override
  public void sleep() {
    System.out.println("Female sleep..");
  }

  public void speak() {
    System.out.println("I am Female");
  }
}

注意:向上转型不要强制转型。向上转型后父类的引用所指向的属性是父类的属性,如果子类重写了父类的方法,那么父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定。向上转型后父类引用不能调用子类自己的方法,就是父类没有但是子类的方法,如果调用不能编译通过,比如子类的speak方法。

非要调用子类的属性呢?如果不向下转型就需要给需要的属性写getter方法。

例子:

package multistate;

public class Human {
   String name = "Human";
   public String getName(){
     return this.name;
   }
  public void sleep() {
    System.out.println("Human sleep..");
  }

  public static void main(String[] args) {
    Human h = new Male();// 向上转型
    System.out.println(h.getName());
  }
}

class Male extends Human {
  String name = "Male";
  public String getName(){
    return this.name;
  }
  @Override
  public void sleep() {
    System.out.println("Male sleep..");
  }

  public void speak() {
    System.out.println("I am Male");
  }
}

class Female extends Human {
  String name = "Female";
  
  public String getName(){
    return this.name;
  }
  @Override
  public void sleep() {
    System.out.println("Female sleep..");
  }

  public void speak() {
    System.out.println("I am Female");
  }
}

非要调用子类扩展的方法,比如speak方法,就只能向下转型了。

例子:向下转型

向下转型需要考虑安全性,如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误即能否向下转型,只有先经过向上转型的对象才能继续向下转型。

package multistate;

public class Human {
  public void sleep() {
    System.out.println("Human sleep..");
  }

  public static void main(String[] args) {
    Human h = new Male();// 向上转型
    Human h1 = new Human();
    //h.speak();此时需要向下转型,否则不能调用speak方法。
     Male m = (Male) h;
     m.speak();
     /**Male m1 = (Male)h1;
     m1.speak();  此时会出现运行时错误,所以可以用instanceOF判断*/
     if (h1 instanceof Male){
       Male m1 = (Male)h1;
       m1.speak();
       
     }
  }
}

class Male extends Human {
  @Override
  public void sleep() {
    System.out.println("Male sleep..");
  }

  public void speak() {
    System.out.println("I am Male");
  }
}

弄了半天,向上转型反而不能拥有子类的全部方法,还得向下转型,那直接Son s = new Son();岂不是很方便?不知道是不是就我一个开始学习转型有这种想法。

最后搞明白了,原因还是我我的例子太简单,没有 考虑过要把类的对象传递给其他函数的例子。

例子:体现向上转型的好处,节省代码。

package multistate;

public class Human {
  public void sleep() {
    System.out.println("Human sleep..");
  }
    public static void doSleep(Human h){
      h.sleep();
      
    }//此时传递的参数是父类对象,但是实际调用时传递子类对象,就是向上转型。
  public static void main(String[] args) {
    Human h = new Male();// 向上转型
    doSleep(new Male());//此处匿名子类对象,当然实际应用时应该是用上面的向上转型公式,然后将子类对象传递进来,这样以后好在向下转型,此处没有向下转型,所以直接用了匿名类对象。
    doSleep(new Female());
    
  }
}

class Male extends Human {
  @Override
  public void sleep() {
    System.out.println("Male sleep..");
  }
}

class Female extends Human {
  @Override
  public void sleep() {
    System.out.println("Female sleep..");
  }

}

如果不向上转型则必须写两个doSleep函数,一个传递Male类对象,一个传递Female类对象。这还是两个子类,如果有很多子类呢,就要写很多相同的函数,造成重复。

好,终于也理解了为什么要向上转型,一旦向上转型了,当需要用到子类的方法时,就需要向下转型,也就是为什么要向下转型也解决了。

总结一下:

1、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。

   如Father father = new Son();

2、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型,要向下转型,必须先向上转型为了安全可以用instanceof判断。

   如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;

   其中father前面的(Son)必须添加,进行强制转换。

3、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效,向上转型只能引用父类对象的属性,要引用子类对象属性,则要写getter函数。

4、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Java 向上转型和向下转型的详解,包括了Java 向上转型和向下转型的详解的使用技巧和注意事项,需要的朋友参考一下  Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。 向上转型:子类引用的对象转换为父类类型称为向上转型。通

  • 本文向大家介绍Java 转型(向上或向下转型)详解及简单实例,包括了Java 转型(向上或向下转型)详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。 向上转型 我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一

  • 主要内容:将派生类对象赋值给基类对象,将派生类指针赋值给基类指针,将派生类引用赋值给基类引用在 C/ C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍。例如: 输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如: 输出结果为 10.

  • 本文向大家介绍浅谈Java向下转型的意义,包括了浅谈Java向下转型的意义的使用技巧和注意事项,需要的朋友参考一下 一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也比较好理解。 但是向下转型,会不会觉得很傻,我是要用子类实例对象,先是生成子

  • 这段代码是直接从文章中复制下来的 但是会报 运行时 dynamic_cast 的操作数必须包含多态类类型的错误,运行时也会报错 我的理解是这段代码在进行向下转型,应该是没有问题的。

  • 问题内容: 我正在尝试集成一个第三方Django应用程序,该应用程序做出了不幸的决定继承自,这对于可插拔应用程序来说是一个很大的禁忌。引用马尔科姆·特雷丁尼克(Malcolm Tredinnick): 不过,更重要的是,就像在Python中一样,你不能使用Django的模型继承来“贬低”。就是说,如果你已经创建了User实例,那么你必须在不掩饰的情况下使该实例与你尚未创建的子类实例相对应。 好吧,

  • 本文向大家介绍java对象转型实例分析,包括了java对象转型实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java对象转型的概念,分享给大家供大家参考。具体方法如下: 对象转型(casting)注意事项如下: 1、一个基类的引用类型变量可以“指向”其子类的对象。 2、一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。 3、可以使用 引用变量 instanceof 类

  • 本文向大家介绍java对象类型转换和多态性(实例讲解),包括了java对象类型转换和多态性(实例讲解)的使用技巧和注意事项,需要的朋友参考一下 对象类型转换 分为向上转型和向下转型(强制对象转型)。 向上转型是子对象向父对象转型的过程,例如猫类转换为动物类;向下转型是强制转型实现的,是父对象强制转换为子对象。 这和基础数据类型的转换是类似的,byte在需要时会自动转换为int(向上转型),int可