O O P w i t h J a v a Y u a n b i n Wu c s @e c - - PowerPoint PPT Presentation
O O P w i t h J a v a Y u a n b i n Wu c s @e c - - PowerPoint PPT Presentation
O O P w i t h J a v a Y u a n b i n Wu c s @e c n u O O P w i t h J a v a P 3 9 r o j e c t 4 : 1 1 U p c a s t i n g
O O P w i t h J a v a
- 通知
– P
r
- j
e c t 4 : 1 1 月 3 日晚 9 点
- 复习
– U
p c a s t i n g
- 同一基类的不同子类可以被视为同一类型 (
基类 )
- 放宽类型一致性
- 简化接口
c l a s s A { … } c l a s s B e x t e n d s A { … } A a = n e w A ( ) ; B b = n e w B ( ) ; A a = n e w B ( ) ; / / u p c a s t i n g c l a s s A { … } c l a s s B { … } A a = n e w A ( ) ; B b = n e w B ( ) ; / / A a = n e w B ( ) ; c
- m
p i l e e r r
- r
- 复习
– 多态
c l a s s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ I n s t r u m e n t . p l a y ( ) ” + n ) ; } } p u b l i c c l a s s Wi n d e x t e n d s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ Wi n d . p l a y ( ) ” + n ) ; } } p u b l i c c l a s s S t r i n g e d e x t e n d s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ S t r i n g e d . p l a y ( ) ” + n ) ; } } p u b l i c c l a s s B r a s s e x t e n d s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ B r a s s . p l a y ( ) ” + n ) ; } } p u b l i c c l a s s M u s i c { p u b l i c s t a t i c v
- i
d t u n e ( I n s t r u m e n t i ) { i . p l a y ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { Wi n d fl u t e = n e w Wi n d ( ) ; S t r i n g e d v i
- l
i n = n e w S t r i n g e d ( ) ; B r a s s f r e n c h H
- r
n = n e w B r a s s ( ) ; t u n e ( fl u t e ) ; t u n e ( v i
- l
i n ) ; t u n e ( f r e n c h H
- r
n ) ; } }
多态 ( P
- l
y m
- r
p h i s m )
参数 I n s t r u m e n t i 可以代表不同的子类 , 并能 正确调用它们的方法 ( 即 , 有多种表现形态 )
- 复习
– 静态绑定
- 函数的调用在编译后便确定 ,
也称为 e a r l y b i n d i n g
- 优点 :
快速 , 易于 d e b u g , 缺点 : 接口繁琐
– 动态绑定
- 函数的调用在运行时才能确定 也称 l
a t e b i n d i n g
- 优点 :
接口简洁 缺点 : 函数调用需要额外开销
– J
a v a 中的所有方法都采用动态绑定 , 除了
- fi
n a l
- S
t a t i c
– 数据成员不动态绑定
O O P w i t h J a v a
- 抽象类
- 接口
– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :
工厂模式
抽象类
- 父类的方法
– I
n s t r u m e n t : p l a y ( )
- 子类重写父类的方法
– Wi
n d : p l a y ( )
– S
t r i n g e d : p l a y ( )
– B
r a s s : p l a y ( )
- 可扩展性
– 用户程序仅知父类方法 – 子类修改不会影响用户程序
I n s t r u m e n t
p l a y ( )
S t r i n g e d
p l a y ( )
B r a s s
p l a y ( )
Wi n d
p l a y ( )
p u b l i c c l a s s M u s i c { p u b l i c s t a t i c v
- i
d t u n e ( I n s t r u m e n t i ) { i . p l a y ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { Wi n d fl u t e = n e w Wi n d ( ) ; S t r i n g e d v i
- l
i n = n e w S t r i n g e d ( ) ; B r a s s f r e n c h H
- r
n = n e w B r a s s ( ) ; t u n e ( fl u t e ) ; t u n e ( v i
- l
i n ) ; t u n e ( f r e n c h H
- r
n ) ; } }
抽象类
- 如果所有子类都将重写该方法
– I
n s t r u m e n t : p l a y ( ) 是否还必要 ?
- 是否有机制 :
– 在父类中不指定该方法的具体实现 – 禁止调用父类的该方法
I n s t r u m e n t
p l a y ( )
S t r i n g e d
p l a y ( )
B r a s s
p l a y ( )
Wi n d
p l a y ( )
抽象类
- 抽象方法 (
a b s t r a c t m e t h
- d
)
– 仅提供方法的名称 ,
参数和返回值
– 没有具体实现 – 使用 a
b s t r a c t 关键字
c l a s s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ I n s t r u m e n t . p l a y ( ) ” + n ) ; } } a b s t r a c t c l a s s I n s t r u m e n t { p u b l i c a b s t r a c t v
- i
d p l a y ( i n t n
- t
e ) ; }
普通方法 抽象方法
抽象类
- 抽象类 (
a b s t r a c t c l a s s )
– 包含抽象方法的类称为抽象类
抽象类
- 抽象类
a b s t r a c t c l a s s I n s t r u m e n t { p u b l i c a b s t r a c t v
- i
d p l a y ( i n t n
- t
e ) ; } p u b l i c c l a s s Wi n d e x t e n d s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ Wi n d . p l a y ( ) ” + n ) ; } } p u b l i c c l a s s S t r i n g e d e x t e n d s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ S t r i n g e d . p l a y ( ) ” + n ) ; } } p u b l i c c l a s s B r a s s e x t e n d s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ B r a s s . p l a y ( ) ” + n ) ; } }
抽象类
- 是否能直接创建抽象类的对象 ?
– 否 – 抽象类是不完整的类 – 其中的抽象方法需要在子类补充完整 (
重写 ) 后才有 意义
抽象类
- 无法直接创建该类的对象
a b s t r a c t c l a s s I n s t r u m e n t { p u b l i c a b s t r a c t v
- i
d p l a y ( i n t n
- t
e ) ; } c l a s s T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { / / I n s t r u m e n t i n = n e w I n s t r u m e n t ( ) ; / / c
- m
p i l e e r r
- r
: c a n n
- t
c r e a t e i n s t a n c e s
- f
a n a b s t r a c t c l a s s } }
s u p e r 关键字?
抽象类
a b s t r a c t I n s t r u m e n t
a b s t r a c t v
- i
d p l a y ( ) ; S t r i n g w h a t ( ) { / * … * / }
S t r i n g e d P e r c u s s i
- n
Wi n d
v
- i
d p l a y ( ) S t r i n g w h a t ( ) v
- i
d p l a y ( ) S t r i n g w h a t ( ) v
- i
d p l a y ( ) S t r i n g w h a t ( )
B r a s s Wo
- d
w i n d
v
- i
d p l a y ( ) S t r i n g w h a t ( ) v
- i
d p l a y ( ) S t r i n g w h a t ( )
e x t e n d s e x t e n d s
a b s t r a c t c l a s s I n s t r u m e n t { p u b l i c a b s t r a c t v
- i
d p l a y ( i n t n
- t
e ) ; p u b l i c S t r i n g w h a t ( ) { r e t u r n “ I n s t r u m e n t ” ; } } a b s t r a c t c l a s s Wi n d e x t e n d s I n s t r u m e n t { p u b l i c a b s t r a c t v
- i
d p l a y ( i n t n
- t
e ) ; p u b l i c S t r i n g w h a t ( ) { r e t u r n “ Wi n d ” ; } } c l a s s S t r i n g e d e x t e n d s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ S t r i n g e d . p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ S t r i n g e d ” ; } } c l a s s P e r c u s s i
- n
e x t e n d s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ P e r c u s s i
- n
. p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ P e r c u s s i
- n
” ; } } p u b l i c c l a s s M u s i c { p u b l i c s t a t i c v
- i
d t u n e ( I n s t r u m e n t i ) { i . p l a y ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { Wi n d fl u t e = n e w Wi n d ( ) ; S t r i n g e d v i
- l
i n = n e w S t r i n g e d ( ) ; B r a s s f r e n c h H
- r
n = n e w B r a s s ( ) ; t u n e ( fl u t e ) ; t u n e ( v i
- l
i n ) ; t u n e ( f r e n c h H
- r
n ) ; } } c l a s s Wo
- d
w i n d e x t e n d s Wi n d { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ Wo
- d
w i n d . p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ Wo
- d
w i n d ” ; } } c l a s s B r a s s e x t e n d s Wi n d { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ B r a s s . p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ B r a s s ” ; } }
- 若子类没有重写父类中的抽象方法 ,
子类仍为抽象类
抽象类
- 总结
– 抽象类包含抽象方法 ,
只有方法名 , 参数 , 返回值 , 没有方法的实现
– 抽象类不能直接
直接实例化
– 若子类没有重写父类中的抽象方法 ,
子类仍为抽象类
接口
- 接口
– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :
工厂模式
接口
- 抽象类
– 抽象方法 – 普通方法
a b s t r a c t c l a s s I n s t r u m e n t { p u b l i c a b s t r a c t v
- i
d p l a y ( i n t n
- t
e ) ; p u b l i c S t r i n g w h a t ( ) { r e t u r n “ I n s t r u m e n t ” ; } }
接口
- 接口 (
I n t e r f a c e )
– “ 所有方法都是抽象方法” – 只有方法的名称 ,
参数和返回值
– 没有方法的实现
a b s t r a c t c l a s s I n s t r u m e n t { p u b l i c a b s t r a c t v
- i
d p l a y ( i n t n
- t
e ) ; p u b l i c a b s t r a c t S t r i n g w h a t ( ) ; } i n t e r f a c e I n s t r u m e n t { v
- i
d p l a y ( i n t n
- t
e ) ; S t r i n g w h a t ( ) ; }
≈
接口
- 继承
– 重用 (
c l a s s r e u s i n g )
- 子类重用父类的方法 /
数据
– u
p c a s t i n g 和多态
- 父类出现之处可用子类代替
- 能够调用正确的子类方法 (
动态绑定 )
- 接口
– 没有代码重用 ,
仅仅保留 u p c a s t i n g 和多态
接口
- 接口
– 所有实现该接口的类都具有接口提供的方法 – 任何使用该接口类型的方法 ,
都可以使用他的任何一 种实现
– 某种协议 (
p r
- t
- c
- l
)
接口
- 接口的实现
– 接口 :
方法长什么样 ?
– 实现 :
方法具体怎样工作 ?
接口
- 接口的实现
a b s t r a c t c l a s s I n s t r u m e n t { p u b l i c a b s t r a c t v
- i
d p l a y ( i n t n
- t
e ) ; p u b l i c a b s t r a c t S t r i n g w h a t ( ) ; } i n t e r f a c e I n s t r u m e n t { v
- i
d p l a y ( i n t n
- t
e ) ; S t r i n g w h a t ( ) ; }
c l a s s S t r i n g e d e x t e n d s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ S t r i n g e d . p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ S t r i n g e d ” ; } } c l a s s S t r i n g e d i m p l e m e n t s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ S t r i n g e d . p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ S t r i n g e d ” ; } }
继承 : 1 . e x t e n d s 关键字 2 . 父类 , 子类关系 3 . c l a s s , e x t e n d s 接口 : 1 . i m p l e m e n t s 关键字 2 . 接口 , 实现关系 3 . i n t e r f a c e , i m p l e m e n t s
i n t e r f a c e I n s t r u m e n t
v
- i
d p l a y ( ) ; S t r i n g w h a t ( ) ;
S t r i n g e d P e r c u s s i
- n
Wi n d
v
- i
d p l a y ( ) S t r i n g w h a t ( ) v
- i
d p l a y ( ) S t r i n g w h a t ( ) v
- i
d p l a y ( ) S t r i n g w h a t ( )
B r a s s Wo
- d
w i n d
v
- i
d p l a y ( ) S t r i n g w h a t ( ) v
- i
d p l a y ( ) S t r i n g w h a t ( )
i m p l e m e n t s e x t e n d s
i n t e r f a c e c l a s s I n s t r u m e n t { v
- i
d p l a y ( i n t n
- t
e ) ; S t r i n g w h a t ( ) ; } c l a s s Wi n d i m p l e m e n t s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ Wi n d . p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ Wi n d ” ; } } c l a s s S t r i n g e d i m p l e m e n t s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ S t r i n g e d . p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ S t r i n g e d ” ; } } c l a s s P e r c u s s i
- n
i m p l e m e n t s I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ P e r c u s s i
- n
. p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ P e r c u s s i
- n
” ; } } p u b l i c c l a s s M u s i c { p u b l i c s t a t i c v
- i
d t u n e ( I n s t r u m e n t i ) { i . p l a y ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { Wi n d fl u t e = n e w Wi n d ( ) ; S t r i n g e d v i
- l
i n = n e w S t r i n g e d ( ) ; B r a s s f r e n c h H
- r
n = n e w B r a s s ( ) ; t u n e ( fl u t e ) ; t u n e ( v i
- l
i n ) ; t u n e ( f r e n c h H
- r
n ) ; } } c l a s s Wo
- d
w i n d e x t e n d s Wi n d { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ Wo
- d
w i n d . p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ Wo
- d
w i n d ” ; } } c l a s s B r a s s e x t e n d s Wi n d { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) { S y s t e m .
- u
t . p r i n t l n ( “ B r a s s . p l a y ( ) ” + n ) ; } p u b l i c S t r i n g w h a t ( ) { r e t u r n “ B r a s s ” ; } }
- 普通类 ,
抽象类 , 接口
接口
- 接口
– 所有方法默认为 p
u b l i c
i n t e r f a c e I n s t r u m e n t { v
- i
d p l a y ( i n t n
- t
e ) ; S t r i n g w h a t ( ) ; } i n t e r f a c e I n s t r u m e n t { p u b l i c v
- i
d p l a y ( i n t n
- t
e ) ; p u b l i c S t r i n g w h a t ( ) ; }
接口
- 接口
– 所有数据默认为 fi
n a l s t a t i c
– 定义常量
i n t e r f a c e We e k { i n t M O N D A Y = 1 ; i n t T U E S D A Y = 2 ; i n t WE D N E S D A Y = 3 ; i n t T H U R S D A Y = 4 ; i n t F R I D A Y = 5 ; i n t S A T U R D A Y = 6 ; i n t S U N D A Y = 7 ; } c l a s s We e k { p u b l i c s t a t i c fi n a l i n t M O N D A Y = 1 ; p u b l i c s t a t i c fi n a l i n t T U E S D A Y = 2 ; p u b l i c s t a t i c fi n a l i n t WE D N E S D A Y = 3 ; p u b l i c s t a t i c fi n a l i n t T H U R S D A Y = 4 ; p u b l i c s t a t i c fi n a l i n t F R I D A Y = 5 ; p u b l i c s t a t i c fi n a l i n t S A T U R D A Y = 6 ; p u b l i c s t a t i c fi n a l i n t S U N D A Y = 7 ; }
接口
- 接口
– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :
工厂模式
接口
- 一个类实现多个接口
I n t e r f a c e B
- a
t I n t e r f a c e P l a n e
v
- i
d fl y ( ) v
- i
d s a i l ( )
S e a p l a n e
v
- i
d fl y ( ) v
- i
d s a i l ( )
i m p l e m e n t s
接口
- 一个类实现多接口
i n t e r f a c e P l a n e { v
- i
d fl y ( ) ; } i n t e r f a c e B
- a
t { v
- i
d s a i l ( ) ; } c l a s s S e a p l a n e i m p l e m e n t s P l a n e , B
- a
t { p u b l i c v
- i
d fl y ( ) { S y s t e m .
- u
t . p r i n t l n ( “ F l y ! ” ) ; } p u b l i c v
- i
d s a i l ( ) { S y s t e m .
- u
t . p r i n t l n ( “ S a i l ! ” ) ; } }
接口
- 问题 :
– 如果将接口替换成普通类会如何 ?
I n t e r f a c e B
- a
t I n t e r f a c e P l a n e
v
- i
d fl y ( ) v
- i
d s a i l ( )
S e a p l a n e
v
- i
d fl y ( ) v
- i
d s a i l ( )
i m p l e m e n t s B
- a
t P l a n e
v
- i
d fl y ( ) v
- i
d s a i l ( )
S e a p l a n e
v
- i
d fl y ( ) v
- i
d s a i l ( )
e x t e n d s
?
接口
- 多继承问题
– D
i a m
- n
d p r
- b
l e m
B
- a
t P l a n e
v
- i
d f
- r
w a r d ( ) v
- i
d b a c k w a r d ( ) v
- i
d fl y ( ) v
- i
d f
- r
w a r d ( ) v
- i
d b a c k w a r d ( ) v
- i
d s a i l ( )
S e a p l a n e
v
- i
d f
- r
w a r d ( ) v
- i
d b a c k w a r d ( ) v
- i
d fl y ( ) v
- i
d s a i l ( )
T r a n s p
- r
t a t i
- n
v
- i
d f
- r
w a r d ( ) v
- i
d b a c k w a r d ( )
e x t e n d s e x t e n d s S e a p l a n e s = n e w S e a p l a n e ( ) ; / / s . f
- r
w a r d ( ) w h i c h
- n
e ?
接口
- 多继承问题
– 父类只能有一个普通类 /
抽象类
c l a s s A { … } c l a s s B { … } / * e r r
- r
c l a s s C e x t e n d s A , B { … } * /
接口
B a s e c l a s s m e t h
- d
s i n t e r f a c e 1 i n t e r f a c e 2 .
. .
i n t e r f a c e n A b s t r a c t
- r
C
- n
c r e t e B a s e c l a s s i n t e r f a c e 1 i n t e r f a c e 1 i n t e r f a c e 2 i n t e r f a c e n M e t h
- d
s
- f
t h e d e r i v e d c l a s s
i n t e r f a c e C a n F i g h t { v
- i
d fi g h t ( ) ; } i n t e r f a c e C a n S w i m { v
- i
d s w i m ( ) ; } i n t e r f a c e C a n F l y { v
- i
d fl y ( ) ; } c l a s s A c t i
- n
C h a r a c t e r { p u b l i c v
- i
d fi g h t ( ) { } } c l a s s H e r
- e
x t e n d s A c t i
- n
C h a r a c t e r i m p l e m e n t s C a n F i g h t , C a n S w i m , C a n F l y { p u b l i c v
- i
d fl y ( ) { } p u b l i c v
- i
d s w i m ( ) { } } p u b l i c c l a s s A d v e n t u r e { p u b l i c s t a t i c v
- i
d t ( C a n F i g h t x ) { x . fi g h t ( ) ; } p u b l i c s t a t i c v
- i
d u ( C a n S w i m x ) { x . s w i m ( ) ; } p u b l i c s t a t i c v
- i
d v ( C a n F l y x ) { x . fl y ( ) ; } p u b l i c s t a t i c v
- i
d w ( A c t i
- n
C h a r a c t e r x ) { x . fi g h t ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { H e r
- h
= n e w H e r
- (
) ; t ( h ) ; u ( h ) ; v ( h ) ; w ( h ) ; } }
1 . 实现多个接口可以 u p c a s t 到不同的类型
- fi
g h t ( ) ? 2 . a b s t r a c t c l a s s
- r
i n t e r f a c e ?
接口
- 实现多个接口
– 名字冲突
i n t e r f a c e I 1 { v
- i
d f ( ) ; } i n t e r f a c e I 2 { v
- i
d f ( ) ; } i n t e r f a c e I 3 { v
- i
d f ( i n t i ) ; } i n t e r f a c e I 4 { i n t f ( ) ; } c l a s s C 1 i m p l e m e n t s I 1 , I 2 { p u b l i c v
- i
d f ( ) { } } c l a s s C 2 i m p l e m e n t s I 1 , I 3 { p u b l i c v
- i
d f ( ) { } p u b l i c v
- i
d f ( i n t i ) { } } / * c
- m
p i l e e r r
- r
: r e t u r n t y p e i n c
- m
p a t i b l e c l a s s C 2 i m p l e m e n t s I 1 , I 4 { p u b l i c v
- i
d f ( ) { } } * /
接口
- 接口
– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :
工厂模式
接口
- 扩展接口
i n t e r f a c e A { … } i n t e r f a c e B e x t e n d s A { … } i n t e r f a c e D { … } i n t e r f a c e D e x t e n d s A , C { … }
i n t e r f a c e M
- n
s t e r { v
- i
d m e n a c e ( ) ; } i n t e r f a c e D a n g e r
- u
s M
- n
s t e r e x t e n d s M
- n
s t e r { v
- i
d d e s t r
- y
( ) ; } i n t e r f a c e L e t h a l { v
- i
d k i l l ( ) ; } p u b l i c c l a s s H
- r
r
- r
S h
- w
{ p u b l i c s t a t i c v
- i
d u ( M
- n
s t e r x ) { x . m e n a c e ( ) ; } p u b l i c s t a t i c v
- i
d v ( D a n g e r
- u
s M
- n
s t e r x ) { x . m e n a c e ( ) ; x . d e s t r
- y
( ) ; } p u b l i c s t a t i c v
- i
d w ( L e t h a l x ) { x . k i l l ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { D a n g e r
- u
s M
- n
s t e r m = D a n g e r
- u
s Z i l l a ( ) ; u ( m ) ; v ( m ) ; V a m p i r e a = V e r y B a d V a m p i r e ( ) ; u ( a ) ; v ( a ) ; w ( a ) ; } } c l a s s D r a g
- n
Z i l l a i m p l e m e n t s D a n g e r
- u
s M
- n
s t e r { p u b l i c v
- i
d m e n a c e ( ) { } p u b l i c v
- i
d d e s t r
- y
( ) { } } i n t e r f a c e V a m p i r e e x t e n d s D a n g e r
- u
s M
- n
s t e r , L e t h a l { v
- i
d d r i n k b l
- d
( ) ; } c l a s s V e r y B a d V a m p i r e i m p l e m e n t s V a m p i r e { p u b l i c v
- i
d m e n a c e ( ) { } p u b l i c v
- i
d d e s t r
- y
( ) { } p u b l i c v
- i
d k i l l ( ) { } p u b l i c v
- i
d d r i n k b l
- d
( ) { } }
接口
- 接口
– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :
工厂模式
接口
- 接口适配器 (
A d a p t e r )
– 方法 f
, 参数类型为 I n t e r f a c e 1
– 假设类 A已存在 ,
它没有实现 I n t e r f a c e 1 接口
– 希望方法 f
( ) 能处理类 A的对象
- 复用方法 f
( ) 的代码
i n t e r f a c e C a n F l y { v
- i
d fl y ( ) ; } c l a s s B i r d i m p l e m e n t s C a n F l y { p u b l i c v
- i
d fl y ( ) { } } c l a s s I n s e c t i m p l e m e n t s C a n F l y { p u b l i c v
- i
d fl y ( ) { } } c l a s s P e r s
- n
{ p u b l i c v
- i
d w a l k ( ) { } p u b l i c v
- i
d b u y T i c k e t ( ) { } p u b l i c v
- i
d t a k e F l i g h t ( ) { } }
c l a s s A d v e n t u r e { p u b l i c s t a t i c v
- i
d t r a v e l ( C a n F l y c ) { c . fl y ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { B i r d b = n e w B i r d ( ) ; I n s e c t i n s = n e w I n s e c t ( ) ; t r a v e l ( b ) ; t r a v e l ( i n s ) ; } }
?
i n t e r f a c e C a n F l y { v
- i
d fl y ( ) ; } c l a s s P e r s
- n
{ p u b l i c v
- i
d w a l k ( ) { } p u b l i c v
- i
d b u y T i c k e t ( ) { } p u b l i c v
- i
d t a k e F l i g h t ( ) { } } c l a s s P e r s
- n
A d a p t e r i m p l e m e n t s C a n F l y { p r i v a t e P e r s
- n
p ; p u b l i c P e r s
- n
A d a p t e r ( P e r s
- n
p ) { t h i s . p = p ; } p u b l i c v
- i
d fl y ( ) { p . b u y T i c k e t ( ) ; p . t a k e F l i g h t ( ) ; } }
c l a s s A d v e n t u r e { p u b l i c s t a t i c v
- i
d t r a v e l ( C a n F l y c ) { c . fl y ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { B i r d b = n e w B i r d ( ) ; I n s e c t i n s = n e w I n s e c t ( ) ; t r a v e l ( b ) ; t r a v e l ( i n s ) ; P e r s
- n
p = n e w P e r s
- n
( ) ; P e r s
- n
A d a p t e r p d = n e w P e r s
- n
A d a p t e r ( p ) ; t r a v e l ( p d ) ; } }
接口
- 接口适配器
– 通过增加一个接口的实现 ,
使得现有类能够被“适 配”到该接口
接口
- 接口适配器
E x i s t i n g c l a s s ( P e r s
- n
) E x i s t i n g i n t e r f a c e ( C a n F l y ) A d a p t e r ( P e r s
- n
A d a p t e r )
接口
- 接口
– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :
工厂模式
接口
- 应用 :
工厂模式
– 更灵活的构造对象方式
i n t e r f a c e S e r v i c e { v
- i
d m e t h
- d
1 ( ) ; v
- i
d m e t h
- d
2 ( ) ; } c l a s s I m p l 1 i m p l e m e n t s S e r v i c e { p u b l i c v
- i
d m e t h
- d
1 ( ) { S y s t e m .
- u
t . p r i n t l n ( “ I m p 1 . m e t h
- d
1 ” ) ; } p u b l i c v
- i
d m e t h
- d
2 ( ) { S y s t e m .
- u
t . p r i n t l n ( “ I m p 1 . m e t h
- d
2 ” ) ; } } c l a s s I m p l 2 i m p l e m e n t s S e r v i c e { p u b l i c v
- i
d m e t h
- d
1 ( ) { S y s t e m .
- u
t . p r i n t l n ( “ I m p 2 . m e t h
- d
1 ” ) ; } p u b l i c v
- i
d m e t h
- d
2 ( ) { S y s t e m .
- u
t . p r i n t l n ( “ I m p 2 . m e t h
- d
2 ” ) ; } } p u b l i c c l a s s T e s t S e r v i c e { p u b l i c s t a t i c v
- i
d c
- n
s u m e ( S e r v i c e s ) { s . m e t h
- d
1 ( ) ; s . m e t h
- d
2 ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { S e r v i c e s 1 = n e w I m p l 1 ( ) ; S e r v i c e s 2 = n e w I m p l 2 ( ) ; c
- n
s u m e ( s 1 ) ; c
- n
s u m e ( s 2 ) ; } }
当构造对象 / 初始化比较繁琐时 , 可以增加一层包装
i n t e r f a c e S e r v i c e { v
- i
d m e t h
- d
1 ( ) ; v
- i
d m e t h
- d
2 ( ) ; } c l a s s I m p l 1 i m p l e m e n t s S e r v i c e { p u b l i c v
- i
d m e t h
- d
1 ( ) { S y s t e m .
- u
t . p r i n t l n ( “ I m p 1 . m e t h
- d
1 ” ) ; } p u b l i c v
- i
d m e t h
- d
2 ( ) { S y s t e m .
- u
t . p r i n t l n ( “ I m p 1 . m e t h
- d
2 ” ) ; } } c l a s s I m p l 2 i m p l e m e n t s S e r v i c e { p u b l i c v
- i
d m e t h
- d
1 ( ) { S y s t e m .
- u
t . p r i n t l n ( “ I m p 2 . m e t h
- d
1 ” ) ; } p u b l i c v
- i
d m e t h
- d
2 ( ) { S y s t e m .
- u
t . p r i n t l n ( “ I m p 2 . m e t h
- d
2 ” ) ; } } i n t e r f a c e S e r v i c e F a c t
- r
y { S e r v i c e g e t S e r v i c e ( ) ; } c l a s s I m p l 1 F a c t
- r
y i m p l e m e n t s S e r v i c e F a c t
- r
y { p u b l i c S e r v i c e g e t S e r v i c e ( ) { r e t u r n n e w I m p l 1 ( ) ; } } c l a s s I m p l 2 F a c t
- r
y i m p l e m e n t s S e r v i c e F a c t
- r
y { p u b l i c S e r v i c e g e t S e r v i c e ( ) { r e t u r n n e w I m p l 2 ( ) ; } } p u b l i c c l a s s T e s t S e r v i c e { p u b l i c s t a t i c v
- i
d c
- n
s u m e ( S e r v i c e F a c t
- r
y s f ) { S e r v i c e s = s f . g e t S e r v i c e ( ) ; s . m e t h
- d
1 ( ) ; s . m e t h
- d
2 ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { S e r v i c e F a c t
- r
y s f 1 = n e w I m p l 1 F a c t
- r
y ( ) ; S e r v i c e F a c t
- r
y s f 2 = n e w I m p l 2 F a c t
- r
y ( ) ; c
- n
s u m e ( s f 1 ) ; c
- n
s u m e ( s f 2 ) ; } }
总结
- 抽象类
– 抽象方法 :
只给出方法的名字 , 参数 , 返回值 , 没有具体实现
– 抽象类 :
包含抽象方法的类
– a
b s t r a c t 关键字
- 接口
– “ 所有的方法都是抽象方法” – i
n t e r f a c e , i n p l e m e n t s 关键字
– 接口的扩展 :
e x t e n d s
– 实现多个接口 – 接口适配器