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 ● 同一基类的不同子类可以被视为同一类型 ( 基类 ) ● 放宽类型一致性 ● 简化接口 c l a s s A { … } c l a s s A { … } c l a s s B { … } c l a s s B e x t e n d s A { … } A a = n e w A ( ) ; A a = n e w A ( ) ; B b = n e w B ( ) ; B b = n e w B ( ) ; / / A a = n e w B ( ) ; c o m p i l e e r r o r A a = n e w B ( ) ; / / u p c a s t i n g
● 复习 – 多态 c l a s s I n s t r u m e n t { p u b l i c c l a s s M u s i c { p u b l i c v o i d p l a y ( i n t n o t e ) { p u b l i c s t a t i c v o i d t u n e ( I n s t r u m e n t i ) { S y s t e m . o u t . p r i n t l n ( “ I n s t r u m e n t . p l a y ( ) ” + n ) ; i . p l a y ( ) ; } } } p u b l i c s t a t i c v o 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 o 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 o r n = n e w B r a s s ( ) ; 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 { t u n e ( fl u t e ) ; p u b l i c v o i d p l a y ( i n t n o t e ) { t u n e ( v i o l i n ) ; S y s t e m . o u t . p r i n t l n ( “ Wi n d . p l a y ( ) ” + n ) ; t u n e ( f r e n c h H o r 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 o i d p l a y ( i n t n o t e ) { S y s t e m . o u t . p r i n t l n ( “ S t r i n g e d . p l a y ( ) ” + n ) ; } } 多态 ( P o l y m o r p h i s m ) 参数 I 可以代表不同的子类 , 并能 n s t r u m e n t i 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 o i d p l a y ( i n t n o t e ) { S y s t e m . o u t . p r i n t l n ( “ B r a s s . p l a y ( ) ” + n ) ; } }
● 复习 – 静态绑定 ● 函数的调用在编译后便确定 , 也称为 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 – I n s t r u m e n t : p l a y ( ) p l a y ( ) ● 子类重写父类的方法 – Wi n d : p l a y ( ) Wi n d S t r i n g e d B r a s s p l a y ( ) p l a y ( ) 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 ( ) 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 o 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 o 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 o 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 o r n = n e w B r a s s ( ) ; t u n e ( fl u t e ) ; t u n e ( v i o l i n ) ; t u n e ( f r e n c h H o 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 ( ) Wi n d S t r i n g e d B r a s s p l a y ( ) p l a y ( ) p l a y ( )
抽象类 ● 抽象方法 ( a b s t r a c t m e t h o d ) – 仅提供方法的名称 , 参数和返回值 – 没有具体实现 – 使用 a 关键字 b s t r a c t c l a s s I n s t r u m e n t { 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 o i d p l a y ( i n t n o t e ) { p u b l i c a b s t r a c t v o i d p l a y ( i n t n o t e ) ; S y s t e m . o 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 ) – 包含抽象方法的类称为抽象类
抽象类 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 o i d p l a y ( i n t n o 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 o i d p l a y ( i n t n o t e ) { S y s t e m . o 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 o i d p l a y ( i n t n o t e ) { S y s t e m . o 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 o i d p l a y ( i n t n o t e ) { S y s t e m . o 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 o i d p l a y ( i n t n o t e ) ; } c l a s s T e s t { p u b l i c s t a t i c v o 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 o m p i l e e r r o r : c a n n o t c r e a t e i n s t a n c e s o 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 o i d p l a y ( ) ; S t r i n g w h a t ( ) { / * … * / } e x t e n d s Wi n d S t r i n g e d P e r c u s s i o n v o i d p l a y ( ) v o i d p l a y ( ) v o i d p l a y ( ) S t r i n g w h a t ( ) S t r i n g w h a t ( ) S t r i n g w h a t ( ) e x t e n d s Wo o d w i n d B r a s s v o i d p l a y ( ) v o i d p l a y ( ) S t r i n g w h a t ( ) S t r i n g w h a t ( )
Recommend
More recommend