第10章 接口、继承与多态----对象类型的转换
2015-05-26 22:17
197 查看
向上转型:
将子类对象看作是父类对象;
解释:平行四边形是四边形的一种,那么就可以将平行四边形对象看作是一个四边形对象。例如:鸡是家禽的一种,而家禽是动物中的一类,那么也可以将鸡对象看作是一个动物对象。
向下转型:
将抽象类转换为较具体的类,这样的转型通常会出现问题,例如,不能说四边形是平行四边形的一种、所有的鸟都是鸽子等。可以说子类对象总是父类的一个实例,但父类对象不一定是子类的实例。
备注: 当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生 ClassCastException异常,所以在执行向下转型之前,先要判断父类对象是否为子类对象的实例。这个判断通常使用instanceof操作符来完成。
myobject instanceof ExampleClass
myobject:某类的对象引用;ExampleClass:某个类
使用instanceof操作符的表达式返回值为布尔值。如果返回值是true,说明myobject对象为ExampleClass的实例对象反之。
将子类对象看作是父类对象;
解释:平行四边形是四边形的一种,那么就可以将平行四边形对象看作是一个四边形对象。例如:鸡是家禽的一种,而家禽是动物中的一类,那么也可以将鸡对象看作是一个动物对象。
package ten; class Quadrange{//四边形类 public static void draw(Quadrange q){//四边形类中的方法 } } public class Parallelogram extends Quadrange{//平行四边形类,继承了四边形类 public static void main(String[] args){ Parallelogram p=new Parallelogram();//实例化平行四边形类对象引用 draw(p);//调用父类方法 } } 四边形类存在一个draw()方法,它的参数是Quadrange(四边形类)类型,而在平行四边形类的主方法中调用draw()时给予的参数类型是Parallelogram(平行四边形类)类型的。这就相当于“Quadrange obj=new Parallelogram();”就是把子类对象赋值给父类类型的变量。 试想一下正方形类对象可以作为draw()方法的参数,梯形类对象同样也可以作为draw()方法的参数,如果在四边形类的draw()方法中根据不同的图形对象设置不同的处理,就可以做到在父类中定义一个方法完成各个子类的功能,这样可以使同一份代码毫无差别地运用到不同类型之上,这就是多态机制的基本思想。
向下转型:
将抽象类转换为较具体的类,这样的转型通常会出现问题,例如,不能说四边形是平行四边形的一种、所有的鸟都是鸽子等。可以说子类对象总是父类的一个实例,但父类对象不一定是子类的实例。
package ten; class Quadrange{ public static void draw(Quadrange q){ } } public class Parallelogram2 extends Quadrange { public static void main(String[] args){ draw(new Parallelogram());//将平行四边形对象看作是四边形队形,称为向上转型操作 //向下转型 Quadrange q=new Parallelogram(); //Parallelogram p=q;将父类对象赋予子类对象,这种写法是错误的 Parallelogram p=(Parallelogram) q;//将父类对象赋予子类对象,并强制转换为子类型,这种写法是正确的 } } //备注:如果将父类对象对象直接赋予子类,会发生编译错误,因为父类对象不一定是子类的实例,例如:一个四边形不一定就是指平行四边形,它也许是梯形,也许是正方形等。
备注: 当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生 ClassCastException异常,所以在执行向下转型之前,先要判断父类对象是否为子类对象的实例。这个判断通常使用instanceof操作符来完成。
myobject instanceof ExampleClass
myobject:某类的对象引用;ExampleClass:某个类
使用instanceof操作符的表达式返回值为布尔值。如果返回值是true,说明myobject对象为ExampleClass的实例对象反之。
package ten; class Quadrangle{ public static void draw(Quadrangle q){ } } class Square extends Quadrange{ } class Anything{ } public class Parallelogram3 extends Quadrange { public static void main(String[] args){ Quadrange q=new Quadrange();//实例化父类对象 if(q instanceof Parallelogram3){ Parallelogram3 p=(Parallelogram3) q;//向下转型操作 } if(q instanceof Square){ Square s=(Square) q; } //System.out.println(q instanceof Anything); } }
相关文章推荐
- 继承,对象间的类型转换,接口,多态的代码案例,以及对自身的反思
- Java继承和多态===Java多态对象的类型转换
- 无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Word._Application”
- 多态、引用类型转换、抽象类、接口
- java学习:对象的类型转换、多态
- 解决 无法将类型为“Excel._Application的QueryInterface”的 COM 对象强制转换为接口类型
- 无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Wor
- 一切皆对象之两个方法概括js,无函数签名(无多态),原型,闭包,封装,引用类型,继承……
- 笔记:类和对象 接口、继承与多态
- 不懂类,对象,包,接口,继承,多态的C++高手
- java笔记之封装、继承、重写、多态以及类型转换
- Java学习第六_八天:面向对象__继承_接口_多态
- 类型转换与对象的多态认识
- 无法将类型为“*Class”的 COM 对象强制转换为接口类型 失败原因.
- 无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”。此操作失败的原因是对 IID 为“{000208D5 -0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。 (异常来 自 HRESULT:
- Java多态对象的类型转换
- java笔记之封装、继承、重写、多态以及类型转换
- 黑马程序员--------java面向对象 继承、接口、多态、Object类
- 第10章 接口、继承与多态----方法的重载
- 17. C# -- 对象,类,接口,继承,多态