关于JAVA的Object类接收引用和对象向下转型关系的疑问
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JAVA的Object类接收引用和对象向下转型关系的疑问相关的知识,希望对你有一定的参考价值。
public class ObjectDemo public static void main(String args[]) int temp[] = 1,3,5,7,9; Object obj = temp; print(obj); public static void print(Object o) if(o instanceof int[]) int x[] = (int[])o; for(int i=0; i<x.length; i++) System.out.print(x[i] + "\t"); ;1.方法print(Object o)接收了obj后,为什么要进行instanceof的判断?(不判断也能正常执行)2.为什么必须将o装换成int[]类型? 不转就会报错,对转型这点,我不明白,求指教!
第一个问题:采用 instanceof进行判断 是之前牛人们的经验可以减少出异常的概率,毕竟起到过滤的作用。第二个问题:for循环只能在数组中取出元素,所以你构造了一个int ,现在数组有了对象哪里来呢?毛主席说过 万物皆对象,在object那里,既然是一个类那就是object一个子类,直接向下转型,把object的引用拖过来就可以了。本身这道题就是让你练习向下转型的,其实不转也可以,你给她把衣服都去掉照样可以运行
public class Sub
public static void main(String args[])
int temp[] = 1, 3, 5, 7, 9 ;
for (int i = 0; i < temp.length; i++)
System.out.print(temp[i] + "\t");
参考技术A 1.由于方法的目的是为了打印数组,所以先进行instanceof判断,是数组才打印,否则不打印。
2.转型是为了把数组的元素取出,把父类对象转成子类对象需要强制转换类型,不然它编译器还是认为它是一个Object而不是一个数组
java 多态二
一 多态-转型
多态的转型分为向上转型与向下转型两种:
向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式:
父类类型 变量名 = new 子类类型();
如:Person p = new Student();
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,
这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!
使用格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Student stu = (Student) p; //变量p 实际上指向Student对象
二 多态的好处与弊端
当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型。向上转型的
好处是隐藏了子类类型,提高了代码的扩展性。
但向上转型也有弊端,只能使用父类共性的内容,而无法使用子类特有功能,功能有限制。看如下代码
//描述动物类,并抽取共性eat方法 abstract class Animal { abstract void eat(); } // 描述狗类,继承动物类,重写eat方法,增加lookHome方法 class Dog extends Animal { void eat() { System.out.println("啃骨头"); } void lookHome() { System.out.println("看家"); } } // 描述猫类,继承动物类,重写eat方法,增加catchMouse方法 class Cat extends Animal { void eat() { System.out.println("吃鱼"); } void catchMouse() { System.out.println("抓老鼠"); } } public class Test { public static void main(String[] args) { Animal a = new Dog(); //多态形式,创建一个狗对象 a.eat(); // 调用对象中的方法,会执行狗类中的eat方法 // a.lookHome();//使用Dog类特有的方法,需要向下转型,不能直接使用 // 为了使用狗类的lookHome方法,需要向下转型 // 向下转型过程中,可能会发生类型转换的错误,即ClassCastException异常 // 那么,在转之前需要做健壮性判断 if( !a instanceof Dog){ // 判断当前对象是否是Dog类型 System.out.println("类型不匹配,不能转换"); return; } Dog d = (Dog) a; //向下转型 d.lookHome();//调用狗类的lookHome方法 } }
总结:
什么时候使用向上转型:
当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,
这时就可以使用向上转型。
如:Animal a = new Dog();
a.eat();
什么时候使用向下转型
当要使用子类特有功能时,就需要使用向下转型。
如:Dog d = (Dog) a; //向下转型
d.lookHome();//调用狗类的lookHome方法
向下转型的好处:可以使用子类特有功能。
弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。在转换之前必须做类型判断。
如:if( !a instanceof Dog){…}
三 多态举例
例一:毕老师和毕姥爷的故事
/* 描述毕老师和毕姥爷, 毕老师拥有讲课和看电影功能 毕姥爷拥有讲课和钓鱼功能 */ class 毕姥爷 { void 讲课() { System.out.println("政治"); } void 钓鱼() { System.out.println("钓鱼"); } } // 毕老师继承了毕姥爷,就有拥有了毕姥爷的讲课和钓鱼的功能, // 但毕老师和毕姥爷的讲课内容不一样,因此毕老师要覆盖毕姥爷的讲课功能 class 毕老师 extends 毕姥爷 { void 讲课() { System.out.println("Java"); } void 看电影() { System.out.println("看电影"); } } public class Test { public static void main(String[] args) { // 多态形式 毕姥爷 a = new 毕老师(); // 向上转型 a.讲课(); // 这里表象是毕姥爷,其实真正讲课的仍然是毕老师,因此调用的也是毕老师的讲课功能 a.钓鱼(); // 这里表象是毕姥爷,但对象其实是毕老师,而毕老师继承了毕姥爷,即毕老师也具有钓鱼功能 // 当要调用毕老师特有的看电影功能时,就必须进行类型转换 毕老师 b = (毕老师) a; // 向下转型 b.看电影(); } }
例二:
定义一个父类Animal eat方法 , 定义两个子类 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;
并且 重写eat方法
测试类中写一个方法,参数列表有一个参数Animla类型,
要求: 调用该方法分别传递Dog对象 和Cat 对象, 使用instanceof进行强转后调用eat,和他们的特有方法
public abstract class Animal { public abstract void eat(); }
public class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼"); } public void catchMouse(){ System.out.println("猫捉老鼠"); } }
public class Dog extends Animal { @Override public void eat() { System.out.println("狗吃骨头"); } public void keepHome(){ System.out.println("狗看家"); } }
public static void method(Animal a){ if(a instanceof Cat){ Cat c = (Cat)a; c.eat(); c.catchMouse(); }else if(a instanceof Dog){ Dog d = (Dog)a; d.eat(); d.keepHome(); } }
Cat c = new Cat(); Dog d = new Dog(); method(c); System.out.println("----------"); method(d); System.out.println("==========");
以上是关于关于JAVA的Object类接收引用和对象向下转型关系的疑问的主要内容,如果未能解决你的问题,请参考以下文章