如图所示。为什么需要一个强制转换呢?两次输出的类型都是A。。求大神指导
你把这个理解为整形和字符型的隐试转换和强转,1赋值给浮点型变1.0(隐试转换),但1.0转1需要强转,输出但还是1,整形和字符型转换的原因是什么,长度不一样,精读缺失,对象也是一样,属性和方法不一样,系统分配的内存也不一样
转不转都没有区别,getClass都是输出真实类型(用new 什么类型初始化就是什么类型)
道理很简单,getClass就是用来得到类型的,使用的场景就是用基类类型存储某个派生类,在基类中得到具体类型,比如arraylist里都是object,那么要知道某个元素究竟是什么就可以用getclass
要是arraylist中使用的类型是object返回结果也是object,getClass还有什么用。
getclass并不是虚方法,也不能重写,和“多态”没有任何关系。
为什么需要强制转换,是因为子类型转化为父类型不需要强转,而父类型转化为子类型则必须强转。
我是这样理解的:子类型一定能转化为他的父类型,而父类型却不一定能转化为他的子类型,所以需要声明强转。
两次输出类型都为A是因为getClass是输出真实的类型,就是它是啥类型就输出啥,和你转换没有关系。
一个是父类引用指向子类对象,一个是子类引用指向父类对象,前者不需要强转,后者需要强制类型转换,前者没有任何危险性,但后者有危险性,如果子类新增了父类没有的属性或方法,强转成父类就会出错。你这和多态没啥关系。
打个比方,A是狗,People是动物,People p = new A();这句话说明你创造了一条狗,往大了说它是一个动物,这没错,你用p.getClass拿到的是这个动物的真实类型,其实他还是一个狗。
A a = (A)p;这句话说明你知道p这个动物本身是条狗,所以你再管这个动物叫狗也是合适的,a.getClass拿到的还是这个东西的真实类型,也就是狗。
相反,如果你A a = new People();那就不行了,因为你创造一个动物出来不一定是狗,也可能是猫。同样如果你把一个动物强制转换成狗也不合适,因为这个动物可能不是狗,而是猫。
这就是为什么父类引用可以随便接收子类对象,而父类对象不能随便强制转换为子类引用的原因,除非这个父类对象本身就是这个子类对象,用父类引用接收,其实只是套了一个外衣而已
针对上面的a.getClass(), A a = (A)p 强不强转也没多大关系,如果调用的是子类仅有的方法,那就需要强转了;
类型都是A,是因为引用指向的对象都是A
一个父类型Parent 可由多个子类型继承,child1 exend parent,child2 extend parent ....
所以 child1 c1 = (child1) parent; 所以父类转换为子类时必须强转 系统才会明白你的用意
各位讲的都很好。。。路过。。。
假设父类是BaseClass有方法A(),B(),C()
子类是SubClass有方法D(),E()
当父类的实例想调用子类中的方法D的时候,只能通过(如果没有强制类型转换,父类对象只能调用父类中的方法)
BaseClass baseClass=new BaseClass();
(SubClass)baseClass.D();