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 2 9 r o j e c t 7 : 6 7 6 1 4 6 2 1 6


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 7 : 6 月 2 7 日晚 9 点

– 6

月 1 4 日复习

– 6

月 2 1 日考试

– 答疑

  • 6

月 2 日 1 3 : 0 – 1 5 : 0

  • 理科楼 B

9 1 1

slide-3
SLIDE 3
slide-4
SLIDE 4

a b s t r a c t c l a s s d e m

  • {

p u b l i c i n t a ; d e m

  • (

) { a = 1 ; } a b s t r a c t p u b l i c v

  • i

d s e t ( ) ; a b s t r a c t fi n a l p u b l i c v

  • i

d g e t ( ) ; } c l a s s T e s t e x t e n d s d e m

  • {

p u b l i c v

  • i

d s e t ( i n t a ) { t h i s . a = a ; } fi n a l p u b l i c v

  • i

d g e t ( ) { S y s t e m .

  • u

t . p r i n t l n ( " a = " + a ) ; } 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 ) { T e s t

  • b

j = n e w T e s t ( ) ;

  • b

j . s e t ( 2 ) ;

  • b

j . g e t ( ) ; } }

slide-5
SLIDE 5

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 ) { t r y { i n t a = ; S y s t e m .

  • u

t . p r i n t l n ( " a = " + a + " \ n " ) ; i n t b = 2 / a ; S y s t e m .

  • u

t . p r i n t l n ( " b = " + b ) ; } c a t c h ( A r i t h m e t i c E x c e p t i

  • n

e ) { S y s t e m .

  • u

t . p r i n t l n ( " D i v i d e b y z e r

  • e

r r

  • r

" ) ; } fi n a l l y { S y s t e m .

  • u

t . p r i n t l n ( " i n s i d e t h e fi n a l l y b l

  • c

k " ) ; } } }

slide-6
SLIDE 6

p u b l i c c l a s s T e s t { p r i v a t e i n t x = 1 ; p r i v a t e i n t y = 2 ; p r i v a t e s t a t i c i n t z = 3 ; 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 t x = 4 ; i n t y = 5 ; i n t z = 6 ; n e w T e s t ( ) . n e w I n n e r ( ) . i n i t ( ) ; } c l a s s I n n e r { v

  • i

d i n i t ( ) { S y s t e m .

  • u

t . p r i n t l n ( x + " " + y + " " + z ) ; } } }

slide-7
SLIDE 7

i n t e r f a c e F

  • {

i n t x = 1 ; } p u b l i c 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 ) { F

  • .

x = 2 ; S y s t e m .

  • u

t . p r i n t l n ( F

  • .

x ) ; } }

slide-8
SLIDE 8

1 . 定义一个 L i n k e d L i s t , 其中包含 S t r i n g 对象 . 2 . 编写方法遍历该 L i n k e d L i s t .

slide-9
SLIDE 9
  • 复习
  • I

/ O 流

– I

n p u t S t r e a m / R e a d e r

  • r

e a d ( )

– O

u t p u t S t r e a m / Wr i t e r

  • w

r i t e ( )

– 抽象 :

数据的来源 / 数据的目的地

  • B

y t e A r r a y S t r e a m , F i l e S t r e a m S t r i n g S t r e a m O b j e c t S t r e a m

slide-10
SLIDE 10

i m p

  • r

t j a v a . i

  • .

F i l e I n p u t S t r e a m ; i m p

  • r

t j a v a . i

  • .

F i l e O u t p u t S t r e a m ; i m p

  • r

t j a v a . i

  • .

I O E x c e p t i

  • n

; p u b l i c c l a s s C

  • p

y B y t e s { 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 ) t h r

  • w

s I O E x c e p t i

  • n

{ F i l e I n p u t S t r e a m i n = n u l l ; F i l e O u t p u t S t r e a m

  • u

t = n u l l ; t r y { i n = n e w F i l e I n p u t S t r e a m ( " x a n a d u . t x t " ) ;

  • u

t = n e w F i l e O u t p u t S t r e a m ( "

  • u

t a g a i n . t x t " ) ; i n t c ; w h i l e ( ( c = i n . r e a d ( ) ) ! =

  • 1

)

  • u

t . w r i t e ( c ) ; } fi n a l l y { i f ( i n ! = n u l l ) i n . c l

  • s

e ( ) ; i f (

  • u

t ! = n u l l )

  • u

t . c l

  • s

e ( ) ; } } }

slide-11
SLIDE 11
  • 装饰器

– F

i l t e r I n p u t S t r e a m / F i l t e r O u t p u t S t r e a m

  • B

u ff e r e d I n p u t S t r e a m

  • D

a t a I n p u t S t r e a m

F i l e I n p u t S t r e a m fi n = n e w F i l e I n p u t S t r e a m ( " x a n a d u . t x t " ) ; B u ff e r e d I n p u t S t r e a m b f = n e w B u ff e r e d I n p u t S t r e a m ( fi n ) ; D a t a I n p u t S t r e a m d i n = n e w D a t a I n p u t S t r e a m ( b f ) ; d i n . r e a d ( ) ; d i n . r e a d I n t ( ) ; d i n . r e a d D

  • u

b l e ( ) ; F i l e O u t p u t S t r e a m f

  • u

t = n e w F i l e O u t p u t S t r e a m ( " x a n a d u . t x t " ) ; B u ff e r e d O u t p u t S t r e a m b f = n e w B u ff e r e d O u t p u t S t r e a m ( f

  • u

t ) ; D a t a O u t p u t S t r e a m d

  • u

t = n e w D a t a O u t p u t S t r e a m ( b f ) ; d

  • u

