A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© aohn1117 中级黑马   /  2016-2-29 22:34  /  7201 人查看  /  24 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

16黑马币

interface D {}


class C {}


class B extends C {}


public class A extends B implements D{

     public static void main(String[] args) throws Exception {

            C c = new A();

            D d = (D)c;

    }

}

请问D和C什么关系?   (D)c这个操作是向上转型?还是向下转型?

什么是转型?? 转型是怎么实现的?   

short a =0 ;              

int i = a;                     

a = (short)i;


A a = new A();

C c = a;

A a1 = (A)c;

以上两者有什么区别?



24 个回复

正序浏览
D(接口)和C(类)只能是实现关系,而且是类实现接口.
(D)c是向下转型,   转型可以看成不同的标准转化成同一个标准.    转型实现:一是强制转型(向下转型),一是提升转型(小标准自动适应大标准.
1是数据类型,存储空间大小标准不一样,2是子父类继承关系,权限不一样,但是可以相同理解!

希望可以帮到你!
回复 使用道具 举报
向上转型
回复 使用道具 举报
* 向上转型    说明C这个类也继承了接口D
* 转型是多态的一个特点,就是指存在子父类关系了的两个类 ,数据类型可以相互转换
* 1是基本类型数据的强制类型转换
* 2是引用类型数据的转型,是由多态实现的
回复 使用道具 举报
D和C没有关系,(D)和C不具备向上和向下转型的条件
回复 使用道具 举报
我觉着吧,D和C没啥直接关系,,由于D是接口没有对象,所以D类型应该是实现类A的类型,吧C类型的C强转为C的子类的子类的A类型应该是向下转型,
转型就是归属的类变了呗,比如用创建父类对象接收一个子类对象就是向上转型,子类接收父类就是向下转型,但是由于子类内容比父类多,要是这个父类不是之前转型下去的,就不能填满子类,应该会报错
至于区别,上面是一般数据类型,下面是引用,上面的强转看的是取值范围,下面的强转看的是属性的多少
我是这样理解的
回复 使用道具 举报
向上转型 就是提升   向下转型 就是下降
回复 使用道具 举报
(D)c 向上转型 其他不会
回复 使用道具 举报
向上转型
回复 使用道具 举报
向上转型,转为抽象了
回复 使用道具 举报
应该是向下转型
回复 使用道具 举报

这网太卡了。。。。。

本帖最后由 wx_QrM5tXqT 于 2016-3-11 21:47 编辑

你说的这个问题在多态中是存在的。向上转型格式:父类名 f = new 子类名();即父类引用指向子类对象;向下转型格式:子类名 z = (子类名)f; 此处注意:必须要先有向上转型,才能有向下转型存在;A,B,C是多层继承关系(A继承与B继承与C;D是A的接口,也就相当于干爹吧,也算是一种继承),根据继承原则 C c = new A();这是向上转型,即父类引用指向子类对象, D d = (D)c;这个就是向下转型啦,这样转型多是为了实现子类(也就是D)的特有功能,但D是接口,那么就需要实现类重写D中的所有方法(实现类重写的方法别忘了都要是public的才可以,因为子类重写不能降低父类访问权限);下个问题:①属于基本类型转换了,int i = a; 这是隐式地将short型转换成int型变量,是基本数据类型提升;a = (short)i;这个便是强制类型转换了,但这样容易损伤精度,容易出问题的。至于②则是引用数据类型转换了,A a = new A();这个创建对象(或叫实例化)就没什么可说的了,C c = a;这个相当于C c = new A();基于子父类关系,这还是向上转型,原理同上,有了向上转型的基础条件,这个A a1 = (A)c;便是向下转型喽,作用就是为了实现A中不同于父类C的特殊功能,其实这正是多态的弊端。下面的这个判断语句你可以参考 if(k instantsof a) {...
回复 使用道具 举报
你说的这个问题在多态中是存在的。向上转型格式:父类名 f = new 子类名();即父类引用指向子类对象;向下转型格式:子类名 z = (子类名)f; 此处注意:必须要先有向上转型,才能有向下转型存在;A,B,C是多层继承关系(A继承与B继承与C;D是A的接口,也就相当于干爹吧,也算是一种继承),根据继承原则 C c = new A();这是向上转型,即父类引用指向子类对象, D d = (D)c;这个就是向下转型啦,这样转型多是为了实现子类(也就是D)的特有功能,但D是接口,那么就需要实现类重写D中的所有方法(实现类重写的方法别忘了都要是public的才可以,因为子类重写不能降低父类访问权限);下个问题:①属于基本类型转换了,int i = a; 这是隐式地将short型转换成int型变量,是基本数据类型提升;a = (short)i;这个便是强制类型转换了,但这样容易损伤精度,容易出问题的。至于②则是引用数据类型转换了,A a = new A();这个创建对象(或叫实例化)就没什么可说的了,C c = a;这个相当于C c = new A();基于子父类关系,这还是向上转型,原理同上,有了向上转型的基础条件,这个A a1 = (A)c;便是向下转型喽,作用就是为了实现A中不同于父类C的特殊功能,其实这正是多态的弊端。下面的这个判断语句你可以参考 if(k instantsof a) {...
回复 使用道具 举报
你说的这个问题在多态中是存在的。向上转型格式:父类名 f = new 子类名();即父类引用指向子类对象;向下转型格式:子类名 z = (子类名)f; 此处注意:必须要先有向上转型,才能有向下转型存在;A,B,C是多层继承关系(A继承与B继承与C;D是A的接口,也就相当于干爹吧,也算是一种继承),根据继承原则 C c = new A();这是向上转型,即父类引用指向子类对象, D d = (D)c;这个就是向下转型啦,这样转型多是为了实现子类(也就是D)的特有功能,但D是接口,那么就需要实现类重写D中的所有方法(实现类重写的方法别忘了都要是public的才可以,因为子类重写不能降低父类访问权限);下个问题:①属于基本类型转换了,int i = a; 这是隐式地将short型转换成int型变量,是基本数据类型提升;a = (short)i;这个便是强制类型转换了,但这样容易损伤精度,容易出问题的。至于②则是引用数据类型转换了,A a = new A();这个创建对象(或叫实例化)就没什么可说的了,C c = a;这个相当于C c = new A();基于子父类关系,这还是向上转型,原理同上,有了向上转型的基础条件,这个A a1 = (A)c;便是向下转型喽,作用就是为了实现A中不同于父类C的特殊功能,其实这正是多态的弊端。下面的这个判断语句你可以参考 if(k instantsof a) {...
回复 使用道具 举报
你说的这个问题在多态中是存在的。向上转型格式:父类名 f = new 子类名();即父类引用指向子类对象;向下转型格式:子类名 z = (子类名)f; 此处注意:必须要先有向上转型,才能有向下转型存在;A,B,C是多层继承关系(A继承与B继承与C;D是A的接口,也就相当于干爹吧,也算是一种继承),根据继承原则 C c = new A();这是向上转型,即父类引用指向子类对象, D d = (D)c;这个就是向下转型啦,这样转型多是为了实现子类(也就是D)的特有功能,但D是接口,那么就需要实现类重写D中的所有方法(实现类重写的方法别忘了都要是public的才可以,因为子类重写不能降低父类访问权限);下个问题:①属于基本类型转换了,int i = a; 这是隐式地将short型转换成int型变量,是基本数据类型提升;a = (short)i;这个便是强制类型转换了,但这样容易损伤精度,容易出问题的。至于②则是引用数据类型转换了,A a = new A();这个创建对象(或叫实例化)就没什么可说的了,C c = a;这个相当于C c = new A();基于子父类关系,这还是向上转型,原理同上,有了向上转型的基础条件,这个A a1 = (A)c;便是向下转型喽,作用就是为了实现A中不同于父类C的特殊功能,其实这正是多态的弊端。下面的这个判断语句你可以参考 if(k instantsof a) {...
回复 使用道具 举报
过来看看,牢固基础知识。
回复 使用道具 举报
1.请问D和C什么关系?
类和接口的关系只有实现关系,显然这里不是C实现D,所以C和D并没有直接关系。C是A父类的父类,D是A实现的接口。
2.(D)c这个操作是向上转型?还是向下转型?
向上转型。C c = new A();创建一个A对象用C类的的c接收,
               D d = (D)c;这里的c就是new A();所以D d =(D)(new A());    //这里的new A()不是创建了新的对象,而是用了c创建出来的 new A(); 最终d和c指向的是同一地址值。
           而 D d =(D)(new A());就等同于D d = new A();     //这里应该看得懂是什么转型了吧!
3.以上两者有什么区别?
楼主想问的是数据类型的强制转换和引用类型的强制转换有什么区别吧?

数据类型可以转换成数据类型比自己大的,也可以转换成数据类型比自己小的
而引用类型只能把父类强转为子类,而不能把子类强制转换成父类。
回复 使用道具 举报
tsldxszd 来自手机 中级黑马 2016-3-6 18:23:01
8#
应该是没关系,没有转型存在,你的code应该是
c c=new a();d d =new a();你的d只能调用a实现了方法,而不能调用a继承自c,b的方法
回复 使用道具 举报
tsldxszd 来自手机 中级黑马 2016-3-6 18:18:50
7#
tsldxszd 发表于 2016-3-6 17:40
d和c没关系,这程序报错,应该是castexception,转型异常

我的答案错了,无视
回复 使用道具 举报
c的剪接子类实现了D,向下转型,把C类型强转为D类型。1属于向上转型,不需要创建对象!2,属于向下转型,需要创建对象!
回复 使用道具 举报
tsldxszd 来自手机 中级黑马 2016-3-6 17:40:57
报纸
本帖最后由 tsldxszd 于 2016-3-6 19:21 编辑

d和c没关系,这程序虽然不报错,可 你 的D d也无法访问继承类的特有方法
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马