Skip to content

Commit 3886aed

Browse files
committed
testdefe
1 parent 61a91dc commit 3886aed

File tree

11 files changed

+972
-0
lines changed

11 files changed

+972
-0
lines changed
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
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+
* */

src/com/practise2/p03override.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.practise2;
2+
3+
/*重写概念:
4+
子类可以继承父类的对象方法.在继承后,重复提供该方法,就叫做方法的重写
5+
* */
6+
public class p03override {
7+
String name;
8+
int price;
9+
10+
public void buy(){
11+
System.out.println("购买");
12+
}
13+
public void effect() {
14+
System.out.println("物品使用后,可以有效果");
15+
}
16+
//02.step 02
17+
/*
18+
调用就会执行重写的方法,而不是从父类的方法
19+
所以LifePotion的effect会打印:
20+
"血瓶使用后,可以回血"
21+
* */
22+
public static void main(String[] args) {
23+
p03override i = new p03override();
24+
i.effect();
25+
LifePotion lp =new LifePotion();
26+
lp.effect();
27+
}
28+
}
29+
//01.step 01
30+
//**子类LifePotion继承p03override,同时也提供了方法effect
31+
class LifePotion extends p03override{
32+
public void effect(){
33+
System.out.println("血瓶使用后,可以回血");
34+
}
35+
}
36+

src/com/practise2/p04_duoTai.java

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.practise2;
2+
3+
/*
4+
类的多态现象:
5+
1. i1和i2都是Item类型
6+
2. 都调用effect方法
7+
3. 输出不同的结果
8+
多态: 都是同一个类型,调用同一个方法,却能呈现不同的状态
9+
* */
10+
public class p04_duoTai {
11+
String name;
12+
int price;
13+
public void buy(){
14+
System.out.println("购买");
15+
}
16+
public void effect() {
17+
System.out.println("物品使用后,可以有效果 ");
18+
}
19+
public static void main(String[] args) {
20+
p04_duoTai i1= new LifePotion2();
21+
p04_duoTai i2 = new MagicPotion();
22+
System.out.print("i1 是p04_duoTai类型,执行effect打印:");
23+
i1.effect();
24+
System.out.print("i2也是p04_duoTai类型,执行effect打印:");
25+
i2.effect();
26+
}
27+
/*
28+
i1 是Item类型,执行effect打印:血瓶使用后,可以回血
29+
i2也是Item类型,执行effect打印:蓝瓶使用后,可以回魔法
30+
* */
31+
}
32+
class LifePotion2 extends p04_duoTai {
33+
public void effect(){
34+
System.out.println("血瓶使用后,可以回血");
35+
}
36+
}
37+
class MagicPotion extends p04_duoTai{
38+
39+
public void effect(){
40+
System.out.println("蓝瓶使用后,可以回魔法");
41+
}
42+
}
43+
44+
/*02.知识:
45+
要实现类的多态,需要如下条件
46+
1. 父类(接口)引用指向子类对象
47+
2. 调用的方法有重写
48+
* */
49+
50+
/*
51+
实例:
52+
如果物品的种类特别多,那么就需要设计很多的方法
53+
比如useArmor,useWeapon等等
54+
55+
这个时候采用多态来解决这个问题
56+
设计一个方法叫做useItem,其参数类型是Item:
57+
如果是使用血瓶,调用该方法
58+
如果是使用魔瓶,还是调用该方法
59+
无论英雄要使用什么样的物品,只需要一个方法即可
60+
package charactor;
61+
62+
import property.Item;
63+
import property.LifePotion;
64+
import property.MagicPotion;
65+
66+
public class Hero {
67+
public String name;
68+
protected float hp;
69+
70+
public void useItem(Item i){
71+
i.effect();
72+
}
73+
74+
public static void main(String[] args) {
75+
76+
Hero garen = new Hero();
77+
garen.name = "盖伦";
78+
79+
LifePotion lp =new LifePotion();
80+
MagicPotion mp =new MagicPotion();
81+
82+
garen.useItem(lp);
83+
garen.useItem(mp);
84+
}
85+
}
86+
* */

0 commit comments

Comments
 (0)