t . w r i t e ( 1 ) ; d

  • u

t . w r i t e I n t ( 1 ) ; d

  • u

t . w r i t e D

  • u

b l e ( 3 . 1 4 ) ;

slide-12
SLIDE 12
  • 复习

I n p u t S t r e a m F i l t e r I n p u t S t r e a m

B u ff e r d I n p u t S t r e a m D a t a I n p u t S t r e a m S t r i n g B u ff e r I n p u t S t r e a m F i l e I n p u t S t r e a m B y t e A r r a y I n p u t S t r e a m

装饰器

slide-13
SLIDE 13

O O P w i t h J a v a

  • 运行时类型信息
  • 泛型
slide-14
SLIDE 14

R T T I

  • 运行时类型信息

– R

u n T i m e T y p e I n f

  • r

m a t i

  • n

( R T T I )

– C

l a s s 类

  • 每一个类都包含一个 C

l a s s 类的对象

  • 该对象包含该类的信息

– 类名字 – 类的有哪些方法 – 类的有哪些成员

slide-15
SLIDE 15

R T T I

  • 每个类的静态成员

– 所有对象共享一个 C

l a s s 对象

  • 每个对象调用 g

e t C l a s s ( ) 获得 C l a s s 类的对象

– S

t r i n g s = “ h e l l

; C l a s s c = s . g e t C l a s s ( ) ;

  • 每个类通过 .

c l a s s 获得 C l a s s 类的对象

– C

l a s s c = S t r i n g . c l a s s

slide-16
SLIDE 16

R T T I

  • C

l a s s 类的方法

– g

e t N a m e ( )

– g

e t I n t e r f a c e s ( )

– g

e t S u p e r c l a s s ( )

– n

e w I n s t a n c e ( )

slide-17
SLIDE 17

i n t e r f a c e A { } i n t e r f a c e B { } i n t e r f a c e C { } c l a s s T

  • y

{ T

  • y

( ) { } T

  • y

( i n t i ) { } } c l a s s F a n c y T

  • y

e x t e n d s T

  • y

i m p l e m e n t s A , B , C { F a n c y T

  • y

( ) { s u p e r ( 1 ) ; } } p u b l i c c l a s s T

  • y

