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
SMART_READER_LITE
LIVE PREVIEW

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


slide-1
SLIDE 1

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

slide-2
SLIDE 2

O O P w i t h J a v a

  • 通知

– P

r

  • j

e c t 4 : 1 1 月 3 日晚 9 点

slide-3
SLIDE 3
  • 复习

– 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
slide-4
SLIDE 4
  • 复习

– 多态

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 可以代表不同的子类 , 并能 正确调用它们的方法 ( 即 , 有多种表现形态 )

slide-5
SLIDE 5
  • 复习

– 静态绑定

  • 函数的调用在编译后便确定 ,

也称为 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

– 数据成员不动态绑定

slide-6
SLIDE 6

O O P w i t h J a v a

  • 抽象类
  • 接口

– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :

工厂模式

slide-7
SLIDE 7

抽象类

  • 父类的方法

– 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 ) ; } }

slide-8
SLIDE 8

抽象类

  • 如果所有子类都将重写该方法

– 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 ( )

slide-9
SLIDE 9

抽象类

  • 抽象方法 (

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 ) ; }

普通方法 抽象方法

slide-10
SLIDE 10

抽象类

  • 抽象类 (

a b s t r a c t c l a s s )

– 包含抽象方法的类称为抽象类

slide-11
SLIDE 11

抽象类

  • 抽象类

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 ) ; } }

slide-12
SLIDE 12

抽象类

  • 是否能直接创建抽象类的对象 ?

– 否 – 抽象类是不完整的类 – 其中的抽象方法需要在子类补充完整 (

重写 ) 后才有 意义

slide-13
SLIDE 13

抽象类

  • 无法直接创建该类的对象

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 关键字?

slide-14
SLIDE 14

抽象类

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

slide-15
SLIDE 15

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 ” ; } }

  • 若子类没有重写父类中的抽象方法 ,

子类仍为抽象类

slide-16
SLIDE 16

抽象类

  • 总结

– 抽象类包含抽象方法 ,

只有方法名 , 参数 , 返回值 , 没有方法的实现

– 抽象类不能直接

直接实例化

– 若子类没有重写父类中的抽象方法 ,

子类仍为抽象类

slide-17
SLIDE 17

接口

  • 接口

– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :

工厂模式

slide-18
SLIDE 18

接口

  • 抽象类

– 抽象方法 – 普通方法

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 ” ; } }

slide-19
SLIDE 19

接口

  • 接口 (

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 ( ) ; }

slide-20
SLIDE 20

接口

  • 继承

– 重用 (

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 和多态

slide-21
SLIDE 21

接口

  • 接口

– 所有实现该接口的类都具有接口提供的方法 – 任何使用该接口类型的方法 ,

都可以使用他的任何一 种实现

– 某种协议 (

p r

  • t
  • c
  • l

)

slide-22
SLIDE 22

接口

  • 接口的实现

– 接口 :

方法长什么样 ?

– 实现 :

方法具体怎样工作 ?

slide-23
SLIDE 23

接口

  • 接口的实现

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

slide-24
SLIDE 24

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

slide-25
SLIDE 25

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 ” ; } }

  • 普通类 ,

抽象类 , 接口

slide-26
SLIDE 26

接口

  • 接口

– 所有方法默认为 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 ( ) ; }

slide-27
SLIDE 27

接口

  • 接口

– 所有数据默认为 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 ; }

slide-28
SLIDE 28

接口

  • 接口

– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :

工厂模式

slide-29
SLIDE 29

接口

  • 一个类实现多个接口

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

slide-30
SLIDE 30

接口

  • 一个类实现多接口

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 ! ” ) ; } }

slide-31
SLIDE 31

接口

  • 问题 :

– 如果将接口替换成普通类会如何 ?

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

?

slide-32
SLIDE 32

接口

  • 多继承问题

– 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 ?

slide-33
SLIDE 33

接口

  • 多继承问题

– 父类只能有一个普通类 /

抽象类

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 { … } * /

slide-34
SLIDE 34

接口

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

slide-35
SLIDE 35

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 ?

slide-36
SLIDE 36

接口

  • 实现多个接口

– 名字冲突

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 ( ) { } } * /

slide-37
SLIDE 37

接口

  • 接口

– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :

工厂模式

slide-38
SLIDE 38

接口

  • 扩展接口

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 { … }

slide-39
SLIDE 39

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

( ) { } }

slide-40
SLIDE 40

接口

  • 接口

– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :

工厂模式

slide-41
SLIDE 41

接口

  • 接口适配器 (

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

( ) 的代码

slide-42
SLIDE 42

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 ) ; } }

?

slide-43
SLIDE 43

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 ) ; } }

slide-44
SLIDE 44

接口

  • 接口适配器

– 通过增加一个接口的实现 ,

使得现有类能够被“适 配”到该接口

slide-45
SLIDE 45

接口

  • 接口适配器

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 )

slide-46
SLIDE 46

接口

  • 接口

– 定义 – 实现多个接口 – 扩展接口 – 接口适配器 – 应用 :

工厂模式

slide-47
SLIDE 47

接口

  • 应用 :

工厂模式

– 更灵活的构造对象方式

slide-48
SLIDE 48

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 ) ; } }

当构造对象 / 初始化比较繁琐时 , 可以增加一层包装

slide-49
SLIDE 49

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 ) ; } }

slide-50
SLIDE 50

总结

  • 抽象类

– 抽象方法 :

只给出方法的名字 , 参数 , 返回值 , 没有具体实现

– 抽象类 :

包含抽象方法的类

– 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

– 实现多个接口 – 接口适配器