|
| 1 | +package com.practise2; |
| 2 | + |
| 3 | +/* |
| 4 | +01.明确引用类型与对象类型的概念 |
| 5 | +
|
| 6 | +首先,明确引用类型与对象类型的概念 |
| 7 | +在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad |
| 8 | +对象是有类型的, 是ADHero |
| 9 | +引用也是有类型的,是ADHero |
| 10 | +通常情况下,引用类型和对象类型是一样的 |
| 11 | +接下来要讨论的类型转换的问题,指的是引用类型和对象类型不一致的情况下的转换问题 |
| 12 | +package charactor; |
| 13 | +public class Hero { |
| 14 | + public String name; |
| 15 | + protected float hp; |
| 16 | + public static void main(String[] args) { |
| 17 | + ADHero ad = new ADHero(); |
| 18 | + } |
| 19 | +} |
| 20 | +* */ |
| 21 | + |
| 22 | +/* ---------------------->01.子类转父类(向上转型):所有的子类转换为父类,都是说得通的 |
| 23 | +所谓的转型,是指当引用类型和对象类型不一致的时候,才需要进行类型转换 |
| 24 | +类型转换有时候会成功,有时候会失败 |
| 25 | +到底能否转换成功? 教大家一个很简单的判别办法 |
| 26 | +把右边的当做左边来用,看说得通不? |
| 27 | +Hero h = new Hero(); |
| 28 | +ADHero ad = new ADHero(); |
| 29 | +h = ad; |
| 30 | +
|
| 31 | +右边ad引用所指向的对象的类型是 物理攻击英雄 |
| 32 | +左边h引用的类型是 普通英雄 |
| 33 | +把物理攻击英雄 当做 普通英雄,说不说得通? 说得通,就可以转 |
| 34 | +
|
| 35 | +所有的子类转换为父类,都是说得通的。比如你身边的例子: |
| 36 | +苹果手机 继承了 手机,把苹果手机当做普通手机使用 |
| 37 | +怡宝纯净水 继承了 饮品, 把怡宝纯净水 当做饮品来使用 |
| 38 | +
|
| 39 | +package charactor; |
| 40 | +
|
| 41 | +public class Hero { |
| 42 | + public String name; |
| 43 | + protected float hp; |
| 44 | +
|
| 45 | + public static void main(String[] args) { |
| 46 | +
|
| 47 | + Hero h = new Hero(); |
| 48 | +
|
| 49 | + ADHero ad = new ADHero(); |
| 50 | +
|
| 51 | + //类型转换指的是把一个引用所指向的对象的类型,转换为另一个引用的类型 |
| 52 | +
|
| 53 | + //把ad引用所指向的对象的类型是ADHero |
| 54 | + //h引用的类型是Hero |
| 55 | + //把ADHero当做Hero使用,一定可以 |
| 56 | + h = ad; |
| 57 | + } |
| 58 | +} |
| 59 | +
|
| 60 | +**/ |
| 61 | +public class p02typeConversion { |
| 62 | + |
| 63 | +} |
| 64 | + |
| 65 | + |
| 66 | + |
| 67 | +//------------>02.父类转子类(向下转型) |
| 68 | +/* |
| 69 | +父类转子类,有的时候行,有的时候不行,所以必须进行强制转换。 |
| 70 | +强制转换的意思就是 转换有风险,风险自担。 |
| 71 | +
|
| 72 | +01.什么时候行呢? |
| 73 | +Hero h =new Hero(); |
| 74 | +ADHero ad = new ADHero(); |
| 75 | +h = ad; //line 3 |
| 76 | +ad = (ADHero) h; |
| 77 | +
|
| 78 | +第3行,是子类转父类,一定可以的 |
| 79 | +第4行,就是父类转子类,所以要进行强转。 |
| 80 | +h这个引用,所指向的对象是ADHero, 所以第4行,就会把ADHero转换为ADHero,就能转换成功。 |
| 81 | +
|
| 82 | +
|
| 83 | +02.什么时候转换不行呢? |
| 84 | +1. Hero h =new Hero(); |
| 85 | +2. ADHero ad = new ADHero(); |
| 86 | +3. Support s =new Support(); |
| 87 | +4. h = s; |
| 88 | +5. ad = (ADHero)h; |
| 89 | +
|
| 90 | +第4行,是子类转父类,是可以转换成功的 |
| 91 | +第5行,是把h引用所指向的对象 Support,转换为ad引用的类型ADHero。 从语义上讲,把物理攻击英雄,当成辅助英雄来用,说不通,所以会强制转换失败,并且抛出异常 |
| 92 | +
|
| 93 | +03.实例: |
| 94 | +package charactor; |
| 95 | +
|
| 96 | +import charactor1.Support; |
| 97 | +
|
| 98 | +public class Hero { |
| 99 | + public String name; |
| 100 | + protected float hp; |
| 101 | +
|
| 102 | + public static void main(String[] args) { |
| 103 | + Hero h =new Hero(); |
| 104 | + ADHero ad = new ADHero(); |
| 105 | + Support s =new Support(); |
| 106 | +
|
| 107 | + h = ad; //line 14 |
| 108 | + ad = (ADHero) h; //line 15: h引用有可能指向一个ad对象,也有可能指向一个support对象,所以把h引用转换成AD类型的时候,就有可能成功,有可能失败 |
| 109 | + h = s; //line 16:16行:把一个support对象当做Hero使用,一定可以,转换之后,h引用指向一个support对象 |
| 110 | + ad = (ADHero)h; //17行:这个时候,h指向的是一个support对象,所以转换成ADHero类型,会失败。失败的表现形式是抛出异常 ClassCastException 类型转换异常 |
| 111 | + } |
| 112 | +} |
| 113 | +
|
| 114 | +14行: 把ad当做Hero使用,一定可以 |
| 115 | +转换之后,h引用指向一个ad对象 |
| 116 | +15行: h引用有可能指向一个ad对象,也有可能指向一个support对象 |
| 117 | +所以把h引用转换成AD类型的时候,就有可能成功,有可能失败 |
| 118 | +因此要进行强制转换,换句话说转换后果自负 |
| 119 | +到底能不能转换成功,要看引用h到底指向的是哪种对象 |
| 120 | +在这个例子里,h指向的是一个ad对象,所以转换成ADHero类型,是可以的 |
| 121 | +16行:把一个support对象当做Hero使用,一定可以 |
| 122 | +转换之后,h引用指向一个support对象 |
| 123 | +17行:这个时候,h指向的是一个support对象,所以转换成ADHero类型,会失败。 |
| 124 | +失败的表现形式是抛出异常 ClassCastException 类型转换异常 |
| 125 | +* */ |
| 126 | + |
| 127 | + |
| 128 | + |
| 129 | + |
| 130 | +//---------------->03.实现类转换成接口(向上转型) |
| 131 | +/* |
| 132 | +引用ad指向的对象是ADHero类型,这个类型实现了AD接口 |
| 133 | +10行: 把一个ADHero类型转换为AD接口 |
| 134 | +从语义上来讲,把一个ADHero当做AD来使用,而AD接口只有一个physicAttack方法,这就意味着转换后就有可能要调用physicAttack方法,而ADHero一定是有physicAttack方法的,所以转换是能成功的。 |
| 135 | +
|
| 136 | +package charactor; |
| 137 | +public class Hero { |
| 138 | + public String name; |
| 139 | + protected float hp; |
| 140 | + public static void main(String[] args) { |
| 141 | + ADHero ad = new ADHero(); |
| 142 | + AD adi = ad; //line 10 |
| 143 | + } |
| 144 | +} |
| 145 | +* */ |
| 146 | + |
| 147 | + |
| 148 | + |
| 149 | +//------------------>04.接口转换成实现类(向下转型) |
| 150 | +/* |
| 151 | +10行: ad引用指向ADHero, 而adi引用是接口类型:AD,实现类转换为接口,是向上转型,所以无需强制转换,并且一定能成功 |
| 152 | +12行: adi实际上是指向一个ADHero的,所以能够转换成功 |
| 153 | +14行: adi引用所指向的对象是一个ADHero,要转换为ADAPHero就会失败。 |
| 154 | +
|
| 155 | +package charactor; |
| 156 | +
|
| 157 | +public class Hero { |
| 158 | + public String name; |
| 159 | + protected float hp; |
| 160 | +
|
| 161 | + public static void main(String[] args) { |
| 162 | + ADHero ad = new ADHero(); |
| 163 | +
|
| 164 | + AD adi = ad; //line 10 |
| 165 | +
|
| 166 | + ADHero adHero = (ADHero) adi; //line 12 |
| 167 | +
|
| 168 | + ADAPHero adapHero = (ADAPHero) adi; //line 14 |
| 169 | + adapHero.magicAttack(); |
| 170 | + } |
| 171 | +} |
| 172 | +* */ |
0 commit comments