T e s t { s t a t i c v

  • i

d p r i n t I n f

  • (

C l a s s c ) { S y s t e m .

  • u

t . p r i n t l n ( " C l a s s n a m e : " + c . g e t N a m e ( ) ) ; S y s t e m .

  • u

t . p r i n t l n ( “ I s i n t e r f a c e ? ” + c . i s I n t e r f a c e ( ) ) ; S y s t e m .

  • u

t . p r i n t l n ( " S i m p l e n a m e : " + c . g e t S i m p l e N a m e ( ) ) ; S y s t e m .

  • u

t . p r i n t l n ( " C a n

  • n

i c a l n a m e : " + c . g e t C a n

  • n

i c a l N a m e ( ) ) ; } 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 ) { C l a s s c = n u l l ; t r y { c = C l a s s . f

  • r

N a m e ( " F a n c y T

  • y

" ) ; } c a t c h ( C l a s s N

  • t

F

  • u

n d E x c e p t i

  • n

e ) { S y s t e m .

  • u

t . p r i n t l n ( " C a n ’ t fi n d F a n c y T

  • y

" ) ; S y s t e m . e x i t ( 1 ) ; } p r i n t I n f

  • (

c ) ; f

  • r

( C l a s s f a c e : c . g e t I n t e r f a c e s ( ) ) p r i n t I n f

  • (

f a c e ) ; C l a s s u p = c . g e t S u p e r c l a s s ( ) ; O b j e c t

  • b

j = n u l l ; t r y { / / R e q u i r e s d e f a u l t c

  • n

s t r u c t

  • r

:

  • b

j = u p . n e w I n s t a n c e ( ) ; } c a t c h ( I n s t a n t i a t i

  • n

E x c e p t i

  • n

e ) { S y s t e m .

  • u

t . p r i n t l n ( " C a n n

  • t

i n s t a n t i a t e " ) ; S y s t e m . e x i t ( 1 ) ; } c a t c h ( I l l e g a l A c c e s s E x c e p t i

  • n

e ) { S y s t e m .

  • u

t . p r i n t l n ( " C a n n

  • t

a c c e s s " ) ; S y s t e m . e x i t ( 1 ) ; } p r i n t I n f

  • (
  • b

j . g e t C l a s s ( ) ) ; } }

slide-18
SLIDE 18

R T T I

  • R

T T I 的用途

– 给定 O

b j e c t 引用 , 判断它的类型 ( D

  • w

n c a s t i n g )

S t r i n g s = n e w S t r i n g ( “ h e l l

) ; O b j e c t

  • =

s ; S t r i n g t y p e =

  • .

g e t C l a s s ( ) . g e t N a m e ( ) ; S t r i n g t = ( S t r i n g )

  • ;
slide-19
SLIDE 19

泛型

  • 容器

– n

e w A r r a y L i s t ( ) ;

c l a s s A p p l e { p r i v a t e s t a t i c l

  • n

g c

  • u

n t e r ; p r i v a t e fi n a l l

  • n

g i d = c

  • u

n t e r + + ; p u b l i c l

  • n

g i d ( ) { r e t u r n i d ; } } c l a s s O r a n g e { }

p u b l i c c l a s s A p p l e s A n d O r a n g e s Wi t h

  • u

t G e n e r i c s { 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 ) { A r r a y L i s t a p p l e s = n e w A r r a y L i s t ( ) ; f

  • r

( i n t i = ; i < 3 ; i + + ) a p p l e s . a d d ( n e w A p p l e ( ) ) ; / / N

  • t

p r e v e n t e d f r

  • m

a d d i n g a n O r a n g e t

  • a

p p l e s : a p p l e s . a d d ( n e w O r a n g e ( ) ) ; f

  • r

( i n t i = ; i < a p p l e s . s i z e ( ) ; i + + ) ( ( A p p l e ) a p p l e s . g e t ( i ) ) . i d ( ) ; / / O r a n g e i s d e t e c t e d

  • n

l y a t r u n t i m e } }

slide-20
SLIDE 20

泛型

  • 类型安全的容器

– n

e w A r r a y L i s t < A p p l e > ( ) ;

p u b l i c c l a s s A p p l e s A n d O r a n g e s Wi t h G e n e r i c s { 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 ) { A r r a y L i s t < A p p l e > a p p l e s = n e w A r r a y L i s t < A p p l e > ( ) ; f

  • r

( i n t i = ; i < 3 ; i + + ) a p p l e s . a d d ( n e w A p p l e ( ) ) ; / / C

  • m

p i l e e r r

  • r

! / / a p p l e s . a d d ( n e w O r a n g e ( ) ) ; f

  • r

( i n t i = ; i < a p p l e s . s i z e ( ) ; i + + ) a p p l e s . g e t ( i ) . i d ( ) ; } f

  • r

( A p p l e c : a p p l e s ) S y s t e m .

  • u

t . p r i n t l n ( c . i d ( ) ) ; }

slide-21
SLIDE 21

泛型

  • 不同类型间的相互替代 ?

– U

p c a s t i n g 与 多态

C l a s s A { } v

  • i

d f ( A a r g ) { / / … } f ( n e w A ( ) ) ; C l a s s A { } C l a s s B { } v

  • i

d f ( A a r g ) { / / … } f ( n e w B ( ) ) ; C l a s s A { } C l a s s B { } C l a s s C e x t e n d s A { } v

  • i

d f ( A a r g ) { / / … } f ( n e w C ( ) ) ;

slide-22
SLIDE 22

泛型

  • 不同类型间的相互替代 ?

– 泛型 :

更灵活的方式

slide-23
SLIDE 23

基本概念

  • 泛型 (

g e n e r i c s )

– 在定义类的成员和方法时 ,

类型为可变参数

v

  • i

d f ( ? a r g ) { / / … } c l a s s M y T y p e { ? m e m b e r = n u l l ; }

slide-24
SLIDE 24

基本概念

  • 语法

v

  • i

d f ( ? a r g ) { / / … } c l a s s M y T y p e { ? m e m b e r = n u l l ; } < T > v

  • i

d f ( T a r g ) { / / … } c l a s s M y T y p e < T > { T m e m b e r = n u l l ; }

slide-25
SLIDE 25

E x a m p l e : A s i m p l e H

  • l

d e r c l a s s

c l a s s A p p l e { } p u b l i c c l a s s H

  • l

d e r { p r i v a t e A p p l e a ; p u b l i c H

  • l

d e r ( A p p l e a ) { t h i s . a = a ; } p u b l i c v

  • i

d s e t ( A p p l e a ) { t h i s . a = a ; } p u b l i c A p p l e g e t ( ) { r e t u r n a ; } 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

  • l

d e r h = n e w H

  • l

d e r ( n e w A p p l e ( ) ) ; A p p l e a = h . g e t ( ) ; / / h . s e t ( " N

  • t

a n A p p l e " ) ; / / E r r

  • r

/ / h . s e t ( 1 ) ; / / E r r

  • r

} }

slide-26
SLIDE 26

E x a m p l e : A s i m p l e H

  • l

d e r c l a s s

c l a s s A p p l e { } p u b l i c c l a s s H

  • l

d e r < T > { p r i v a t e T a ; p u b l i c H

  • l

d e r ( T a ) { t h i s . a = a ; } p u b l i c v

  • i

d s e t ( T a ) { t h i s . a = a ; } p u b l i c T g e t ( ) { r e t u r n a ; } 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

  • l

d e r < S t r i n g > h s = n e w H

  • l

d e r < S t r i n g > ( n e w S t r i n g ( “ h e l l

) ) ; S t r i n g s = h s . g e t ( ) ; H

  • l

d e r < I n t e g e r > h i = n e w H

  • l

d e r < I n t e g e r > ( 1 ) ; i n t I = h i . g e t ( ) ; H

  • l

d e r < A p p l e > h = n e w H

  • l

d e r < A p p l e > ( n e w A p p l e ( ) ) ; A p p l e a = h . g e t ( ) ; / / h . s e t ( " N

  • t

a n A p p l e " ) ; / / E r r

  • r

/ / h . s e t ( 1 ) ; / / E r r

  • r

} }

slide-27
SLIDE 27

E x a m p l e : A s i m p l e H

  • l

d e r c l a s s

c l a s s A p p l e { } p u b l i c c l a s s H

  • l

d e r < T > { p r i v a t e T a ; p u b l i c H

  • l

d e r ( T a ) { t h i s . a = a ; } p u b l i c v

  • i

d s e t ( T a ) { t h i s . a = a ; } p u b l i c T g e t ( ) { r e t u r n a ; } 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

  • l

d e r < A p p l e > h = n e w H

  • l

d e r < A p p l e > ( n e w A p p l e ( ) ) ; A p p l e a = h . g e t ( ) ; } } c l a s s A p p l e { } p u b l i c c l a s s H

  • l

d e r { p r i v a t e O b j e c t a ; p u b l i c H

  • l

d e r ( O b j e c t a ) { t h i s . a = a ; } p u b l i c v

  • i

d s e t ( O b j e c t a ) { t h i s . a = a ; } p u b l i c O b j e c t g e t ( ) { r e t u r n a ; } 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

  • l

d e r h = n e w H

  • l

d e r ( n e w A p p l e ( ) ) ; A p p l e a = ( A p p l e ) h . g e t ( ) ; } }

slide-28
SLIDE 28

基本概念

  • 方法

– 形参 – 实参 – 类型参数

slide-29
SLIDE 29

E x a m p l e : A t u p l e l i b r a r y

  • T

u p l e

– 不可变数组 (

数组元素不可变 )

– 用途 :

  • 函数返回多个值
  • D

a t a t r a n s f e r

  • b

j e c t

slide-30
SLIDE 30

E x a m p l e : A t u p l e l i b r a r y

p u b l i c c l a s s T w

  • T

u p l e < A , B > { p u b l i c fi n a l A fi r s t ; p u b l i c fi n a l B s e c

  • n

d ; p u b l i c T w

  • T

u p l e ( A a , B b ) { fi r s t = a ; s e c

  • n

d = b ; } p u b l i c S t r i n g t

  • S

t r i n g ( ) { r e t u r n " ( " + fi r s t + " , " + s e c

  • n

d + " ) " ; } }

slide-31
SLIDE 31

E x a m p l e : A t u p l e l i b r a r y

p u b l i c c l a s s T h r e e T u p l e < A , B , C > e x t e n d s T w

  • T

u p l e < A , B > { p u b l i c fi n a l C t h i r d ; p u b l i c T h r e e T u p l e ( A a , B b , C c ) { s u p e r ( a , b ) ; t h i r d = c ; } p u b l i c S t r i n g t

  • S

t r i n g ( ) { r e t u r n " ( " + fi r s t + " , " + s e c

  • n

d + " , " + t h i r d + " ) " ; } } p u b l i c c l a s s F

  • u

r T u p l e < A , B , C , D > e x t e n d s T h r e e T u p l e < A , B , C > { p u b l i c fi n a l D f

  • u

r ; p u b l i c T h r e e T u p l e ( A a , B b , C c , D d ) { s u p e r ( a , b , c ) ; t h i r d = d ; } p u b l i c S t r i n g t

  • S

t r i n g ( ) { r e t u r n " ( " + fi r s t + " , " + s e c

  • n

d + " , " + t h i r d + " , " + f

  • u

r + " ) " ; } }

slide-32
SLIDE 32

E x a m p l e : A t u p l e l i b r a r y

c l a s s A p p l e { } c l a s s O r a n g e { } p u b l i c c l a s s T u p l e T e s t { s t a t i c T w

  • T

u p l e < S t r i n g , I n t e g e r > f ( ) { r e t u r n n e w T w

  • T

u p l e < S t r i n g , I n t e g e r > ( " h i " , 4 7 ) ; / / A u t

  • b
  • x

i n g } s t a t i c T h r e e T u p l e < A p p l e , S t r i n g , I n t e g e r > g ( ) { r e t u r n n e w T h r e e T u p l e < A p p l e , S t r i n g , I n t e g e r > ( n e w A p p l e ( ) , " h i " , 4 7 ) ; } s t a t i c F

  • u

r T u p l e < O r a n g e , A p p l e , S t r i n g , I n t e g e r > h ( ) { r e t u r n n e w F

  • u

r T u p l e < O r a n g e , A p p l e , S t r i n g , I n t e g e r > ( n e w O r a n g e ( ) , n e w A p p l e ( ) , " h i " , 4 7 ) ; } 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 ) { T w

  • T

u p l e < S t r i n g , I n t e g e r > t t s i = f ( ) ; S y s t e m .

  • u

t . p r i n t l n ( t t s i ) ; / / t t s i . fi r s t = " t h e r e " ; / / C

  • m

p i l e e r r

  • r

: fi n a l S y s t e m .

  • u

t . p r i n t l n ( g ( ) ) ; S y s t e m .

  • u

t . p r i n t l n ( h ( ) ) ; } }

