public class TestCasting{
public static void main(String []args){
Animal a=new Animal("name");
Dog d=new Dog("dogname","yellow");
Cat c=new Cat("catname","blue");
a=new Dog("bigyellow","yellow");
System.out.println(a.name); //输出bigyellow
Dog d1=(Dog)a;
System.out.println(d1.name); //输出null
System.out.println(d1.furColor); //输出 yellow
}
}
class Animal{
public String name;
Animal(String name){
this.name=name;
}
}
class Dog extends Animal{
public String name;
public String furColor;
Dog(String name,String furColor){
super(name);
this.furColor=furColor;
}
}
class Cat extends Animal{
public String name;
public String eyesColor;
Cat(String name,String eyesColor){
super(name);
this.eyesColor=eyesColor;
}
}
这一行:System.out.println(d1.name); //输出null
为什么输出的是null而不是:bigyellow?
最佳答案:Dog d1=(Dog)a;
因为这一句的定义是把父类对象强制转换为子类对象,又因为子类对象有name和furColor两个属性,所以可以去调用,而"bigyellow"已经被赋给了父类的name属性,所以你再调用子类的name属性时就没有了,只能是null.
其实你程序里把子类都又重新定义一个name属性是多余的.
应该这样写.子类不要再定义name属性,而是直接super(name),这样的话,父类和子类都通用一个name属性,就不会出现错误了.而更加符合继承的思想.
其余答案:
1.因为你在调用构造函数的时候调用了父类的构造方法,实际上传入的bigyellow是赋值给了animal接口里面那个name变量,子类Dog的name变量并没有赋值
2首先要明白继承的关系,你每个类里都是用super(name);来进行取值,而super是调用超类(也就是父类)里的东西,你用a对象去点name,肯定能取出,但d1对象是子类的对象,所以取出来为null..
3分析下程序的执行过程如下:
一、首先: Animal a=new Animal("name");
定义一个引用a指向new Animal("name")
二、然后:a=new Dog("bigyellow","yellow");
把引用a指向新的对象new Dog("bigyellow","yellow");,此时调用子类Dog的构造函数,即:
Dog(String name,String furColor){
super(name);
this.furColor=furColor;
},构造函数super(name);,表示把Dog(String name,String furColor)中的形参name传入,并通过super(name);赋值给父类构造函数,即此时的父类中的name的值为bigyellow;
this.furColor=furColor;意思是把子类的furColor赋值为形参furColor,此时子类的furColor值为yellow;
三、Dog d1=(Dog)a,定义一个子类引用a指向a强制转换后的子类对象,
而 System.out.println(d1.name); //输出null
含义是输出子类d1的局部变量name.而此时子类d1的局部变量name并没有赋值,局部变量没有赋值时候,name默认为值为null,故输出null;
而
System.out.println(d1.furColor); //输出 yellow
打印子类d1的局部变量furColor,已经赋值为yellow,故输出yellow
分享到:
相关推荐
java 向下转型 程序 学习java必须要学习的经典案例,加油学习把
java转型
什么是向下转型和向上转型
跟着百度走,从SEOer向SEM转型.docx
一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实是不会,那开发的过程肯定也想不到用向下转型。 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型...
java数据类型,向上转型和向下转型定义与概念。
学习Java之如何正确地向上转型与向下转型.rar
day10_21_对象的向下转型
17.2.1 回顾“向上转型”与“向下转型”.mp4
主要介绍了 Java 向上转型和向下转型的详解的相关资料,需要的朋友可以参考下
向下转型和instanceof运算符的应用.pdf
289.287.JAVA基础教程_面向对象(中)-向下转型的几个常见问题(289).rar
计算机后端-Java-Java核心基础-第14章 面向对象06 06. 向下转型的几个常见问题.avi
Java基础精品课12-抽象类录屏1.向下转型和向上转型.mp4
向下转型 Downcasting 马克-to-win java视频的详细描述
主要介绍了Java 转型(向上或向下转型)详解及简单实例的相关资料,需要的朋友可以参考下
《与大象共舞-向IBM学习转型》,值得管理者学习的资料。
主要介绍了浅谈Java向下转型的意义,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
《华为企业数字化转型之道.pdf》
大数据背景下企业财务会计向管理会计转型研究.pdf