java 向上转型_java向上转型和向下转型
转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。
向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口
向下转型:父类引用的对象转换为子类类型称为向下转型。
前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法(这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。
转型需要注意的问题:
向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。实例如下:
public class Animal {
public void eat(){
System.out.println("animal eatting...");
}
}
class Bird extends Animal{
public void eat(){
System.out.println("bird eatting...");
}
public void fly(){
System.out.println("bird flying...");
}
}
class Main{
public static void main(String[] args) {
Animal b=new Bird(); //向上转型
b.eat();
b.fly(); //此处提示在Animal中没有定义fly方法。
}
在向下转型过程中,分为两种情况:
情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。
情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。实例如下:
public class Girl {
public void smile(){
System.out.println("girl smile()...");
}
}
class MMGirl extends Girl{
@Override
public void smile() {
System.out.println("MMirl smile sounds sweet...");
}
public void c(){
System.out.println("MMirl c()...");
}
}
class main{
public static void main(String[] args) {
Girl g1=new MMGirl(); //向上转型
g1.smile();
MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错
mmg.smile();
mmg.c();
Girl g2=new Girl();
//MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
//mmg1.smile();
//mmg1.c();
if(g2 instanceof MMGirl){
MMGirl mmg1=(MMGirl)g2;
mmg1.smile();
mmg1.c();
}
}
总结:
1、父类引用可以指向子类对象,子类引用不能指向父类对象。
2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。
如Father father = new Son();
3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。
如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;
其中father前面的(Son)必须添加,进行强制转换。
4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效
5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
本文转载自:https://www.cnblogs.com/fickleness/archive/2013/06/21/3149011.html
java 向上转型_java向上转型和向下转型相关推荐
- java的向下转型_Java 向上/向下转型浅析
基于java的继承,向上或者向下转型是一种常见的情景,在thinking in java对这一情况进行了详细说明,见以下例子: class Useful { public void f() {} pu ...
- java 泛型向下转型_Java向上转型和向下转型(附具体样例)
Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Animal { pu ...
- java 向下转型运行时错误_8.5.2 向下转型与运行类型异常
由于向下转型(在继承层次中向上移动)会丢失聚类的类型信息,所以我们就想,通过向下转型-也就是在继承层次中向下移动-应该能够获取类型信息.然而,我们知道向上转型是安全的,因为基类不会具有大于导出类的接口 ...
- Java向下转型以及如何判断能否向下转型
上一条博客中我们一起了解了Java向上转型的意思以及它的优点,但同时也知道了在向上转型的过程中子类对象将不能调用其独有的方法.那我们怎么样才能既实现向上转型,又能使子类可以调用其独有的方法呢,这就需要 ...
- java的向下转型_终于搞明白向下转型的作用了,还不懂的进来看下.
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 之前一直搞不明白,向下转型的实际意义,虽然知道向下转型怎么写, 现在我来讲解下 向下转型 的实际作用,如果有错的话,大家可以指出, 如果认为我说的对的话可 ...
- java向上转型_Java向上转型
向上类型转换: 1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法. 2.父类引用变量无法调用子类新增成员变量和新增成员方法. 举个例子 public classAnimal { publi ...
- java 获取java文件路径_Java怎么获取相对路径下所有的.java文件的信息
理论上不能,因为java可能动态创建并加载类. 实践上是可能, 假设你不动态创建类, 或动态创建也由你的ClassLoader来处理,或可能忽略那些不是你创建的类 则用Guava反射的方式:Refle ...
- linux java maven项目_Java maven项目在window下运行正常,部署到Linux环境中启动报错,是由什么引起的?...
设定默认时区为:GMT+8 2018-07-19 18:58:12,013 [INFO ] com.eos.manager.web.listener.SpringContextListener.con ...
- java 文件 递归_JAVA实现遍历文件夹下的所有文件(递归调用和非递归调用)
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
最新文章
- NLP实践:对话系统技术原理和应用
- python获取用户输入的数字_Python 将用户输入的数字 提取整数谢谢
- linux命令--VI命令详解(三)
- ASP.NET Core微服务(一)——【完整API搭建及访问过程】
- visio如何扩大画布的大小. 鼠标移到画布的边界按住Ctrl,就可以拉大
- Java中从String到Long的转换
- _Linux后台开发6大常用的开源库,让你在同行中脱颖而出
- keil4如何将c语言转换成汇编语言_Keil 中关于C语言编译生成汇编代码函数名规则...
- mysql 5.6 64位解压版_MySQL 5.6 for Windows 解压缩版配置安装(win 10 64位亲测)附安装包下载链接...
- 一扬开源新闻静态生成系统V1.0发布
- idea中git替换,推送到新的github或者gitlab上面
- RealSense D435i数据录制 VINS离线运行
- EWSA破解WPA无线密码具体图文教程
- 基恩士扫码枪SR2000系列通讯
- c语言设计数字增量pi控制器,PI控制器的工作原理是什么?
- python操作cad的模块_利用python控制Autocad:pyautocad方式
- 科罗拉多大学波尔得分校计算机科学,科罗拉多大学波尔得分校院系设置
- 电信光猫 TEWA 500AG 破解 超密 2020-3-21
- 天正暖通天圆地方在哪_体现了“天圆地方”的中国古典家具有哪些?我们来聊一下!...
- tableau计算之(三)表计算——分区/寻址——手动计算/快速计算