slide-33
SLIDE 33

泛型接口

  • 带有类型参数的接口

p u b l i c i n t e r f a c e G e n e r a t

  • r

< T > { T n e x t ( ) ; } p u b l i c c l a s s C

  • ff

e e { p r i v a t e s t a t i c l

  • n

g c

  • u

n t e r = ; p r i v a t e fi n a l l

  • n

g i d = c

  • u

n t e r + + ; p u b l i c S t r i n g t

  • S

t r i n g ( ) { r e t u r n g e t C l a s s ( ) . g e t S i m p l e N a m e ( ) + " " + i d ; } } p u b l i c c l a s s L a t t e e x t e n d s C

  • ff

e e { } p u b l i c c l a s s M

  • c

h a e x t e n d s C

  • ff

e e { } p u b l i c c l a s s C a p p u c c i n

  • e

x t e n d s C

  • ff

e e { } p u b l i c c l a s s A m e r i c a n

  • e

x t e n d s C

  • ff

e e { } p u b l i c c l a s s B r e v e e x t e n d s C

  • ff

e e { }

slide-34
SLIDE 34

i m p

  • r

t j a v a . u t i l . * ; p u b l i c c l a s s C

  • ff

e e G e n e r a t

  • r

i m p l e m e n t s G e n e r a t

  • r

< C

  • ff

