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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张金 中级黑马   /  2012-10-31 07:55  /  1728 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于面向对象中的强制类型转换需要这么理解。父类引用指向子类对象中,是不是父类对象传参调用子类对象独有的方法,就需要。还是有没有其他情况?向上转型和向下转型都有哪些情况。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

1 个回复

正序浏览
Java 语言的多态性机制导致了引用变量的声明类型和其实际引用对象的类型可能不一致,在结合虚方法调用规则可以得出下述结论:声明为同种类型的两个引用变量调用同一个方法时,也可能会有不同的行为。为更准确的鉴别一个对象的真正类型,java语言引入了instanceof操作符,其使用格式为:<引用类型变量>instanceof<引用类型>
这是boolean类型的表达式,当instanceof左侧的引用类型所引用的对象的实际类型是其右侧给出的类型或其子类类型时,整个表达式的结果为true,反之为false。
案例名称:instanceof关键字的使用
程序名称:InstanceOfTest.java
  1. class Person2 extends Object{}
  2. class Student2  extends Person2{}
  3. class Worker extends Person2{}
  4. public class InstanceOfTest {
  5.         public void method(Person2 e){
  6.                 if(e instanceof Person2){
  7.                         System.out.println("this is Students");
  8.                 }
  9.                 else if(e instanceof Worker){
  10.                         System.out.println("this is Worker");
  11.                 }
  12.                 else{
  13.                         System.out.println("this is a Person");
  14.                 }
  15.         }
  16.         public static void main(String[] args) {
  17.                 InstanceOfTest t=new InstanceOfTest();
  18.                 Worker w=new Worker();
  19.                 t.method(w);
  20.         }
  21. }
复制代码
程序解释:InstanceOfTest类的method1方法,根据传入的不同对象确定调用不同的语句,java基本类型的相互转换,包括自动类型转换和强制类型转换机制,java引用类型数据也存在类似的机制。
○1默认类型转换:子类类型的数据可以直接赋值给父类类型的引用变量。
○2强制类型转换:也称为对象造型,父类类型的数据可以被强制转换为其子类的类型。造型的语法格式为:(子类类型)父类类型数据,使用方法如程序CastingTest.java所示。
案例名称:强制类型转换
程序名称:CastingTest.java
  1. class Person3{
  2.         String name;
  3. }
  4. class Student3 extends Person3{
  5.         String school="pku";
  6.         public String getSchool(){
  7.                 return school;
  8.         }
  9. }
  10. public class CastingTest {
  11.         public void method(Person3 e){
  12.                 //System.out.println(e.getSchool());//非法
  13.                 if(e instanceof Student3){
  14.                         Student3 me=(Student3)e;
  15.                         System.out.println(me.getSchool());
  16.                 }
  17.         }
  18.         public static void main(String[] args) {
  19.                 CastingTest t=new CastingTest();
  20.                 Student3 m=new Student3();
  21.                 t.method(m);
  22.         }
  23. }
复制代码
程序解释:语句t.method(m)中的m是Student3的实例,method方法的参数“method(Person3e)”因此吗赋值给了Person3声明的变量。因此方法getSchool()没有在父类Person3中定义,因此不能直接调用,使用前需要竞夺强制转换。
强制转换是还需要注意一次额问题:
        无继承关系的引用类型间的转换是非法的,编译时会出错;
        并不是任意的父类类型数据都可以被造型为子类类型,在造型前可以使用instanceof操作符测试一个对象的类型,以避免运行是出错。
这写的挺不错的转来给你看看

点评

顶。  发表于 2012-10-31 10:29

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马