a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 185|回复: 2

[专业语言] JAVA认证:Java自定义的应用技巧分析

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
我们在JAVA中处处都用到了范型,JAVA中的范型是从C++模板继承来的,不过JAVA的范型的功能远远没有C++那么强大。
# B# ?- k1 J  L7 b9 o   
9 o$ X, F2 a* j* u    我们知道在C++中模板可以很方便的代替任意类型的数据。如下:9 P" M! W% W3 p# r/ R- i6 j7 \
    - t+ @" P/ h% X4 R
    1. template
  K2 W! ~% a% A( T! v5 U( g2 }4 V) @   
: l& j5 [3 R* [" i0 D9 C5 \    2.$ V5 o0 p  U/ ]1 }9 s  _% k  }
   
& [0 M9 z& ]8 k* ]$ q# _5 Y    3. void show(T x)2 h* I% m$ f7 a8 e
    . G1 t/ H1 Z9 h! f
    4.% C2 H; a# B6 ^! {5 a
    : c9 W! K' J+ L7 H" I& h
    5. {
. i  e! h. B; n5 z+ N4 F  z2 \$ U, R( p    8 j, [& D: U/ S2 Y5 h. F
    6.
& Q; A7 b8 q6 \0 h   
  D$ a! v7 A' v9 y. S: t    7. cout《x《endl ;
: ?2 H$ e( O. Q. }$ l   
4 t- Z1 z  ]( C" @    8. }
$ s, y6 i; i) k   
2 R0 @% t; T5 q$ j& l* G    上面的T可以代表任意类型的数据,这样不是大大减少了函数的重载次数,提高了效率呢。Java是从C++过来的,理解了C++,java也不在话下。
& p/ T: w: [; G  M9 @* A; M( z* [( p    / w# ~9 X  j7 J( H9 D6 G" D
    在Java中自定义范型也可以用在方法上。如下:3 g, z9 u, k5 l/ U" C: M, V
   
1 p7 T* G) g8 L" P& w- w    1、1 J+ B9 T3 Q+ e! m( p
   
1 _+ I5 ?0 K0 j0 L* i) A    //这样声明的范型可以代替任意类型数据,我们市场用到的键值对Map.Entry 不就是给予范型的吗?. g; H1 j. }) R" T/ ~+ s4 g: H( \
    3 v# T, d8 y5 e' B7 ~4 s
    K V都可以代替任意类型的值,但是在java中范型的实际类型必须是引用类型。
, a! s- s, }# R8 N- O$ `' e   
# T' N. k0 |) V0 u. }- I    1.   void get(K k,V v)1 u) Q- H) o5 W) |3 j6 `* R/ ?" e! b
   
" R; S" k8 \3 r  q% t+ X5 ~    2.
" M9 Q6 E& C7 q   
9 N' ?4 }0 N  v- ~7 m    3.  {9 o/ h6 w- }! m
    7 t7 _8 s7 X& R+ s
    4.+ C+ V. }. p1 [& y6 n5 c/ i
    / E4 m/ F2 ~9 H8 O+ q2 J' b
    5.
; W# \  a9 A5 O+ ]   
, `/ t0 B( @( F9 J4 r$ K    6.  }
2 G2 E% c  Y; @  ]  y   
+ y3 z6 Q0 E2 h5 \    2、Java中的范型不能像C++那么灵活。  Q( l$ ~; B2 A' g! |% ?
    * m7 I/ |& D9 d0 t6 K
    1.   T  add(T a,T b)/ v% s* g1 R5 C
    $ L9 K9 d4 ^4 t# s/ C
    2.- f: |4 T4 m2 ]' f6 {5 f
   
5 P* [" m; c7 \" A# e" d    3. {
" [  Y9 ~1 \; D; R: k# L. c( t    1 K# h  }2 ]" A% D9 ]3 B
    4.
$ P# P8 v& R& F% W5 R& t   
6 Y$ e& M  g6 w) C$ S* ^    5.  //return  a+b   ;//很多人以为java也想C++一样可以这样 ,但是不可以 .* E6 B2 U' i8 B8 b8 q! _$ s; l9 e0 r
   
  K( e* R4 K, g8 G" M4 e    6.9 x4 ]* T- Y5 J
    2 L+ k8 s# E% W" D/ v" ~
    7.  return  null;
5 J7 @5 E6 g- T2 ^; s1 z4 y- n5 G    3 \" R4 J0 A7 \* h
    8.  }) [( Z: N; ~) f* w' t
    , |' E& U$ _' B/ E1 [
    这个返回的null 也是有类型限制的,比如上面的a b分别是Integer和String 那么就会取他们共同的基类Object做为返回值类型,其他的同理。8 }7 G  u& @! e; J
   
8 i& Q9 w: Q. ^9 ~# i3 b+ @; r2 [    3、实现任意类型的数组的成员值的交换,注意在自定义范型中范型的实际类型只能是引用数据类型,不能是基本数据类型。
  _/ A5 L  D9 Z  a, Z6 K    0 H, U8 S( [' Y  H8 p$ u) f9 [6 I
    1.  public  static void  swap(T[]a,int x,int y)
6 z+ |* b/ E6 i2 B% M" ]    & i! l. {* j- d* ~. n6 a8 F2 K
    2.  {
5 y" j6 X8 l* E    2 N" V( l& V. ~4 @9 Z2 T: Y2 |; x: N5 `
    3.  T  tem  =a[x]  ;& p+ c2 W1 y  M- e9 A& o
    + N- y/ g7 e3 C/ m" M
    4.  a[x]=a[y]  ;+ d, O) C& f0 T. U% y0 M
   
7 j1 W# i; q3 J1 X0 x2 R! E" M    5.  a[y]=tem ;' `4 Y7 P$ E  ?. K6 e
   
2 C& ?$ N/ k- N    6.
9 M5 A; L3 {( Q    5 `1 y, U0 L6 q
    7.   }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:45 | 显示全部楼层

JAVA认证:Java自定义的应用技巧分析

上面这个方法如果我swap(new Integer[]{1,2,3,4,5},1,2); //这样就会自动交换下标1 2的值+ g8 u  T3 l! Q% B; d9 [
   
& @) R  }2 I3 Z$ y1 U    但是这样调用就错了swao(new int[]{1,2,3,5,6},2,3) ; //所以说Java的范型的实际类型只能是引用数据类型
2 k, [! r! a3 u9 r7 s    3 p( @( @- M" y
    4、0 p" W  |7 l+ Y( _! |+ F- F7 q
    ; q9 V3 g* u$ B
    表示类型只能是String或者String的派生类
/ i# t9 q' b3 @9 w9 q    6 d( J6 M' N9 ^- `( I  _
    表示范型类型只能是String或者String的父类* c; V+ _! J3 C: |- ]( [
    ( p. d4 }* F0 r# H
    用法同上
' U' p; W% G+ `$ U   
) `% x. l  X* A/ b% w; W" s    5、下面这个函数利用范型来实现类型自动转换的功能。6 d; h& u  w: k' W1 q
   
/ m7 c- L* p+ f6 ~- Y0 S( A8 R- Y    1. public static  T autoConvert(Object obj)
# ]% I) s: }4 L9 d# a3 Y4 I    - ?" ^9 y2 N6 q4 ]! n: r
    2. //因为返回值是 T标识任意类型 所哟可以 将返回结果赋值给任意类型对象* K( `9 J3 {& q5 U* d
    8 q' i6 k4 M0 U
    3.  {# ?' D  l9 }: [) R( S, g: c
    1 l8 A: p4 C8 j: e! G% l  o
    4.  return (T)obj;+ b" E( ?4 G% a) e' e
   
! h! z2 a  C4 L* `6 e, G    5.  }8 I' o. l$ Q1 i% W
    # }5 A) f. c" |/ s
    6.  Object  obj=="";2 j! B( l0 \. s2 u, W* F1 i# ~
   
' Q. U# a/ ?; i  _( o    7.
  r4 }8 |, ]5 j$ C  g    ' |* K- C/ `- r& [( R! X
    8.  String str=autoConvert(obj);% m3 G# L% _' f* ]; L6 ?- M
   
4 \! u# X& \! y& G( E2 m    可以完成自动转换,因为范型T代表任意类型,因此他可以赋值给String类型的对象。- K2 u) I! q3 z' }& @: q
   
8 h  V! D$ q$ T/ B- o- h    6、将任意类型的对象填充到任意类型的数组中,与是fillArray(new Integer[]{2,3,4},"ddd"); 这样调用是正确的,这样做忽略类型限制。
3 J6 c& s2 i, J# Q5 o+ q0 W* I    " H9 i6 n3 k" o2 ?- D2 j( n
    1. public  static void  fillArray(T[] a,T b)  //将任意一个对象填充到任意类型的数组3 Q" I& E8 [0 L/ A% `2 }
   
4 h4 F' A3 K6 P! l+ X) W; X' Y; c    2.{  ~" C" ~, n7 N4 j% I
   
% ~+ m# F' w# U+ n    3. for(int i =0;i
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:46 | 显示全部楼层

JAVA认证:Java自定义的应用技巧分析

10.  public static void showCollection(Collection col)  //利用范型来输出任意类型集合( w9 V9 z) u6 L' U
    ! Z% ~' S8 `, f% E3 g/ A$ N
    11. {
7 c( Q5 E# @% Q; b1 v( V   
$ ?2 K$ j9 o8 d5 j. N, l  A    12.  for(Object obj:col)! L' h& A" l9 n9 R0 k6 S
   
* _: P* M$ t* U$ b3 T4 [    13.  {! t2 a0 S, |, U, o# A4 a' ]- W
   
% w7 ]0 M# |1 [    14.  System.out.println(obj);* m9 v! }8 V/ L+ `: n
   
4 m0 ]0 w6 g6 }2 Q/ R7 }    15.  }$ D7 O6 z6 S& K) r" m9 c
    : g$ v4 U4 m! h
    16.  }
7 h9 I" p- k4 s6 ?( u7 E1 {   
; U; s4 D0 z- [9 q$ M    8、如果一个类中多个方法都需要范型,那么就是用类级别的范型。
$ E7 F, v( r1 v    & t0 a* v) V0 a
    例如:" y% U% Z. r' d6 ]1 A& [; j
    4 e" {; _, h- z2 h2 j2 m) E
    1. class  A$ x8 ~, V' y- z7 f% c( ]
    + Y4 e! Y6 w4 S/ `0 d2 c$ A( t. ~
    2.
1 j; J9 `# {, w" j3 f4 B- L7 r1 U/ s    9 D5 P& G$ J0 ?2 t8 a
    3. {* i* d4 o0 h* D
   
/ G( F# }9 X1 ~7 k$ g8 c5 ~- r    4.
0 \% n0 ^' f) H   
- x* y  R) J5 U! n1 D) c/ f    5.  public void  add(E obj){}4 ^2 V2 q# [  Z6 ^, ]
    9 t- \% T! T3 M" ]1 M
    6.
) M3 T4 C% _( E8 _6 q' r! o    ! h* A2 E$ R# `/ O. e
    7.  public  E  get(){}
! x" z' \. O3 |5 {% I% N+ o- [    9 A3 l; s* U2 ]
    8.& ?1 h& U" G- `& o$ a
   
$ Y8 s/ c7 k/ [, _* _% _% E; U& T- J    9.  private E data;
* z$ L4 d4 A# p5 U    # B5 l# B# e& _( M' c5 u% z( V" ~2 Y
    10. }; w% C; \7 ]( h, v' e) t
   
* F9 [4 }- N& p. }  H    这样声明范型和在函数前面声明其实是一样的,只不过是在类的级别上作用于整个类而已。
% C# p1 p7 Z4 L& E    9 J% H" w" q$ t3 r
    9、 要注意范型只是给编译器看的。
; ^7 m8 h: u& t3 }6 d' U5 e( _1 W   
( S6 H1 J4 n; R    也就是说Vector Vector 他们用到的都是同一份字节码,字节码只有class文件加载到内存中的时候才有。3 q$ p' V  l0 D( d; P2 s* u
      P9 z# r% V+ C  B8 p% g5 H
    所以在一个类中下面2个方法不能同时存在。1 j4 W- L6 ?+ z2 _/ Q1 G
    / E0 `8 m, d$ @4 E( L
    void show(Vector) {}6 K" ~' A: d- r' X" H1 ~! l* t
   
- y8 Z2 \$ |0 p    void show(Vector){}
7 O+ c& X- `1 g6 v1 B) {) u   
% B' h* l( U* B( ]# E    这两个方法都不是重载,因为编译后要去掉类型信息。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-7 17:24 , Processed in 0.209515 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表