e e > { p r i v a t e C l a s s [ ] t y p e s = { L a t t e . c l a s s , M

  • c

h a . c l a s s , C a p p u c c i n

  • .

c l a s s , A m e r i c a n

  • .

c l a s s , B r e v e . c l a s s , } ; p r i v a t e s t a t i c R a n d

  • m

r a n d = n e w R a n d

  • m

( 4 7 ) ; p r i v a t e i n t s i z e = ; p u b l i c C

  • ff

e e G e n e r a t

  • r

( ) { } p u b l i c C

  • ff

e e G e n e r a t

  • r

( i n t s z ) { s i z e = s z ; } p u b l i c C

  • ff

e e n e x t ( ) { t r y { r e t u r n ( C

  • ff

e e ) t y p e s [ r a n d . n e x t I n t ( t y p e s . l e n g t h ) ] . n e w I n s t a n c e ( ) ; / / R e p

  • r

t p r

  • g

r a m m e r e r r

  • r

s a t r u n t i m e : } c a t c h ( E x c e p t i

  • n

e ) { t h r

  • w

n e w R u n t i m e E x c e p t i

  • n

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

  • ff

e e G e n e r a t

  • r

g e n = n e w C

  • ff

e e G e n e r a t

  • r

( ) ; f

  • r

( i n t i = ; i < 5 ; i + + ) S y s t e m .

  • u

t . p r i n t l n ( g e n . n e x t ( ) ) ; } }

slide-35
SLIDE 35

/ / p u b l i c c l a s s C

  • ff

e e G e n e r a t

  • r

i m p l e m e n t s G e n e r a t

  • r

< C

  • ff

e e > p u b l i c c l a s s F i b

  • n

a c c i i m p l e m e n t s G e n e r a t

  • r

< I n t e g e r > { p r i v a t e i n t c

  • u

n t = ; p u b l i c I n t e g e r n e x t ( ) { r e t u r n fi b ( c

  • u

n t + + ) ; } p r i v a t e i n t fi b ( i n t n ) { i f ( n < 2 ) r e t u r n 1 ; r e t u r n fi b ( n

  • 2

) + fi b ( n

  • 1

) ; } 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 ) { F i b

  • n

a c c i g e n = n e w F i b

  • n

a c c i ( ) ; f

  • r

( i n t i = ; i < 1 8 ; i + + ) S y s t e m .

  • u

t . p r i n t ( g e n . n e x t ( ) + " " ) ; } }

slide-36
SLIDE 36

泛型方法

  • 方法的参数 ,

返回值带有类型参数

  • 语法

p u b l i c < T > v

  • i

d f ( T x ) { / / … }

< T > 说明该方法带有类型参数 T 需要放在返回值说明之前

slide-37
SLIDE 37

泛型方法

p u b l i c c l a s s G e n e r i c M e t h

  • d

s < E > { E m e m b e r ; p u b l i c < T > v

  • i

d f ( T x ) { S y s t e m .

  • u

t . p r i n t l n ( x . g e t C l a s s ( ) . g e t N a m e ( ) ) ; } } p u b l i c c l a s s G e n e r i c M e t h

  • d

s { p u b l i c < T > v

  • i

d f ( T x ) { S y s t e m .

  • u

t . p r i n t l n ( x . g e t C l a s s ( ) . g e t N a m e ( ) ) ; } 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 ) { G e n e r i c M e t h

  • d

s g m = n e w G e n e r i c M e t h

  • d

s ( ) ; g m . f ( " " ) ; g m . f ( 1 ) ; g m . f ( 1 . ) ; g m . f ( 1 . F ) ; g m . f ( ‘ c ’ ) ;g m . f ( g m ) ; } }

方法的类型参数可以与类的类型参数无关

slide-38
SLIDE 38

类型推理

  • 编译器推理出类型变量的值

I m p

  • r

t j a v a . u t i l . * ; p u b l i c c l a s s N e w { p u b l i c s t a t i c < K , V > M a p < K , V > b u i l d ( ) { r e t u r n n e w H a s h M a p < K , V > ( ) ; } 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 ) { M a p < S t r i n g , L i s t < S t r i n g > > s = N e w . b u i l d ( ) ; } } / / D i a m

  • n

d A r r a y L i s t < S t r i n g > s = n e w A r r a y L i s t < > ( ) ; H a s h M a p < S t r i n g , I n t e g e r > h = n e w H a s h M a p < > ( ) ; 1 . 由 M a p < S t r i n g , L i s t < S t r i n g > > s = N e w . b u i l d ( ) ; 推断出 b u i l d ( ) 方法中的 K = S t r i n g , V = L i s t < S t r i n g > 2 . 可以通过语法明确泛型方法调用时的类型参数 M a p < S t r i n g , L i s t < S t r i n g > > s = N e w . < S t r i n g , L i s t < S t r i n g > > M a p ( ) ;

slide-39
SLIDE 39

小结

  • 泛型类
  • 泛型接口
  • 泛型方法

p u b l i c i n t e r f a c e G e n e r a t

  • r

< T > { T n e x t ( ) ; } p u b l i c c l a s s T w

  • T

u p l e < A , B > { / / . . . } p u b l i c < T > v

  • i

d f ( T x ) { / / … }

slide-40
SLIDE 40

p u b l i c c l a s s G e n e r a t

  • r

s { p u b l i c s t a t i c < T > C

  • l

l e c t i

  • n

< T > fi l l ( C

  • l

l e c t i

  • n

< T > c

  • l

l , G e n e r a t

  • r

< T > g e n , i n t n ) { f

  • r

( i n t i = ; i < n ; i + + ) c

  • l

l . a d d ( g e n . n e x t ( ) ) ; r e t u r n c

  • 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 ) { C

  • l

l e c t i

  • n

< C

  • ff

e e > c

  • ff

e e = fi l l ( n e w A r r a y L i s t < C

  • ff

e e > ( ) , n e w C

  • ff

e e G e n e r a t

  • r

( ) , 4 ) ; f

  • r

( C

  • ff

e e c : c

  • ff

e e ) S y s t e m .

  • u

t . p r i n t l n ( c ) ; C

  • l

l e c t i

  • n

< I n t e g e r > f n u m b e r s = fi l l ( n e w A r r a y L i s t < I n t e g e r > ( ) , n e w F i b

  • n

a c c i ( ) , 1 2 ) ; f

  • r

( i n t i : f n u m b e r s ) S y s t e m .

  • u

t . p r i n t ( i + " , " ) ; } }

slide-41
SLIDE 41

T y p e E r a s u r e

  • 当给定不同的类型参数时 ,

泛型的类型是否相 同 ?

c l a s s A { } c l a s s B e x t e n d s A { } p u b l i c 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 ) { A r r a y L i s t < S t r i n g > s t r l i s t = n e w A r r a y L i s t < > ( ) ; A r r a y L i s t < I n t e g e r > i n t l = s t r l i s t ; A r r a y L i s t < B > b l i s t = n e w A r r a y L i s t < > ( ) ; A r r a y L i s t < A > a l i s t = b l i s t ; } } 编译错误 ! A r r a y L i s t < S t r i n g > , A r r a y L i s t < I n t e g e r > , A r r a y L i s t < B > , A r r a y L i s t < A > 是不同类型 !

slide-42
SLIDE 42

T y p e E r a s u r e

  • 当给定不同的类型参数时 ,

泛型的类型是否相 同 ?

– C

l a s s O b j e c t

i m p

  • r

t j a v a . u t i l . * ; p u b l i c c l a s s E r a s e d T y p e E q u i v a l e n c e { 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 ) { C l a s s c 1 = n e w A r r a y L i s t < S t r i n g > ( ) . g e t C l a s s ( ) ; C l a s s c 2 = n e w A r r a y L i s t < I n t e g e r > ( ) . g e t C l a s s ( ) ; S y s t e m .

  • u

t . p r i n t l n ( c 1 = = c 2 ) ; } } 输出 : t r u e !

slide-43
SLIDE 43

T y p e E r a s u r e

i m p

  • r

t j a v a . u t i l . * ; c l a s s F r

  • b

{ } c l a s s F n

  • r

k l e { } c l a s s Q u a r k < Q > { } c l a s s P a r t i c l e < P O S I T I O N , M O M E N T U M > { } p u b l i c c l a s s L

  • s

t I n f

  • r

m a t i

  • n

{ 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 ) { L i s t < F r

  • b

> l i s t = n e w A r r a y L i s t < F r

  • b

> ( ) ; M a p < F r

  • b

, F n

  • r

k l e > m a p = n e w H a s h M a p < F r

  • b

, F n

  • r

k l e > ( ) ; Q u a r k < F n

  • r

k l e > q u a r k = n e w Q u a r k < F n

  • r

k l e > ( ) ; P a r t i c l e < L

  • n

g , D

  • u

b l e > p = n e w P a r t i c l e < L

  • n

g , D

  • u

b l e > ( ) ; S y s t e m .

  • u

t . p r i n t l n ( A r r a y s . t

  • S

t r i n g ( l i s t . g e t C l a s s ( ) . g e t T y p e P a r a m e t e r s ( ) ) ) ; S y s t e m .

  • u

t . p r i n t l n ( A r r a y s . t

  • S

t r i n g ( m a p . g e t C l a s s ( ) . g e t T y p e P a r a m e t e r s ( ) ) ) ; S y s t e m .

  • u

t . p r i n t l n ( A r r a y s . t

  • S

t r i n g ( q u a r k . g e t C l a s s ( ) . g e t T y p e P a r a m e t e r s ( ) ) ) ; S y s t e m .

  • u

t . p r i n t l n ( A r r a y s . t

  • S

t r i n g ( p . g e t C l a s s ( ) . g e t T y p e P a r a m e t e r s ( ) ) ) ; } } 输出 : [ E ] [ K , V ] [ Q ] [ P O S I T I O N , M O M E N T U M ]

slide-44
SLIDE 44

T y p e E r a s u r e

  • 泛型是如何实现的 ?
  • A

r r a y L i s t < S t r i n g > 与 A r r a y L i s t < I n t e g e r > 的区 别在哪里 ?

slide-45
SLIDE 45

T y p e E r a s u r e

  • 类型擦除 (

T y p e E r a s u r e ) ,

– T

仅作为占位符 , 不包含任何具体类型的信息

– 所有 T

类型的对象引用最终实现为 O b j e c t 对象引用

slide-46
SLIDE 46

T y p e E r a s u r e

c l a s s H a s F { p u b l i c v

  • i

d f ( ) { S y s t e m .

  • u

t . p r i n t l n ( " H a s F . f ( ) " ) ; } } c l a s s M a n i p u l a t

  • r

< T > { p r i v a t e T

  • b

j ; p u b l i c M a n i p u l a t

  • r

( T x ) {

  • b

j = x ; } / / E r r

  • r

: c a n n

  • t

fi n d s y m b

  • l

: m e t h

  • d

f ( ) : p u b l i c v

  • i

d m a n i p u l a t e ( ) {

  • b

j . f ( ) ; } } p u b l i c c l a s s M a n i p u l a t i

  • n

{ 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 a s F h f = n e w H a s F ( ) ; M a n i p u l a t

  • r

< H a s F > m a n i p u l a t

  • r

= n e w M a n i p u l a t

  • r

< H a s F > ( h f ) ; m a n i p u l a t

  • r

. m a n i p u l a t e ( ) ; } }

slide-47
SLIDE 47

T y p e E r a s u r e

p u b l i c c l a s s E r a s e d < T > { p r i v a t e fi n a l i n t S I Z E = 1 ; p u b l i c v

  • i

d f ( O b j e c t a r g ) { i f ( a r g i n s t a n c e

  • f

T ) { } / / c

  • m

p i l e e r r

  • r

T v a r = n e w T ( ) ; / / c

  • m

p i l e e r r

  • r

T [ ] a r r a y = n e w T [ S I Z E ] ; / / c

  • m

p i l e e r r

  • r

} }

slide-48
SLIDE 48

T y p e E r a s u r e

  • T

y p e E r a s u r e 实现原理 1 :

– 所有引用最后都变为 O

b j e c t 引用

– 编译器自动添加 D

  • w

n c a s t i n g 代码

c l a s s A p p l e { } p u b l i c c l a s s H

  • l

d e r < T > { p r i v a t e T a ; p u b l i c H

  • l

d e r ( T a ) { t h i s . a = a ; } p u b l i c v

  • i

d s e t ( T a ) { t h i s . a = a ; } p u b l i c T g e t ( ) { r e t u r n a ; } 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

  • l

d e r < A p p l e > h = n e w H

  • l

d e r < A p p l e > ( n e w A p p l e ( ) ) ; A p p l e a = h . g e t ( ) ; } } c l a s s A p p l e { } p u b l i c c l a s s H

  • l

d e r { p r i v a t e O b j e c t a ; p u b l i c H

  • l

d e r ( O b j e c t a ) { t h i s . a = a ; } p u b l i c v

  • i

d s e t ( O b j e c t a ) { t h i s . a = a ; } p u b l i c O b j e c t g e t ( ) { r e t u r n a ; } 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

  • l

d e r h = n e w H

  • l

d e r ( n e w A p p l e ( ) ) ; A p p l e a = ( A p p l e ) h . g e t ( ) ; } }

生成相同的机器代码 编译器在 g e t ( ) 返回处自动添加了类型转换代码

slide-49
SLIDE 49

T y p e E r a s u r e

  • T

y p e E r a s u r e 的实现原理 2 :

– 编译器只做静态检查

c l a s s A { } c l a s s B e x t e n d s A { } p u b l i c 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 ) { A r r a y L i s t < S t r i n g > s t r l i s t = n e w A r r a y L i s t < > ( ) ; A r r a y L i s t < I n t e g e r > i n t l = s t r l i s t ; A r r a y L i s t < B > b l i s t = n e w A r r a y L i s t < > ( ) ; A r r a y L i s t < A > a l i s t = b l i s t ; } }

1 . 编译器通过静态检查报错 ( A r r a y L i s t < S t r i n g > 与 A r r a y L i s t < I n t e g e r > 类型不同 ) 2 . 但实际存储中 , 无论 < S t r i n g > 还是 < I n t e g e r > 都存储的是 O b j e c t 类型的引用

slide-50
SLIDE 50

T y p e E r a s u r e

  • T

y p e E r a s u r e

– 类型变量仅仅对编译器的静态检查有用 – 当通过静态检查 ,

所有类型参数被擦除

slide-51
SLIDE 51

T y p e E r a s u r e

  • 如何解决 T

y p e E r a s u r e 带来的问题 ?

– C

l a s s 对象

p u b l i c c l a s s E r a s e d < T > { p r i v a t e fi n a l i n t S I Z E = 1 ; p u b l i c s t a t i c v

  • i

d f ( ) { T v a r = n e w T ( ) ; / / c

  • m

p i l e e r r

  • r

} }

p u b l i c c l a s s T y p e C a p t u r e < T > { C l a s s < T > k i n d ; p u b l i c T y p e C a p t u r e ( C l a s s < T > k i n d ) { t h i s . k i n d = k i n d ; } p u b l i c T f ( ) { T r = n u l l ; t r y { r = k i n d . n e w I n s t a n c e ( ) ; } c a t c h ( E x c e p t i

  • n

e ) { S y s t e m .

  • u

t . p r i n t l n ( " f a i l " ) ; } r e t u r n r ; } 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 ) { T y p e C a p t u r e < S t r i n g > c = n e w T y p e C a p t u r e < > ( S t r i n g . c l a s s ) ; S y s t e m .

  • u

t . p r i n t l n ( c . f ( ) ) ; } }

slide-52
SLIDE 52

T y p e E r a s u r e

  • 如何解决 T

y p e E r a s u r e 带来的问题 ?

p u b l i c c l a s s H a s F { p u b l i c v

  • i

d f ( ) { S y s t e m .

  • u

t . p r i n t l n ( " H a s F . f ( ) " ) ; } } c l a s s M a n i p u l a t

  • r

< T > { p r i v a t e T

  • b

j ; p u b l i c M a n i p u l a t

  • r

( T x ) {

  • b

j = x ; } / / E r r

  • r

: c a n n

  • t

fi n d s y m b

  • l

: m e t h

  • d

f ( ) : p u b l i c v

  • i

d m a n i p u l a t e ( ) {

  • b

j . f ( ) ; } } p u b l i c c l a s s M a n i p u l a t i

  • n

{ 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 a s F h f = n e w H a s F ( ) ; M a n i p u l a t

  • r

< H a s F > m a n i p u l a t

  • r

= n e w M a n i p u l a t

  • r

< H a s F > ( h f ) ; m a n i p u l a t

  • r

. m a n i p u l a t e ( ) ; } } c l a s s M a n i p u l a t

  • r

< T e x t e n d s H a s F > { p r i v a t e T

  • b

j ; p u b l i c M a n i p u l a t

  • r

( T x ) {

  • b

j = x ; } p u b l i c v

  • i

d m a n i p u l a t e ( ) {

  • b

j . f ( ) ; } }

slide-53
SLIDE 53

被限定的类型参数

  • 限定类型参数的范围

– 语法 : – 表示类型参数 T

只能是 B类型或者 B的子类型

– 作用 :

静态检查时 , 可以合法引用 T 的方法 ( 但最 终仍然是 O b j e c t )

– 多个限定类型

  • 如果有类和接口 ,

类应该出现在第一个位置

c l a s s A < T e x t e n d s B > { / / … } c l a s s A < T e x t e n d s B & C > { / / … }

slide-54
SLIDE 54

被限定的类型参数

i n t e r f a c e H a s C

  • l
  • r

{ j a v a . a w t . C

  • l
  • r

g e t C

  • l
  • r

( ) ; } c l a s s C

  • l
  • r

e d < T e x t e n d s H a s C

  • l
  • r

> { T i t e m ; C

  • l
  • r

e d ( T i t e m ) { t h i s . i t e m = i t e m ; } T g e t I t e m ( ) { r e t u r n i t e m ; } / / T h e b

  • u

n d a l l

  • w

s y

  • u

t

  • c

a l l a m e t h

  • d

: j a v a . a w t . C

  • l
  • r

c

  • l
  • r

( ) { r e t u r n i t e m . g e t C

  • l
  • r

( ) ; } } c l a s s D i m e n s i

  • n

{ p u b l i c i n t x , y , z ; } / / M u l t i p l e b

  • u

n d s : c l a s s C

  • l
  • r

e d D i m e n s i

  • n

< T e x t e n d s D i m e n s i

  • n

& H a s C

  • l
  • r

> { T i t e m ; C

  • l
  • r

e d D i m e n s i

  • n

( T i t e m ) { t h i s . i t e m = i t e m ; } T g e t I t e m ( ) { r e t u r n i t e m ; } j a v a . a w t . C

  • l
  • r

c

  • l
  • r

( ) { r e t u r n i t e m . g e t C

  • l
  • r

( ) ; } i n t g e t X ( ) { r e t u r n i t e m . x ; } i n t g e t Y ( ) { r e t u r n i t e m . y ; } i n t g e t Z ( ) { r e t u r n i t e m . z ; } }

slide-55
SLIDE 55

通配符

c l a s s F r u i t { } c l a s s A p p l e e x t e n d s F r u i t { } c l a s s O r a n g e e x t e n d s F r u i t { } p u b l i c 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 ) { L i s t < A p p l e > a l i s t = n e w A r r a y L i s t < A p p l e > ( ) ; / / c

  • m

p i l e e r r

  • r

/ / L i s t < F r u i t > fl i s t = n e w A r r a y L i s t < A p p l e > ( ) ; } }

如何表达 A r r a y L i s t 中的元素是 F r u i t 的某个子类 ?

slide-56
SLIDE 56

通配符

c l a s s F r u i t { } c l a s s A p p l e e x t e n d s F r u i t { } c l a s s O r a n g e e x t e n d s F r u i t { } p u b l i c 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 ) { L i s t < A p p l e > a l i s t = n e w A r r a y L i s t < A p p l e > ( ) ; / / c

  • m

p i l e e r r

  • r

/ / L i s t < F r u i t > fl i s t = n e w A r r a y L i s t < A p p l e > ( ) ; L i s t < ? e x t e n d s F r u i t > fl i s t = n e w A r r a y L i s t < A p p l e > ( ) ; / / C

  • m

p i l e E r r

  • r

: c a n ’ t a d d a n y t y p e

  • f
  • b

j e c t : / / fl i s t . a d d ( n e w A p p l e ( ) ) ; / / fl i s t . a d d ( n e w F r u i t ( ) ) ; / / fl i s t . a d d ( n e w O b j e c t ( ) ) ; fl i s t . a d d ( n u l l ) ; / / L e g a l b u t u n i n t e r e s t i n g / / We k n

  • w

t h a t i t r e t u r n s a t l e a s t F r u i t : F r u i t f = fl i s t . g e t ( ) ; } }

slide-57
SLIDE 57

通配符

  • 类型参数为某个 B的子类型
  • 具体是哪一个无法确定
  • L

i s t < ? e x t e n d s F r u i t >

– 无法 a

d d 任何对象

  • L

i s t 中存储的对象类型无法确定

– 可以 g

e t 对象

  • F

r u i t 类型

< ? e x t e n d s B >

slide-58
SLIDE 58

通配符

  • 类型参数为某个 B的父类型
  • 具体是哪一个无法确定
  • L

i s t < ? s u p e r A p p l e >

– 无法 g

e t 任何对象

  • 无法确定是哪个父类

– 可以 a

d d A p p l e 的子类对象

< ? s u p e r B >

slide-59
SLIDE 59

i m p

  • r

t j a v a . u t i l . * ; p u b l i c c l a s s S u p e r T y p e Wi l d c a r d s { s t a t i c v

  • i

d w r i t e T

  • (

L i s t < ? s u p e r A p p l e > a p p l e s ) { a p p l e s . a d d ( n e w A p p l e ( ) ) ; a p p l e s . a d d ( n e w J

  • n

a t h a n ( ) ) ; / / a p p l e s . a d d ( n e w F r u i t ( ) ) ; / / E r r

  • r

} }

slide-60
SLIDE 60

总结

  • T

y p e E r a s u r e

– 类型变量仅仅对编译器的静态检查有用 – 当通过静态检查 ,

所有类型参数被擦除

  • 被限制的类型参数
  • 通配符

c l a s s A < T e x t e n d s B & C > { / / … } < ? e x t e n d s B > < ? s u p e r B >