网络推荐

推荐给好友 上一篇 | 下一篇

More Java!试题


声明
  • 声明: 1、任何网站转载本站点内容时需注明来自JAVA-CN.COM,否则我们有权将根据《互联网著作权行政保护办法》追究其相应法律责任; 2、JAVA中文站社区刊登此文只为传递信息,并不表示赞同或者反对.
JAVA中文站社区门户R?y'uZb

  自测练习 JAVA中文站社区门户9n xH'qS;S'f

JAVA中文站社区门户Ej0k8JQe

  1) Java语言提供的访问、操作数据库的统一接口称为__________。 JAVA中文站社区门户`b t1\ bbl

K4f;y%Fj3i  a.ODBC b.JDBC c.DBAP JAVA中文站社区门户5G3|M)D_'E

G%J Z1br%_)@  2) Java语言中提供的这个数据库接口包含在__________包中。 JAVA中文站社区门户0kn^xcq

6d$TFmfB"|  a.java.odbc b.java.jdbc c.java.sql d.java.dbap

&h},wE0?+[5Nv9p JAVA中文站社区门户 Q7a'H4d/u

  3) Java数据库程序通常是在网络上运行的,那么JDBC类一般位于_________。 JAVA中文站社区门户EV"]3n1K%A0T

JAVA中文站社区门户#H{6{U,h Dqm

  a.客户端 b.服务器端 c.两端都有其中一部分

"xO!D\#wE:e_

j_\ X h  4) JDBC可以通过____________来使用数据库的ODBC驱动程序。 JAVA中文站社区门户3g w1eB,{

JAVA中文站社区门户cV8H:S6q-Nd"x-T

  a.jdbcodbc.dll b.ODBC模拟器 c.没有条件,可以直接使用 JAVA中文站社区门户!WOisKm4v

R'zu%D8P qvVB  5) ODBC与JDBC有一个共同的设计基础,它是______________。 JAVA中文站社区门户@;ECEj^

JAVA中文站社区门户;V,{"KR#v1Nc

  a.SQL标准 b.CLI JAVA中文站社区门户 lS-vD/p*W!_i

JAVA中文站社区门户 F4I,~U%tZ"k

  6)__________发布时间更早。 JAVA中文站社区门户5c:X+S_D_

#G-x Kc-a+f k  a.JDBC b.ODBC c.DBAP JAVA中文站社区门户g/AD&a6X-r!o,R3l }

WhlC(J  7)使用ODBC访问数据库,数据库只能够在主机上。__________

0rvKt9Ud;} cS

A6P)m:sh_  a.对 b.不对 JAVA中文站社区门户#|b6Ov0a8Y

JAVA中文站社区门户gDJM;h2xg/W x

  8)在ODBC模型中,最终是通过________来操作数据库的。 JAVA中文站社区门户ON1e#vo"ol!~I

)c(Z6oc[  a.ODBC接口 b.驱动程序管理器 c.数据库的ODBC驱动程序 JAVA中文站社区门户/n D;qiY;ev

0[}6x&qv  9)而在JDBC模型中,在应用程序中,我们是通过_________来使用数据库的。

$QpL$`nb wWKA e JAVA中文站社区门户A9Y-HM0I9~'Ce

  a.JDBC-ODBC桥接器 b.JDBC接口 c.ODBC驱动程序

5tgWsR6r JAVA中文站社区门户d5SVeD5EO3p

  练习答案 JAVA中文站社区门户Q3D:Y%gr+U(MH?

q"y ]~'Pc  1)b 当然是JDBC,Java DataBase Connectivity。另外,并不存在一种名为DBAP的数据库接口API。 JAVA中文站社区门户!h@!q i.o

e#m6V:w"xN|  2)c 首先不可能会是java.odbc,也不会是java.dbap,也许你最想选择的可能会是java.jdbc,可是Java类的命名者却使用了数据库圣经的名字(SQL)命名了。 JAVA中文站社区门户0c!s)h&U"ap/jv

_Nry&}*Ub m  3)a 通常是在客户端。

O'^n1d$g(|

.D O O:W)Uj(b$I D  4)a 使用JDBC-ODBC的转换器,这个转换器的文件名就是jdbc-odbc.dll。

RE"{(ENK W-H JAVA中文站社区门户|vi J\/A h

  5)b 这两个数据库接口使用了同一个设计基础,X/Open SQL Call Level Interface,它简称为CLI。 JAVA中文站社区门户BK r2JOG*i

JAVA中文站社区门户 iQM7g:[ cK+k'@]

  6)b ODBC比JDBC早很长一段时间。 JAVA中文站社区门户3y@j9Omt

JAVA中文站社区门户`%ww` x

  7)b 当然不对,ODBC也是允许访问远程服务器上的数据库的。

D|'P+E-A JAVA中文站社区门户*Pe!g-Z HRUat

  8)c 是通过真正能够了解数据库结构的,由数据库厂商提供的,专门的ODBC驱动程序来完成的。

ITNt P X

0~*vJl [$r$S#[-rgn m  9)b 对于应用程序而言,它只需直接调用提供的接口就可以了,无须去关心具体的数据库实现。

$q+y'ew&K"M7k

sUe ['~4HJg"P  13.2 用JDBC连接数据库

e,dc/kK2Y`u JAVA中文站社区门户 p0l:P4T;rN/o

  传授新知 JAVA中文站社区门户D_;| DF

JAVA中文站社区门户V$E5{^n l7Xj&I

  所有的JDBC类和方法都包含在java.sql包中: JAVA中文站社区门户4nhq:IYb&[.W

JAVA中文站社区门户,S$m9C%avM

  类别 类 JAVA中文站社区门户nR5`3Cd/}+l l/]:v

JAVA中文站社区门户!yV s a.P

  驱动程序 java.sql.Driver

j `hR`vm&B7Z

;\qc:d.^Ew} S
n:q!B']_nWjava.sql.DriverManager JAVA中文站社区门户g ~U/FJdpJ2?-r+p
java.sql.DrivePropertyInfo JAVA中文站社区门户+c9T&u9p ~s

JAVA中文站社区门户+{!b5o-J'\'j^D

 JAVA中文站社区门户/@ _J}N,`

JAVA中文站社区门户m#wnl4fW R)p

  连接 java.sql.Connection

c FS9I!nh FUL5B

.jKa^|H;A0@n&DR  语句 java.sql.Statement

Qx*Z'^[;T.S5cc JAVA中文站社区门户jgIs!S9X)\S7N

JAVA中文站社区门户3} N,i&{1Jz)f0xv
java.sql.PreparedStatement JAVA中文站社区门户&}9Qp G6t+w\M
java.sql.CallableStatement

c6R[yFgK)Eb

%pQR']o 

+fs9H.W~H { j9q

s4g5a&v3U2i'C,K  结果集 java.sql.ResultSet

.~{-rO p+E*U6~&o

&i:x g?z)H2Y,I/Xm  错误/警告 java.sql..SQLException JAVA中文站社区门户ST&bBR G sp

JAVA中文站社区门户2^aR5Q`,qWQ0^;P


CE-Cl+}jjava.sql.SQLWarning JAVA中文站社区门户pJcCmd&G

JAVA中文站社区门户/A6NG#Xhj3vn

 

HH)F\(u.q JAVA中文站社区门户x7q(S x+?#gq xz/A#C

  元数据 java.sql.DatabaseMetaData

n,PY'_/W3~[m+f0t

B\ o![$N,b$En7I
:p[!n_hjava.sql.ResultSetMetaData

"P$rs+H hH @%? e Q1H JAVA中文站社区门户H)F+E1F7Y

 

$C Z5o G'z

N%e8~fgj_6l!S};g  日期/时间 java.sql.Date

4i Ma2I-~,OQ JAVA中文站社区门户rB!I4O(EU%B

JAVA中文站社区门户dg1nJUK"OX
java.sql.Time JAVA中文站社区门户~)F4Sx,zbK7_)v
java.sql.Timestamp

4u)??|'[ V JAVA中文站社区门户+]&{@E K2G

 JAVA中文站社区门户4?#g3XZc6c&B

JAVA中文站社区门户.m_&v1@4CeX$?#aK

  其它 java.sql.Types

qs FEA;`%uI/^ JAVA中文站社区门户B@,I"R0wZO

JAVA中文站社区门户[*R p/p mdA I
java.sql.DataTruncation

#]rfx t.Zf@Q

.gT?Q;dH JAVA中文站社区门户z4Z1sI"y@7M1b

}2x+K0Sksb  表13-1 JDBC类一览表

YL#eba%z9gG

[SU+C [g b  在使用JDBC时,每一个驱动程序要被加载之前,都要使用DriverManager进行注册。当需要打开一个连接时,DriverManager根据JDBC的URL选择相应的驱动程序。 JAVA中文站社区门户1DX2yv^,eC

sA}%H%H,YEJF  同样的,JDBC也体现了Java这一网络语言的特点,它也是使用URL进行识别一个数据库的。它的语法格式是:

2fB"oO2],y#Bl1C:L(e1w JAVA中文站社区门户/r4a8z%vu8bad

  jdbc:<子协议>:<与DBMS/Protocol相关的子名字>

T/{ r VJ

8D"~2ba2Nt"X  JDBC的URL分三个部分组成: JAVA中文站社区门户9B9W^%FP$h ux

3V!s,YH+r"LJ1a e8U  1)指示部分:jdbc。请大家回忆一下,一个常见的WEB页面的URL是以什么开头的?对,http://,这个指示部分用来说明这个URL是什么类别的。 JAVA中文站社区门户9p;X9]5fzS

JAVA中文站社区门户ojp,D?8z(^

  2)子协议部分,这个部分用来指出JDBC的子协议,如odbc; JAVA中文站社区门户(Rla/\7kj)LH7NK~

)G)MT6v@%QL6Fh:N  3)子名字:数据源的名字,如果数据库是在网络上的,那么就用URL//hostname:port//来表示。

8|*e M[s HU JAVA中文站社区门户,O2i!c/`_)G

  例如:jdbc:odbc:;User=<用户名>;PW=<口令> JAVA中文站社区门户 M.t g1`#sL b

'Cj H ]3wW  使用JDBC的整个流程如下图所示: JAVA中文站社区门户t+Gs/k,}.b

JAVA中文站社区门户 c&^T a8U0kUO


nIW/bC\2Y@Y  图13-5 JDBC调用流程图 JAVA中文站社区门户+Trp(P2dZ&E)}

JAVA中文站社区门户ggr9lmr-Q;D

  正如上图所示,使用JDBC访问数据库需要经过以下几个步骤: JAVA中文站社区门户 ~'b;y z{^ CK?S

JAVA中文站社区门户 Ar6kH0~?"hE

  1) 首先,程序调用getConnection()方法,获得一个Connection对象; JAVA中文站社区门户d`+y%Gt4w2][4Jj

]NEq(zh+R  2) 然后程序创建一个Statement对象并准备一个SQL语句;这个SQL语句可以是: JAVA中文站社区门户y/\.Vn3N7[9@&T*R^

JAVA中文站社区门户1w%nyzy?zcc$Q

  a. 被立即执行的语句:Statement对象; JAVA中文站社区门户"]!k8bJ_2a

JAVA中文站社区门户$Gh;e:_,R^+h!{Q

  b.被编译的语句:PreparedStatement对象; JAVA中文站社区门户:o*ts J:C/Q

#]o wP ^  c.存储过程的调用:CallableStatement对象。

5?'Z{5sx"_\5B$k r JAVA中文站社区门户Q ns-\v J@

  3) 接着我们就可以执行这个语句(如executeQuery( )、execute( ))等,将得到一个存储结果的ResultSet对象。

4e3d{u,Cj JAVA中文站社区门户6R$`?di7{/lH~

  注意: JAVA中文站社区门户uVUEa.[HK.W j

JAVA中文站社区门户 xFM&T_,P~

  也有一些语句是完成一些事务工作,如executeUpdate(),更新。它们将不会返回ResultSet对象,因为它们并没有结果。

5a5k A?r]T

{NO)_sd6m  4) 最后,我们就可以使用类似next()等方法对返回的ResultSet对象进行相应的处理。 JAVA中文站社区门户JbT]vIqg

'\Qv#C%{%Tg  实例说明

-H%a%} EP'W(] JAVA中文站社区门户9vi.h-T7`7e

  下面,我们来看一个简单的例子。由于JDBC是用来访问数据库的,所以我们首先来创建一个数据库。为了大家都能够完成这个实验,我们就用Office套件中的Access数据库来完成这个例子。

bM#sW0X/^q JAVA中文站社区门户&`\!^8_+D SR

  1. 创建Access数据库student.mdb,在这个库中创建一个表student:

Gc.vmeF l_

5x z*w@QstJAVA中文站社区门户ne[X&g+VB*Q
  图13-6 数据库student的表结构 JAVA中文站社区门户} @Y8Zv

6i7w `h:A8V!|X  这个表student的内容如下图所示:

{BO?9Mo

cL9eiA:O:{9R!vJAVA中文站社区门户o*zj1]^ t"w
  图13-7 表student的内容

E;O tnH

(uV,O3?(tNu{  2. 当我们建好这个示例数据库student后,我们要为其设置ODBC:

e{R an-mL)is9Z

2q5u6y3FX9^"n(G-}  一些说明:

tT.cw;X&F9Q JAVA中文站社区门户+V S3s2@3^!j$j8}

  读到这里,可能有些读者会感到奇怪,我们不是在使用JDBC吗?为什么要设置ODBC呢?这是因为有带JDBC驱动程序的数据库没有ODBC那样多?我们在这里使用的数据库系统Access就没有相应的JDBC驱动程序。

i$`MJO4j*@"s JAVA中文站社区门户 j*\}r r

  不过没关系,大家应该记得在JDBC中有一个JDBC-ODBC的桥接器,通过它就可以使用ODBC驱动程序啦。

@*U eH'l JAVA中文站社区门户$[5v?&a ^w

  现在应该明白为什么为什么要先设置ODBC了吧!

7H^mr}5xO JAVA中文站社区门户R0Y\F&_]

  设置ODBC的方法很简单:

Z i5CyE4U8I}&dN JAVA中文站社区门户u-B ^Eb[

  1) 首先,我们打开控制面板,双击“ODBC数据源(32位)”按钮,然后选择“系统DSN页”,将出现如下界面: JAVA中文站社区门户+L#t:X\q i-O.lU

{J%qg A
1~ d9aDH5A4j(TYZ  图13-8 ODBC设置(1)

Zx @ t ^o j]

%P3{~T {OT"W Z2gf  2) 然后,我们单击“添加”按钮,选择“Microsoft Access Driver”,然后单击“完成”按钮:

F7_ dF:ug\Ov JAVA中文站社区门户(e?5z,fI?.ti

JAVA中文站社区门户fF,YlM/V$j
  图13-9 ODBC设置(2)

kzTSKl+r/q6p

R0I9N(B$Xx.^u  3) 接着,就会出现一个如下图所示的对话框,我们首先填上 “数据源名”:student,然后单击“选取”按钮,选择我们刚才创建的数据库student.mdb。然后单击“确定“按钮,至此ODBC设置完成: JAVA中文站社区门户n2S)G/N1F L3H G

JAVA中文站社区门户gWkk]T;A^P


N*W J p|J.^;Kh)?$B  13-10 ODBC设置(3) JAVA中文站社区门户hST8cU0{'{AD

JAVA中文站社区门户+_rQX@#p2?:C3Qoe!X

  3. 然后,创建一个源程序文件testjdbc.java,其内容如下: JAVA中文站社区门户A2g$cW+ERw

JAVA中文站社区门户 ^*@ K4R%z'HB3lR]"L p

  源程序:testjdbc.java

AW#|_l'UmcT JAVA中文站社区门户-wpGnm$CfTc c


6qrp(} Mkimport java.sql.*; JAVA中文站社区门户 ^:x lW8XO*?
public class testjdbc
(KB2j.G ex N@^6N V{ JAVA中文站社区门户/z }3sU.OT;z
public static void main(String args[]) throws SQLException
}N6rCZ } cmi{
T P:c+}]7Ntry JAVA中文站社区门户 \`8| F8p_M
{
i%q5J!L%bv~#k \lString name,sex,age,chinese,maths,output; JAVA中文站社区门户%_+v)id.t)kz b$ws'^
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); JAVA中文站社区门户6U m5siH
Connection con=DriverManager.getConnection JAVA中文站社区门户9Js'F3zl!`4m]qd
("jdbc:odbc:student");
w+unL/r%e.DStatement sta=con.createStatement(); JAVA中文站社区门户\D A2w#qB*P6K
ResultSet rs=sta.executeQuery
k0cp ?3g&P("SELECT Name,Sex,Age,Chinese,Maths FROM student"); JAVA中文站社区门户"Op F&u`@ z5OO,f*a
System.out.println("Name Sex Age Chinese Maths");
H;aX R2jjwhile(rs.next()) JAVA中文站社区门户V ?%ZP6y5nh,q
{
D8s*V@5R Cname=rs.getString(1); JAVA中文站社区门户E&[`w(C d)s
sex=rs.getString(2); JAVA中文站社区门户'v!j ?cFU#kCo
age=rs.getString(3); JAVA中文站社区门户+Y8H&O'Q'BD
chinese=rs.getString(4); JAVA中文站社区门户0x)Y6W]2L/ZA&p
maths=rs.getString(5);
@'N8dD9Soutput=name+" "+sex+" "+age+" "+chinese+" "+maths; JAVA中文站社区门户o&W#n8cR[/}@+o A
System.out.println(output);
Kp"r,Y?.R1iY Y'~} JAVA中文站社区门户1Oh2J~4h-] DX
}
2G~v5HYcatch(java.lang.Exception ex)
w1iX#j'j!A%WtEq$l{
5e?k+V(P/Dex.printStackTrace(); JAVA中文站社区门户d/^m1R;S
}
YGBcV'b}
K-V4A`?_I1r!Y]} JAVA中文站社区门户(D7n u&b ]GP:L$D F

JAVA中文站社区门户|-Ave']p[)s

 

\Y};a3@:I)I JAVA中文站社区门户B UHfK.r]

  4. 最后,我们使用javac编译,然后执行java testjdbc,程序输出如下所示: JAVA中文站社区门户2|N,ALM,m JQ

JAVA中文站社区门户2W&@"V\'[ h [


~^E-o8`  图13-11 程序输出图 JAVA中文站社区门户2M+X4H/R1F`!AM

!N^0].F-j!?s  传授新知 JAVA中文站社区门户#~8E-hz3c({%Q%tH&v

'kW F9qN5gW  下面,我们就一起来学习一下这个程序: JAVA中文站社区门户/J-K^(v K e

+Tj N#y~  1) JAVA中文站社区门户'R.^S9l&t0A9y

JAVA中文站社区门户]BY \,{s


xmU*@:?3T uimport java.sql.*;

;d])k2f!LG(},n {N JAVA中文站社区门户z6r'@pLNL\

 JAVA中文站社区门户5alr&Ds4Q

JAVA中文站社区门户,h:ijn+O$z,qf

  我们知道,JDBC的所有类和方法都在java.sql包中实现的,所以当我们的程序中要使用到JDBC时,就要把这个包import进来。否则就会出错的哟。

(Hm VCla.AC

.oB3^Vpi_)W  2)

a+N&mY5b"~[h JAVA中文站社区门户i y0h|Q|Y[:H

JAVA中文站社区门户&lkJxdL,g
public static void main(String args[]) throws SQLException

|_P:NUP

]g NUQ_C 

A)gf0v0?gWMp-W JAVA中文站社区门户gr7a5dXf

  这个语句,我想大家应该可以看懂一半,也就是直到throws之前的部分,这是定义了main方法。而后面的throws SQLException则是说明如果程序遇到SQLException错误时就忽略错误。 JAVA中文站社区门户-IO1IZ.S&p*j Hb!p

+Iuu9U*Cb{&n6x p  3)

'q|s*]Ax JAVA中文站社区门户(h#puS]#n?k


5K%@9xim0G;R$etry JAVA中文站社区门户5}:O1Y'w+E
{ JAVA中文站社区门户dY| gY\o
……
8V!g+zp's/mn&~T v} JAVA中文站社区门户&uZ jg&L
catch(java.lang.Exception ex)
1hop.A.d9u{ JAVA中文站社区门户 A3u5iVjw4S5T'K
ex.printStackTrace(); JAVA中文站社区门户j n cV4^ J,f cS]
}

R,K+BXuwoA5J JAVA中文站社区门户]X TO4kfcR

 

,O#Gkq9ma

+r1C8kyt_  这个语句,我们曾经在前面一章中做过介绍,也就是在try程序段中,如果遇到catch语句中定义的错误(在这里是java.lang.Exception ex),就执行catch程序段(在这里就是执行ex.printStackTrace(),打印出相关的错误信息)。 JAVA中文站社区门户z$U7e}1O e9GO;tRa

9o-d+gv8jd%FnS  4)

sU-{Z @6wiP%n JAVA中文站社区门户+sz-^|2C ~"C8PnG


Y9LG1B/q E O5nClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");

KI,`BB-Sa,Ut$_

F'_)v'D"L Fy.R\ JAVA中文站社区门户a'@ Zm~b

JAVA中文站社区门户.A q/Q[[^

  这条语句,大家虽然没有见过,但我想大家都能够猜出它的用途来!对,就是初始化并加载JDBC-ODBC驱动程序。

i c#S/Zgw!yI/WA2z

7^$u.g3EHW's|+cK  在JDBC的程序中使用JDBC-ODBC桥接器,就一定要在最前面加上这么一句。

4Eo:c-|2P(n1R JAVA中文站社区门户4r4DL[OI)\ap

  5) JAVA中文站社区门户+{ss1CsJiV

epR_CV
^RW(]CtgConnection con=DriverManager.getConnection JAVA中文站社区门户U+nw&{(eB-GkB
("jdbc:odbc:student"); JAVA中文站社区门户0T:gN R^TJ

JAVA中文站社区门户7UK0t8SMZ5Z q9\-MG

 JAVA中文站社区门户4[iG*qm[1R8z6F

8v8np w@*td  这条语句中,我们定义了一个Connection类的对象con,用来存放getConnection方法返回的数据库连接。 JAVA中文站社区门户KI\G(I cCnH

JAVA中文站社区门户*Ery+dpYW4y1@

  大家回想一下图13-5,在最上层,我们是通过“驱动程序管理器”发出一个getConnection方法,以获得一个Connection(数据库连接)。 JAVA中文站社区门户P3Ce9`,|i

[dtK/ZkA8K  getConnection方法的语法格式是:

8U4Xw6d)y;_

{;W'w-G{l9MJAVA中文站社区门户,~-t8[7i$MF
Connection getConnection(String url,String user,String password); JAVA中文站社区门户#[Z+FB%mPR

p[8v-e1t| r6YkJ 

f9I4a3GmKj e

;Htcv:F(w ]MT  它可以带上三个参数: JAVA中文站社区门户&o v'R4a9Zt&j

D.^ }|:I'h'GKEk  <1> url:数据库的URL。我们知道JDBC的URL由三个部分组成:

Qs[+m|4} JAVA中文站社区门户-XbGpm P}'g:M


)z@#@R3`*gzn ~  图13-12 URL分析 JAVA中文站社区门户&[XP/K9@R-\o

JAVA中文站社区门户+~f S4_/QP9t

  <2> user:用户名。象SQL Server、Oracle…等大型数据库中,均采用了用户管理,而在Access中并未使用,所以在本例中当然就不用指出相应的用户了;

U4fLNgJE

6z V!X;{&Q:s  <3> password:相应用户的口令,它是与用户名对应的。 JAVA中文站社区门户.XPVQDm N T;o

Wue*`jB W3g  6)Statement sta=con.createStatement(); JAVA中文站社区门户z(ZRw8\L

JAVA中文站社区门户6U0i:z UH yu!xDE

  我们继续参考图13-5,获得了一个Connection(与数据库的连接)后,我们应该创建一个语句(有三种方法),在我们的程序中使用了最常使用的语句创建方法:createStatement。

sDF*Ync%_0_Sl3o0C

]i$Gv5V&G` U  注意: JAVA中文站社区门户0L0^D)f%w

JAVA中文站社区门户%rXwB"al"`,m

  创建语句所引用的方法createStatement是Connection对象的方法!

8h3@2G:x6f*u1G

HdS%|Yl  这样,我们就得到了一个Statement(语句)对象sta。 JAVA中文站社区门户*?(|g u,K1x

!B5ot$o w,nWQ{*_  7)

7|v4n!D%n!D/_

_l mC\W [ a7L
)B8}(hx:O1MResultSet rs=sta.executeQuery
x~'s ] {,r("SELECT Name,Sex,Age,Chinese,Maths FROM student");

+_ khM:PlE/a

3d a m9fi!rK 

:[3DcT$]F CB/~7l*Vv JAVA中文站社区门户t m,c"Rml

  根据图13-5的指示,接下来,我们要使用Statement对象的方法来执行SQL语句,在本例中,我们使用了一个最常用的executeQuery方法。 JAVA中文站社区门户nGU3{h,B*t;c!Z6V

JAVA中文站社区门户)PZ U@K NJ

  这个方法所带的参数是一个SQL语句。

DhTz!f ^ JAVA中文站社区门户 hut5YA$~(t

  小知识:SQL语言 JAVA中文站社区门户6`s5o6TD Qr)z

}1y5xa%B$YP ~  SQL用来组织、管理和检索存储在计算机数据库中的数据。它的英文全称是:“Structured Query Language”。它是所有的关系型数据库均采用的标准。是一种专门用于数据库操作的语言。它可嵌入到其它语言中(如这里)来实现数据库操作。

}&upEVJ1U-n~/af

;k4Pp8E#P mT  例如,这里的SELECT Name,Sex,Age,Chinese,Maths FROM student的意思就是从student表中选择出Name,Sex,Age,Chinese,Maths五个字段。 JAVA中文站社区门户i0Q,sv ZK2|}e

`{,P8vXcn$Oi Rc  SQL语言博大精深,而且十分有用,有兴趣的读者可以去阅读《SQL完全参考手册》(上、下)。在此限于篇幅就不带赘述了。

7f-E\n} JAVA中文站社区门户dJ)ry#gNiwG

  执行了这条SQL语句后,将产生许多输出,这些都将存放在一个ResultSet类的对象rs中。它对应与图13-5就是“结果集”。 JAVA中文站社区门户$x[r*O3|8V#C]

JAVA中文站社区门户M2vy#A r+F-} k:k&x

  8) JAVA中文站社区门户:Yo`8MjD5x

9Q1^y0BP*KuJAVA中文站社区门户?+`~ {`
while(rs.next())
$~-P!}`+Z[&s{ JAVA中文站社区门户|0NV/}V8P,E V^E
name=rs.getString(1); JAVA中文站社区门户2y0y x*H!g
sex=rs.getString(2);
d9pM$qo Z}age=rs.getString(3); JAVA中文站社区门户,A)x"A4Fc%B+yU
chinese=rs.getString(4);
5j;l7XPNmaths=rs.getString(5); JAVA中文站社区门户"Bl TU3p%YY
output=name+" "+sex+" "+age+" "+chinese+" "+maths;
e_M}7eQ3^;jSystem.out.println(output);
/l;@1LcXiw1ps1|Ys} JAVA中文站社区门户?j@Z`

^TG,tH~9W JAVA中文站社区门户x;R2H)P$G0oa

LcY!Hw  根据图13-5的指示,有了结果集,我们就可以使用next方法、getString方法获取它们。其中next方法是指取下一个记录(一个记录由多个字段组成,在这个例子中共有5个字段:Name,Sex,Age,Chinese,Maths)。而getString则是从当前记录中取出某个字段,它所带的参数就是字段的序号。

'\2M$o vp+cA*N*N+o

Uj hr6}Fjp  一些提示:

*h? H*Eu2QZ JAVA中文站社区门户._S*}7sm-{

  刚返回的结果集ResultSet中,记录指针是指向TOP,并未指向任何记录。

AIY K|AMg JAVA中文站社区门户_.L/H,Q0j(Z.e*NM

  在这个while循环中,首先将执行rs.next(),这样,就指向了第一条记录。(如果没有第一条记录,就会返回false,使得循环结束)。然后我们就可以使用getString(字段号)来获取这条记录中的字段。 JAVA中文站社区门户x(d8| q @t"f

JAVA中文站社区门户jC[#`zVy

  当5个字段都取出来后,在程序中将它们组合在一起,然后将其打印出来。 接下来,就会再次执行rs.next()获取下一条记录,直到没有记录为止。 JAVA中文站社区门户'MG2Os$qp

JAVA中文站社区门户-s'x~,D;qj-p8qe&u

  好了,到此你应该能够理解这个程序了吧!

OK,[ m&L@8]

AoA l0p\  JDBC是一个十分强大、有用的工具,而且也内容很多,足以成册,因此本书无法面面俱到说明,有兴趣的话可以再去看一些Java的高级参考书。

%F;[ u1Xnc5S2L

teO{*s$zD  自测练习

J9I\+UrXfk6b

5e OJ%r](Fc*K  1) 使用JDBC,可分为四个步骤,请按顺序将它们排列出来: JAVA中文站社区门户/`'o6k8kS8~

JAVA中文站社区门户\p J:k.n3f9L

  ________、________、________、________。

Dy { JtJP

Z$Z/F'Q4C  a.释放对象 b.语句处理 c.结果处理 d.创建连接 JAVA中文站社区门户qFkxor

7F ^"@7cYx(CWJ  2) 在使用JDBC中,可能会用到许多方法,请将下列方法按照调用顺序排列出来: JAVA中文站社区门户 S7c"dzC.x;Zaz{

JAVA中文站社区门户"[,~Q)eL

  ________、________、________、________。

7[3s2B1`gc'h&a JAVA中文站社区门户+[.N(sQ o

  a.getString() b.executeQuery() JAVA中文站社区门户-G6B*W\BBv~)Z

JAVA中文站社区门户;Nwn"EA]NP

  c.getConnection() d.createStatement() JAVA中文站社区门户|f~l U'Y"qos%o

JAVA中文站社区门户%L,d zs[#d X

  3) 在JDBC中,使用________说明JDBC数据源。 JAVA中文站社区门户{*V5CH l-b E:_

.d'k/H p4\(U8nW*J%?dr  a.数据库名 b.数据源名 c.JDBC URL d.JDBC对象名

U9MW8O}/Y

N&f9Y z4H2F w,e  4) 在jdbc:odbc:student中,odbc是___________。 JAVA中文站社区门户)~Vs7^M)k.H:O*Y'h

JAVA中文站社区门户H}d9W`CsCT]

  a.协议名 b.驱动程序名 c.子协议名 d.桥接器

`b2X1Ih'V:M!Q

/|1z b_?6SE F1X  5) 在示例程序testjdbc.java中,我们选择出了所有的五个部分,如果我不想选择出Chinese、Maths字段,你认为程序应该做些什么修改? JAVA中文站社区门户/w?)G{ck4E5]iy

JAVA中文站社区门户R qP]W*Zsda1c t

  ____________________________________________________________________ JAVA中文站社区门户4^j Co1b.K

JAVA中文站社区门户D h;YMV x

  ____________________________________________________________________ JAVA中文站社区门户"| Cw:sKf5G

JAVA中文站社区门户T jq,N:IqJ_

  ____________________________________________________________________

(iv0f P2i*y+E C$U^ JAVA中文站社区门户g3Yv3Rs.Js7eo

  6) SQL语句SELECT的语法格式是:

;@6}5p D S u;Q

| ?tW$m3QXV  SELECT 字段名 FROM 表名 WHERE 条件语名 JAVA中文站社区门户vXfN8a'D!A

LC"uP8Q&{v  其中WHERE子句可以使SELECT只选择符合WHERE中说明的条件的记录。 JAVA中文站社区门户j,P;N\7{Z

JAVA中文站社区门户2S.n1a)OJ7R1o

  请您编写一个程序,输出年纪为9岁的所有学生的Name、Sex、Chinese。 JAVA中文站社区门户!M.sHE_

JAVA中文站社区门户-Z/JjQs;e'[ U

  ____________________________________________________________________

E;?@$Z I2H/@"r

bx1wAaK'DE8Z9mI  ____________________________________________________________________ JAVA中文站社区门户-lVt/Zt {2}*i{b

JAVA中文站社区门户#ri$h\P}

  ____________________________________________________________________ JAVA中文站社区门户`?$z:fJ!K:a

JAVA中文站社区门户/VV%]7zY+w1v)tzw I+u

  ____________________________________________________________________

h,Q%M@a.u o JAVA中文站社区门户0j b C#^ V&Tq Z9U,NoJ

  ____________________________________________________________________ JAVA中文站社区门户8Fta5S6ZD"qc(h%zv

]_ e? |;M+J9kc  练习答案

*DlaD#k@e

sIkZa0G  1)d b c a JAVA中文站社区门户7e!`+z*_L k @|

cg^7cDo.J  2)c d b a

qGx _/RS6OD JAVA中文站社区门户!^` q HX|R8w

  3)c 在JDBC中,我们应该使用JDBC URL来说明数据源;

3o6c JM%lq rM"xka

y+ma;V#gk%U  4)c 在这里odbc是子协议名; JAVA中文站社区门户j`%Hu)] r)B+Fs$@6bG

6O R#B'n+_1K  5)共需要修改3处: JAVA中文站社区门户(M.W!o;QZ.h f$}

JAVA中文站社区门户9]A9~+C ?

  将 JAVA中文站社区门户-Gj4JDv0X1D

JAVA中文站社区门户Q%q@ d!w,R

JAVA中文站社区门户7XBvf}v&`n8R
ResultSet rs=sta.executeQuery
$V/dszR+P_O("SELECT Name,Sex,Age,Chinese,Maths FROM student"); JAVA中文站社区门户1xI#p(C Hn
System.out.println("Name Sex Age Chinese Maths"); JAVA中文站社区门户CccCM[v#LN_

"Rj t!K?(z)S$TN 

nz] J(Mii#z JAVA中文站社区门户N^l,va

  改为: JAVA中文站社区门户*qSr}\ Y k

oJ lPU)?2I.Z
v-}Q}.kResultSet rs=sta.executeQuery
!GL$l%s-f7I/R4r R f("SELECT Name,Sex,Age FROM student"); JAVA中文站社区门户.e7Ui3c ?.q5~_
System.out.println("Name Sex Age"); JAVA中文站社区门户v{Il;~4n:u {:y

JAVA中文站社区门户'RzQ cg S1^

 

/E#rON)Dg JAVA中文站社区门户`'?!Q(S'X(]w

  将以下两行删掉: JAVA中文站社区门户@|9[N\9X

)j5pG[;c c4qC
1[?Q9h:^Kchinese=rs.getString(4); JAVA中文站社区门户FWOC3I l h
maths=rs.getString(5);

3a2mv}p\ JAVA中文站社区门户 O9A^K2a+In)u

 

;kVV @{N.n

7b G#|*|!I$f,K!DU;R  将output=name+" "+sex+" "+age+" "+chinese+" "+maths; JAVA中文站社区门户*D,r iG(\_M(E1og

c!IC7K#a  改为:output=name+" "+sex+" "+age; JAVA中文站社区门户 Eb _,Tg H

JAVA中文站社区门户m1M$n%C S#u(N

  7) 以下是一个程序实例:

g nE4p^G)n&b JAVA中文站社区门户J#k#NpL/?4qb:E&rM

  源程序:lianxi1301.java

Gk g?p#E JAVA中文站社区门户`(Ut&VEY K

JAVA中文站社区门户6h7g[~uf?x R
import java.sql.*; JAVA中文站社区门户.w!dg.ZP:x!h&e }aR C
public class lianxi1301 JAVA中文站社区门户h*T"M(S4b~&^q
{ JAVA中文站社区门户'uT^(J![fq p
public static void main(String args[]) throws SQLException JAVA中文站社区门户u|h~ nc-n
{ JAVA中文站社区门户 _9~$f,fN0r6H(j f]
try JAVA中文站社区门户6~;N C.y+P
{
X"[1i#R9z"Z,YString name,sex,chinese,output;
7G3xJt$nFClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");
-xM)}P whp ?3s x]"B%DConnection con=DriverManager.getConnection JAVA中文站社区门户!_DPH:ggz
("jdbc:odbc:student"); JAVA中文站社区门户L}0H%Ug"S
Statement sta=con.createStatement(); JAVA中文站社区门户&TM:p.w[x
ResultSet rs=sta.executeQuery("SELECT JAVA中文站社区门户7]/KK-t ]{-i
Name,Sex,Chinese FROM student Where Age=9");
dr&a(Rbn7oPB1tSystem.out.println("Name Sex Chinese");
O7A V2u%E1x KH4\lwhile(rs.next())
5G"Q+N.B z)m `{
XBb{D3xhname=rs.getString(1); JAVA中文站社区门户BQ BA9w-ml|A k;F
sex=rs.getString(2);
Y(I;tJ%OgL%Bchinese=rs.getString(3);
2X.xYw'j-@%[output=name+" "+sex+" "+chinese;
M.F"N U4i dr"dSystem.out.println(output);
\|YJ3]/rP f}
7? h9vM'S*v$b} catch(java.lang.Exception ex) { JAVA中文站社区门户b5D+Mo&~f9]
ex.printStackTrace(); JAVA中文站社区门户"GZTYD ?
}
R%Zhu6Jha5D8|}
0Fx|?(~)C}

*iWWxgT JAVA中文站社区门户&B+b:Y2Tqn

 

!Vd&^UFX%Lt

_\V'{ uM ql  程序的输出如下图所示:

~ xYj*a$Qka JAVA中文站社区门户YT5^,G3X8J

JAVA中文站社区门户']&R SWs
  图13-13 lianxi1301的输出

PyL5kO{1HeM~S

&XAp[o5A-qU  13.3 编写多线程Java程序 JAVA中文站社区门户)Ct1G/t[hd'S-[:KWe&r

Iz0yp6}'}/lK4A)`$MV  传授新知 JAVA中文站社区门户9[@;v%B:L{

JAVA中文站社区门户7Jr A3V4I

  在今天,是否支持编写多线程的程序,已经成为一个程序设计语言的重要方面。那么什么是多线程,什么又是线程呢?

\ @H,a*e(Mof'x5T

fI1oTt2W  要搞懂什么是线程,其实就是要能够清楚地区分三个概念:“程序”、“进程”、“线程”。程序嘛,大家可能够很容易理解。比如说,“写字板”、“Word”,还有我们前面写过的程序。那么什么是“进程”呢?

^ G:c G/H-S JAVA中文站社区门户s.X(F~]5oW5o

  在许多计算机理论书籍中的定义十分拗口,对于您来说,只需记住:“进程就是一个运行着的程序”。看到这里,可能有人会说:“唉,说了半天,进程就是程序呀!一回事嘛!很简单,我懂了”。很遗憾,我得告诉你,这样的理解是错误的。请看下图:

kMM{O1U@5y

*C/[8?`W?)kM6p
2qW]0U+S5TZC F+g(?  图13-14 进程示意图 JAVA中文站社区门户UK$b6O e0E~'f

JAVA中文站社区门户|4ct:a{w

  我们启动了两次notepad,就出现了两个记事本!而且,我们还可以在这两个记事本上写上不同的内容! JAVA中文站社区门户6u:ljc}2o

JAVA中文站社区门户m,j d*@%`'l1d/N8OXo

  它们不是一个程序?它们可都是notepad呀,我们把这两个运行中的程序称为“进程”,不同的进程是完全不相关的。它们都有各地的内存块,用来存放运行时的临时数据(例如,在两个记事本上的写的字都是存放在各自进程的内存块中的)。 JAVA中文站社区门户w,`5WU$Y#\+K#[c

JAVA中文站社区门户eh,ogDc1l#o

  不知大家是否有过使用DOS操作系统的经验,在DOS中一次只允许执行一个程序,用刚学会的术语来说,就是只有一个进程。这种操作系统被称为“单任务系统”。 JAVA中文站社区门户u~\Ta

{G(O\\M(~  而在Windows中,我们可以允许执行多个程序,也可以将一个程序执行多次,这种操作系统就是“多任务系统”。操作系统负责协调这些运行着的程序---进程。

tR*n(k lVy)n[:X JAVA中文站社区门户[*Z-h:SP#Fm`a9I

  正如下图所示,在这种情况下,存在着互相不干拢的多个进程:

8A,?+N.~e HX&m-p JAVA中文站社区门户E5B7q)V"a3i

JAVA中文站社区门户R ?]D+z&k6dT){
  图13-15进程示意图

'sN\E,[(L JAVA中文站社区门户!i8r%~0{ ?!L x

  每一个圈代表一个进程,圆圈是这个进程的地址空间、寄存器……,中间的长方形是进程中的程序段,而黑色箭头则是程序计数器。 JAVA中文站社区门户Ybw*}xo

@O}`e {1OFz8K  这个进程获得执行权时(CPU时间分片,轮到它),就从程序计数器开始执行。在程序时所有的数据都存放在自己的地址空间里(圆圈中)。

I}&s I_n)w JAVA中文站社区门户TGR3x2IC[

  一些提示:

kT&`9b4Z)_;Idi6q+_

5v3}*f*@#mh`gt  操作系统其中一个职责就是管理进程,为它们分配不同的存储区域,如果让这些“圆圈”相交,程序就会崩溃,Windows就蓝屏了!! JAVA中文站社区门户(Y^w3Z5K7\8_1B9C }r

JAVA中文站社区门户S D2LY ~~

  这个机制看起来十分的合理,不过遇到有些问题时,就会感觉到它并不是那么尽善尽美了。例如,我们有一个程序用来完成从远方接收信息,然后将其打印出来! JAVA中文站社区门户 {7u#L5H;? {

JAVA中文站社区门户}bjXJ6r a7r

  这个程序在工作时发现有这样的问题:当打印机忙的时候,这个程序无法打印,它就被“阻塞”了,一直在等待打印机空闲。在这个等待的时间里,也无法接收信息了。

%A Pf,FOiUC+Z

R-@8~I/mR  这时,我们就可以使用“线程”来解决。 JAVA中文站社区门户0MX*v7\#e8M

[/~x3p6jPP$~mJAVA中文站社区门户%nh.Y5K-J!Bn&P_M
  图13-16 线程示意图 JAVA中文站社区门户:x:P!G%_W)eV(U,G

JAVA中文站社区门户%nY^VU@

  上图中,圆圈仍然代表一个进程,但我们在这个进程中有两个不同的代码段,它们共享进程的地址空间、寄存器……,一个负责接收远方的信息,另一个负责打印出来! JAVA中文站社区门户J"h `.d#s

K1^*NMa5d1[  这样,如果遇到打印机忙的时候,也只会将负责打印的那个部分“阻塞”,接收信息还是照常运行的。 JAVA中文站社区门户^;j0A!`]

0M9@ pNf!L&J  这两个不同的代码段,就是线程,也称之为轻量进程。我们发现在一个程序中使用多个线程将会使我们的程序更Power!

*\V:@!ng;F

5u,S pu#IF  注意:

6a5x(KwH3u5o7b$^r[r JAVA中文站社区门户6d(VsBY$f j9y

  线程的实现是要操作系统支持的,要写多线程的程序则需要编程语言的支持。Window操作系统是支持多线程的。因此我们只要使用能够支持多线程的编程语言就可以写多线程的程序。Java就是一种能够支持多线程编程的程序语言。

Be5E3l3ebJ

y @ te k WwO"M  多线程的程序设计是比较高级的内容,而本书是一本Java的入门书籍,因此我们只对其做一个简单的介绍,使得大家通过本书的学习具备自学编写多线程的Java程序的能力。

x^3c9w:N(ph+j k\ l+co

^7F!mz'dP qdTA;p  在Java语言中,可以采用两种方法来实现多线程:

4n,pGqOEWbo

4?k0b:O J+u0\FV  1.继承Thread类 JAVA中文站社区门户P(@8kV$_

JAVA中文站社区门户8sz!x#s5\aeQ

  也就是说,创建一个Thread类的子类,如:

7IZ B8i0KR$O

+VWp M-\q/X,zMJAVA中文站社区门户|\&d1}5rdf
public class testThread extends Thread

qo4?%Ip,K

'Ff2Ih,@ DkP 

+`3e.p!wkU,}K JAVA中文站社区门户7oCU @?4QMn

  由于这种方法显得较为死板,所以我们一般很少使用这种方法。

OG};yo6{_ Z U

%B] @V(e&S d iM  2.使用Runnable接口

+C'G:?8x m0| KV8h JAVA中文站社区门户[9pO"`q] }hdoVf

  正如前面所说的,通常我们希望我们的类扩展其它类,而在Java中又不支持多重继承(也就是同时继承A、B两个类)。我们必须解决这个问题:

W&HL,Kf2t

`[)cj$YwR  一些提示:

0B;\,Og(BT%vi5R;vL

Q3|nQ3iF7Y D7n  例如,我们想在一个Java的Applet程序中使用多线程,但我们要编写Applet JAVA中文站社区门户C l9B@?gx#p(f

JAVA中文站社区门户*e RMjzk]

  程序就必须继承java的Applet或Japplet类,那我们就无法再继承Thread类。因 为Java是不允许一个类同时继承两个类的。 JAVA中文站社区门户,o&u$I5u*Y4N'hv

JAVA中文站社区门户S8s ^DX_vhQ|

  Java提供了一个Runnable接口来实现这个问题。 JAVA中文站社区门户? WD*qdkjI:j

JAVA中文站社区门户,E'd|)c/p]

  1) 使用Runnable接口,首先在类的定义后面加上implements Runnable,如: JAVA中文站社区门户#SzP EE @ _ Uuk}\

JAVA中文站社区门户(q6R(A s4M9W G'D

JAVA中文站社区门户'g9b\G/R?
public class testThread extends Applet implements Runnable JAVA中文站社区门户,l MIH1DUSxR&c

JAVA中文站社区门户+EN.c G:l4s

 

Et?B9A0H JAVA中文站社区门户 X4r j"XC8[[

  2) 然后,再重写定义一个run()方法,定义线程要做的事情。 JAVA中文站社区门户8bKAW`/@

JAVA中文站社区门户.{R@O#J

  实例说明 JAVA中文站社区门户xsIXNN8b WM

V@qm0S_ ~  下面,我们就来编写一个多线程的程序。首先创建两个源程序:testThread.java和Threader.java。

w nm#_da_

z'U Qox `'ryy2o!E  源程序:testThread.java JAVA中文站社区门户 ?'FGbZ b.` x

JAVA中文站社区门户)NXQ:nL


@8CW PVGbgimport java.awt.*; JAVA中文站社区门户5W%r~^&rrf u
import java.applet.*; JAVA中文站社区门户.Y$x rg(ru p d
import Threader; JAVA中文站社区门户(SN#l7M'PDfg
public class testThread extends Applet implements Runnable JAVA中文站社区门户%Ov2` ^t3l N
{ JAVA中文站社区门户5N/m5d&| t,i
Threader theRacers[];
c__sb8b tstatic int racerCount = 3; JAVA中文站社区门户,N |?,t,E:C
Thread theThreads[]; JAVA中文站社区门户 J vQ3TU(uy
Thread thisThread; JAVA中文站社区门户6qic d'Qy9i
static boolean inApplet=true; JAVA中文站社区门户bq~({ SVs
int numberofThreadsAtStart; JAVA中文站社区门户-q)U4I6Bg
public void init() JAVA中文站社区门户+B `w"o!II
{ JAVA中文站社区门户+p~f2s Z(j'u
numberofThreadsAtStart = Thread.activeCount();
5G,I6QH7EsetLayout(new GridLayout(racerCount,1));
:L/e*i;_|PtheRacers = new Threader [racerCount]; JAVA中文站社区门户f9L6G1aL4r
theThreads = new Thread[racerCount]; JAVA中文站社区门户u"B,k4I-QY2Zu
for (int x=0;xnumberofThreadsAtStart+2) JAVA中文站社区门户3E_{5q#s8?El
{
q(^RNh#j#Dtry JAVA中文站社区门户"xN.r3_sI(z$O
{ JAVA中文站社区门户vw;s2S8Y(\3Q[K
thisThread.sleep(100); JAVA中文站社区门户@hS"q*hn.YD.ld
} JAVA中文站社区门户tb%aT@(Z
catch (InterruptedException e)
vd8O^t[{
*x3I^ XV4O.X^System.out.println("thisThread was interrupted"); JAVA中文站社区门户E*C#o)E ~9XY)w0c$bp
}
p7y:o7Pv} JAVA中文站社区门户]x'Z\)V L$Li,u*O L]
if (inApplet)
g p3Q zjQ4MT4B{
G+j{%?`0H(}pstop();
w.Z(v7l,Drdestroy(); JAVA中文站社区门户A(hr Y/Q
}
K1K#h%NdEo$f8Delse
3l%\%M7u(H3jn3aSystem.exit(0); JAVA中文站社区门户,YR%x&M]0j#q^G O
} JAVA中文站社区门户@Fbxn
public static void main (String argv[]) JAVA中文站社区门户/n'E8L2A!E UVl%H
{
Ev(zD!|1linApplet=false; JAVA中文站社区门户N;UOW/F9fH W;?f
if (argv.length>0)
ug^g| Q$v%waracerCount = Integer.parseInt(argv[0]);
3H~6p(D*U%Zb/Gt9t rFrame theFrame = new Frame("The Great Thread Race"); JAVA中文站社区门户,rE"O s9QIB$|
testThread theRace = new testThread(); JAVA中文站社区门户 r?{ L5MK5I
theFrame.setSize(400,200);
L;QD0ey]C+P&}theFrame.add ("Center",theRace);
g`:\;fAb%q(f0]theFrame.show();
|.uLhgntheRace.init();
TI"v7i qS? ktheFrame.pack(); JAVA中文站社区门户'xv+yQA9z(I0mb
theRace.start();
zB0w3s;T }} JAVA中文站社区门户1z f0M'B:a {Q*L[X
}

1E&lSF1X

6B0hb ?3G JAVA中文站社区门户"lLHZ2@1[

d2@r?q/D#W-f  源程序:Threader.java JAVA中文站社区门户:m1}]mh

OrW~!y d T\4F(CJS$o
r? kzVh1Uimport java.awt.*;
atVKLY;{4v1]y6Upublic class Threader extends Canvas implements Runnable JAVA中文站社区门户g'eQz$D1F
{ JAVA中文站社区门户Winr/o
int myPosition =0; JAVA中文站社区门户,bq9u0Xe\&qB9A
String myName;
P&@oM5F0?7DPB,kint numberofSteps=600; JAVA中文站社区门户9m/|N#P1IN
boolean keepRunning = true;
FV&])Z ypublic Threader (String inName)
_X9O A\*{'`y,L:T G o{
c+HJ G4@O0KpmyName=new String (inName);
aIyE}ul;y(K} JAVA中文站社区门户wt&^ Jg\,??
public synchronized void paint(Graphics g) JAVA中文站社区门户B}8BZ cgB6f
{ JAVA中文站社区门户0eR9Dj"Ir
g.setColor (Color.black); JAVA中文站社区门户j,E`/N"TKhL
g.drawLine 0,getSize().height/2, JAVA中文站社区门户uFne BV}6s
getSize().width,getSize().height/2); JAVA中文站社区门户/{5CS5o'iy|w
g.setColor (Color.yellow);
-e:RH:EJ/T!@#T;Qg.fillOval((myPosition*getSize().width/numberofSteps),0, JAVA中文站社区门户 za7zg.\+bg(X
15,getSize().height); JAVA中文站社区门户&Z2\EV \
} JAVA中文站社区门户 O%U8w3O,`Yf&DB
public void stop() JAVA中文站社区门户!w/Pw?TE
{ JAVA中文站社区门户1g)e!hzdI
keepRunning = false;
2G(|Ft$N{,pa;s ^}
W9rt Z4CO:Wypublic void run() JAVA中文站社区门户;a xC/f,I4r;WU-L2r+z
{
dT7P#G:z/@ e&Ewhile ((myPosition

F8z6z*Y[Y&l{m3z

2G SK a#]p6b7cJAVA中文站社区门户:?2Q0La` | H?
  输入完成以后,执行以下命令编译:

\8@MMn'O[:{8i JAVA中文站社区门户*x\9S.w,m*D


U2STJ!{akjavac testThread.java Threader.java

bERQ1i Z2~:js JAVA中文站社区门户;t@wT*EY ^

 JAVA中文站社区门户UII:FGc_$j2f+r

JAVA中文站社区门户h? c2V1I&epB y'^

  然后,我们再执行命令:

hc;]_%z0a

:g1tnY2E {,?8i
cbz.w#{K2K _java testThread

-n[8KC]L

3L ?`)zc4P? 

@ xh tsB0zW6jf6M JAVA中文站社区门户2eb)wi _,F'wF:w

  程序的输出如下图所示:

:yd?4F!W!F Z}l

S;H }$[qf5f%{;{jJAVA中文站社区门户C^7?8o%r Oto?"b
  图13-17 程序testThread.java的输出 JAVA中文站社区门户 {Lw.xG}

JAVA中文站社区门户8L(U/JGY%VM9[0@

  你看,三个人在赛跑!看谁快,他们太接近了,谁是第一名呢?所以我们来看看在DOS窗口的输出:

'R|/I{ k&l#P2s JAVA中文站社区门户.|l4YLa$Nv

JAVA中文站社区门户7|?!o,Sx)d~}
  图13-18 MS-DOS下的输出

#s:}EF \_ JAVA中文站社区门户 w.K ?F1r8Ki7V!U9M

  我们看到,程序的输出给出了公正的判决。第一次赛跑(第一次运行这个程序),冠军是第三道(Racer #2),第一道(Racer #0)屈居第二,第二道(Racer #1)是最后一名。第二次赛跑时,第二道反而成为了第一名。我们再运行几次程序,就会发现每一次的成绩都可能不同。你来可以使用以下命令来让更多的“人”参加赛跑: JAVA中文站社区门户1XQ'oy$N U

JAVA中文站社区门户#Et7gNj


xXe/t:t!B vB"c6N"sjava testThread 5 JAVA中文站社区门户1u!w9D?1fYi

:]a!kS4QO 

o z4u[jn.F-W:l[

:h-t y iLh$mGM.O  传授新知

%Vj~(`)_ _O;i JAVA中文站社区门户p R]b5^ s-I[ D!dB

  这个程序太庞大了,也许会把大家吓倒!我们来看一下这个程序结构。这个示例由两个文件组成:testThread.java和Threader.java。 JAVA中文站社区门户'g^qy)p3{

JAVA中文站社区门户 B;b s){VID

  其中,Threader中定义了竞赛者对象,我们先一起来看一下这个类:

RB4h q0O

v[?M2NU  1) JAVA中文站社区门户2e*I)Tj1N5pyac

JAVA中文站社区门户b_5\V0R


.K@P-@W#[#Tpublic Threader (String inName) JAVA中文站社区门户%p6` j kz^(\
{
Sb evs,BmyName=new String (inName);
uB'HDWF+}}

.H.yB4G/V+P5O }1tfruU JAVA中文站社区门户D#uw:B2x6{3gD

 

{ B1H {o)L3A

4A!kbT'W.U  这是类Threader中构造器方法,它为Threader设置对象名。 JAVA中文站社区门户1L2j!c9{(Y"XftR_g6k

"_'?l| v`,Y#i-z  2) JAVA中文站社区门户4{ \4B#| Ci4z

q5i R+I*qJAVA中文站社区门户!Zt[;l?_w,E+}
public synchronized void paint(Graphics g) JAVA中文站社区门户1s"v)m9{&^G8^}
{
)Mjt X?3pb w1C4Og.setColor (Color.black);
D(G%qf8mWl-cg.drawLine (0,getSize().height/2,getSize().width,
4mWSkI"U9WgetSize().height/2); JAVA中文站社区门户 G*EbL E:p.aN7L
g.setColor (Color.yellow);
5e a e9L+c(g:W~g.fillOval((myPosition*getSize().width/numberofSteps),0, JAVA中文站社区门户K8Ro!eTuE
15,getSize().height);
|w4U,v9CB3w}

b*i%M&F0Q pgs3A'c

m0yj-V$d(lk\ 

TKsP|l JAVA中文站社区门户 ` \ ar D? j&^

  我们为Threader类定义了一个paint方法,我们看一下这个方法做了些什么: JAVA中文站社区门户2U2Q*ymVf5_9`

JAVA中文站社区门户3j9KJD*b|)MBA

  前两条语句用来画出这个竞赛者(Threader)的赛道,一条黑色的赛道!这条赛道用一根线来表示:它从(0,getSize().height/2)到(getSize().width,getSize().height/2)。也就是一个从最左边到最右边的,位于中心的黑线。 JAVA中文站社区门户\w2BP{U:p+ZU*r/{ d

4MO0?Q3U;\  然后,我们画出这个竞赛者,它用一个黄色的椭圆来表示。这个椭圆宽15,高为整个格子,位置由变量myPosition决定。 JAVA中文站社区门户hB#qBK ul ?

JAVA中文站社区门户 sot7RW[

  一些提示:

l1W0t.U(Dq JAVA中文站社区门户3{}6x.XR.k;P

  我们将myPosition的初值设置为0.将整个赛道分成numberofSteps步,即600步。MyPosition每加1,就走过一步。 JAVA中文站社区门户#r{!HCED+Z(P,KW:i7M

0d+\P&y%jo,S7T4D4|  2) JAVA中文站社区门户y,xO)A;pa"Njd

2p#~4G}.N$b
3^*J%T[t6dpublic void run() { JAVA中文站社区门户+U(V4}'LbC l'aTE8y[
while ((myPosition JAVA中文站社区门户e[1^5B8dH$VPY P

$XG[fVpJAVA中文站社区门户DD9H[lb-y
  这是一个while循环,当myposition小于numberofSteps,就将myposition加1(往前走一步),然后重画(这样这一步就会显示出来)。

*A0jp$C u ^EE JAVA中文站社区门户5t.`,Cb/LhjfH

  如果myposition=numberofSteps时,意味着什么?对,意味着走完了赛程,因此,打印出完成信息。

i pzy%R!?5{6IW#x} JAVA中文站社区门户]Gv],C l

  大家看到,我们重画后,我们使用了这样一条语句: JAVA中文站社区门户Ax\(E0I?

JAVA中文站社区门户8}5u xJ0|a

JAVA中文站社区门户9f/AS!NLH\nT
Thread.currentThread().sleep(10);

:Ujh/K;BNS&A3O

M c_B!}Ca 

Ww+Sr2[._s

@*d o _$M D3M  这是让当前线程进入休眠状态一小会(10个时间周期)。这是为什么呢?要理解这个问题,我们需要学习一下CPU是如何管理这些线程的。线程与进程一样有三种状态:

q)u^6`(S_cgu4g

-y1[*DBDoNT}0S%I2?  § 运行态:线程正在运行; JAVA中文站社区门户"C~!F6?X X

LCI |C+M*p_h ff  § 就绪态:线程一切就绪,可以运行,正在等待CPU运行; JAVA中文站社区门户3^lb1w6|{

Kq!kj/OQ| C  § 阻塞态:线程未准备就绪,正在等待某个条件。

z(K5K)Je(B}8F2h JAVA中文站社区门户+O%oT2`4H\K7J2Q

  其间的关系,如下图所示: JAVA中文站社区门户f,L r0i'm p~*]Eo

JAVA中文站社区门户/W\&c{%W M[Q

JAVA中文站社区门户a|1I4O$K N Qx)D*l |
  图13-19 线程状态转换图

-kE6H*SJ:` u7|3u

{&]/A:hG1o  由于在单处理器的系统中,一个时间内CPU只能运行一个线程。所以如果我们在每个竞赛者跑一步时,就让它休眠(进入阻塞态,等待休眠时间到),这样就不会让一个线程一直占用CPU,以免不公平嘛! JAVA中文站社区门户1{+pnr.r0B

C3` d+D/ea  由于我们让线程的休眠时间比较短,所以一会就回到了,这时线程就进入就绪态,等待CPU有时间的时候运行。CPU呢一有时间,就从就绪的线程中选择一个来运行。 JAVA中文站社区门户\]GQ%e

1Q~ M \ D.U p  大家看到这里,可能早已昏头转向了,下面我们举一个生活中的例子来模拟一下这个情况:有三位职员(对应程序中的三个竞赛者、即三个线程)要向经理(对应运行线程的CPU)汇报工作。但这个经理采用了一个十分公平的方法(当然在现实生活中是不可能的)来接受三个职员的汇报。也就是每一个职员一次只说一句话(每一个竞赛者跑一步),然后就呆一边休息一下(休眠10个时间周期),然后从另两个职员中任选一个来说(选择就绪的线程)。也是说一句话,就让他休息。这样周而复始,直到他们都汇报完毕。

7r#U/j^)G,PV^)S JAVA中文站社区门户[+C H'F sUC.B7X2A;r

  情况如下图所示: JAVA中文站社区门户@{'AK.D4G)uu

JAVA中文站社区门户)Tt3]\7qgD

JAVA中文站社区门户5F.v N0Si
  图13-20 竞赛者线程示意图 JAVA中文站社区门户+y~Di kWU3Q!k-jh'y

8V}(U Q{2|;G W  一些提示: JAVA中文站社区门户v,p0LQ {3RtG

8urmmi.Dky  以上所述的关于线程的描述,是基于支持多线程的系统。如果不支持多线程的话,这是不成立的。在不支持线程的系统中,则将线程改成进程就行了。 JAVA中文站社区门户9U5d,? W I4F7Q"d"P

JAVA中文站社区门户HUOiB7N

  接下来,我们看一下testThread.java程序,这才是我们执行时的主体部分:

]QMz&Gm[ JAVA中文站社区门户 JL l3@sb1xGF c

  3) JAVA中文站社区门户#T2Ml5F3q d.I{

JAVA中文站社区门户'Bp)nQ+iB


Ay8N lN1lC(\public static void main (String argv[])
G$Ssox{ JAVA中文站社区门户,z^Cv |Q+OjX9kG
inApplet=false;
A`1DyPd-^s!^if (argv.length>0) JAVA中文站社区门户Jq k.l)L5jr
racerCount = Integer.parseInt(argv[0]);
AEA [3vq[1IK,CFrame theFrame = new Frame("The Great Thread Race"); JAVA中文站社区门户N/P6lw%n#b
testThread theRace = new testThread(); JAVA中文站社区门户W }7w0`tK
theFrame.setSize(400,200); JAVA中文站社区门户Q;GUO(cu$X
theFrame.add ("Center",theRace); JAVA中文站社区门户*D ?X1Gy"FAF
theFrame.show(); JAVA中文站社区门户 j5I:C3vr G#v^.U*T7i/G
theRace.init(); JAVA中文站社区门户5O:r*JB@ J*mx
theFrame.pack();
%}:HI9|:f K {DStheRace.start(); JAVA中文站社区门户$D?F"n7j5j0X~^
} JAVA中文站社区门户"{Rcf.Gl_m

JAVA中文站社区门户j%V5p RR]6_1m

 

c(WPl!A

W%F3H!G9NH(e)l  这个程序执行时,首先将运行这个main方法。然后通过判断argv.length是否大于0,如果大于0,就将执行时所带的参数赋给racerCount(参赛人数),否则就为3(在程序的开始处有定义。 JAVA中文站社区门户'FW H0{O

f5k}8ca  然后创建一个Frame,然后调用init()和start()方法。

'I] V%W!B.s(U

%?~6k&R*hgk9e  一些提示:

Y9LL*[7N4]7^

y%G(Y.z#My{*~  注意,在这里我们创建一个testThread类的对象theRace,通过它来调用。

+BI6~sz

S~ y b g\  4)

4bU:P`S JAVA中文站社区门户!g,])ttdm\


/J4E I/UYf,l?[nfor (int x=0;x JAVA中文站社区门户4q-Y ? {d'~

k]^1q `.C
ViJ+R(h7K&Q [  在theRace的init()方法中,最主要的部分就是这个for循环。通过这个循环我们创建了racerCount个Threader(竞赛者),并将它们命名为“Racer #x”,然后设置它的高度(整个Frame的高度/竞赛者数)。最后调用Frame的add方法将它们显示出来。 JAVA中文站社区门户3v?{ tT6k

$IXHI'x?6O  然后为每一个竞赛者(Threader)创建一个线程Thread。也就是说为每一个竞赛者创建一个线程,用这个线程来控制它。 JAVA中文站社区门户tm4Ok,S'TI4H8HX

'Pf9Q Bw3ct$A  一切就绪之后,我们就要开始“赛跑”了。

1N$}H} Pf JAVA中文站社区门户(o5X2O J*Jqro\

  5) JAVA中文站社区门户Dj^*@x(Y/["jJ~

JAVA中文站社区门户7C} }"~-cO


S&SV#z D;eF(w4ARpublic void start() JAVA中文站社区门户4`-nM%t5n
{
mx,[ rx5Sfor (int x=0;x

#analH"SP

^e(e t,@J&Q/W;SJAVA中文站社区门户h6]f-{b(Z
  接下来,我们调用了theRace的start()方法,我们看到在这个方法中,我将启动了“控制”所有参赛者的线程。(调用Thread的start方法) JAVA中文站社区门户k&DzMZ(|9mf4H:gJ

JAVA中文站社区门户?~d0KS?

  多线程编程是相当复杂的,本书中仅给大家整理一下思路,做一些简要的介绍,大家可以阅读一些更高级的Java书籍,来更深入地学习。

6K)t"R,\,Be

`OHOQDyC/g fsUz  自测练习 JAVA中文站社区门户 vOy4[#~{l+k Aq4~-vm

&p9KiT|%W+F4d  1) 以下关于进程的说法中,____________是正确的。 JAVA中文站社区门户.Z:G-v;p'wV v

JAVA中文站社区门户KF#hl Nj"R

  a.就是程序 b.一个运行中的程序 c.由线程组成

FX]!jS6xZ

%Cz]$rXE  2) 以下关于线程的说法中,____________是正确的。

8YV_f;wcM JAVA中文站社区门户 v4Eh`7J]

  a.是一种轻量线进程 b.一个进程中只能有一个线程

2y1`w3| `KJ JAVA中文站社区门户.g Gp"x1GG

  c.每个线程都有自己的地址空间

NT!IC@.F9cT JAVA中文站社区门户/GU&b6P[1G3i9{

  3) Java语言中有两种方法实现多线程,它们是__________、 ____________。

,vW a:D6z;H V&]

n"Hq)hc1Zgi6e(o  a.继承Thread类 b.继承Threader类

B Q*n/Y*^3YJl

h!Kn#K"nd'F*p  c.使用Runnable接口 d.使用Thread接口

+r4^"l2M)E};D JAVA中文站社区门户!Yr O1Q(p&Mk

  4) 最常使用的多线程实现方法是__________。 JAVA中文站社区门户.qU]*t8mjLx

|4IO)N%No  a.继承Thread类 b.继承Threader类 JAVA中文站社区门户ZJ!v*c)cz

JAVA中文站社区门户^8bv@6un-{4W$Q

  c.使用Runnable接口 d.使用Thread接口

%A WHvyg9p*k

h Y Eb/FU&HS  请说明理由: JAVA中文站社区门户2adWZS$k SDEcq

K.SI {7is  ____________________________________________________________________

0?;Uq j%U*u/~.e;_ JAVA中文站社区门户fVa:n*\W.\R5|n

  ____________________________________________________________________

L M;l0?9g{'|sw*Tb\ JAVA中文站社区门户$N:^)T_uRH^Z z

  5) ___________不属于线程的状态:

.hD(H6xZj'e r JAVA中文站社区门户^-I4fV j;[v5S/L

  a.运行态 b.完成态 c.就绪态 d.阻塞态

E,b0vH9yY}@4m JAVA中文站社区门户:nf'?^]X*v

  6) 请描述出使用Runnable接口实现多线程的步骤: JAVA中文站社区门户 iWchxk*a%`y

JAVA中文站社区门户R3QN3QH'lt t

  ____________________________________________________________________

p8B4w8K T2_

V&FW Hv1^1qZ.q`  ____________________________________________________________________

mh'Z T2y`'Sf

_yz Y_RW"pM6L!W  ____________________________________________________________________

YfxRe JAVA中文站社区门户 xZ#gM+H&u

  7) 如果我们使用java testThread a来执行这个程序的话,就会出错,请问这是为什么?请说明: JAVA中文站社区门户 s3Y0F7hT*?

JAVA中文站社区门户!w2M$GTd

  ____________________________________________________________________

bgx?JWh

3I0HO {L+p  ____________________________________________________________________ JAVA中文站社区门户#\!r!Ps1n3k]

!hnUv4P&L  练习答案

FNf6E+~!A ^U9M

5x.Er/e!a  1)b 并不是所有的进程都是由多个线程组成的。进程是程序的一个运行实例,它与程序是不等价的。

V O0fr(o&q JAVA中文站社区门户{/Lg,hkmP

  2)a 在支持线程的系统中,我们可以在一个进程中细分出多个线程,但并不是说每一个进程中都有多个线程。在一个进程中的线程是共享地址空间的。线程,也称为轻量级进程。

d |Hg6lik Ym:v JAVA中文站社区门户C3O$bU mb*D

  3)a、c 有两种方法,分别是继承Thread类,以及使用Runnable接口。

H,qD I2l/U JAVA中文站社区门户L%HW_n Hy

  4)c 最常用的方法是使用Runnable接口。 JAVA中文站社区门户$O)nW+U _e R,|

+VEn^q2y L$TF  这是因为,我们经常需要继承其它类,而Java又不支持多重继承,所以使用继承Thread类有很大的局限性。 JAVA中文站社区门户/|)BQ/j[w2WQ

JAVA中文站社区门户%\L5|3k9H Bu

  5)b 当一个线程完成后,就释放了,并不存在一个完成态。

x9|O,N7l#rcl^ JAVA中文站社区门户L,IZ)\7o$V8H:wo4mq-|,p

  6)第一步:在类的定义后加上implements Runnable,以使用Runnable接口;第二步:重写定义一个run()方法,定义线程要做的事情。 JAVA中文站社区门户W#uQ{G0Bo'y

JAVA中文站社区门户'Lte7f({m `

  7)将会出错。这是因为我们希望参数是竞赛者的人数,也就是需要整型数,而不是字符型。如果输入字符型就会造成程序出错。

3EQR2R(xW JAVA中文站社区门户x,[(CX7~3Q1U] bEd7d

  13.4 JavaBeans JAVA中文站社区门户|g9|;HTN

JAVA中文站社区门户Q5t%^ cA/_1P

  13.4.1 什么是组件(部件)技术 JAVA中文站社区门户0OvxHQ ?6S)e@+L

s$D/G w+T0LF1P g.RB  传授新知

-y4^oZlFC V

&o5G l!MoW4fAd2Da  通常,我们开发一个应用软件时,都是事先经过需求分析、设计,然后开发出所需的软件。在这个软件系统中,各种功能、特性用固定的方法联系在一起。但是,软件的组成部分大多无法独立地删除、升级。

7dl;hiN7ME JAVA中文站社区门户&y7Y:N(k(P&VZ0h

  这样造成的结果就是,不同的应用程序即使用同一种编程语言,在同一台机器上使用,也无法互相利用,它们之间就象是陌路人一样。 JAVA中文站社区门户9Tni7t$K9y*?

6d il8vUgg&I  另外,由于操作系统不同,使得在不同的操作系统上完成一个相同的工作,往往实现的方法也就不同。尽管,国际上有许多标准化组织制定了许多规范来减少各个操作系统的开发接口的不同,但是这也只能够是一个权宜之计。

#B:AK\H2bp JAVA中文站社区门户N]U Um?8Q+P(}E

  但是随着应用的不断扩展,经常需要让那些基于不同设计的软件交互,甚至一起工作。传统的方法是通过一组系统服务API(Application Programe Interface,应用编程接口)来实现。其工作原理如下图所示:

-]%\oN2] W2\'a JAVA中文站社区门户5vF+SD|F$qt$o

JAVA中文站社区门户v`gt hV[.C
  图13-21 通过API来利用原来的程序功能 JAVA中文站社区门户1\'x4Dxe{ c

8me2i5XK`/]-j&Z,l  通常会提供API的,都是一些系统软件,它们本身在设计时就充分考虑到让其它用户程序通过API来调用自身的“功能”模块。而如果一个软件本身在设计时并未考虑到API的话,就无法使用这种方法来实现,因此这种模式有极大的局限性。

R)w1BX3F*S@$tN

7Lwv+e$|(m7]eN  矛盾与需求必将促进技术的发展。在20世纪90年代,出现了一种基于面向对象技术的软件工程技术---组件技术。这是一个新一代软件技术发展的里程碑。 JAVA中文站社区门户.o7p:Sxx[

~ E A-?/NF+I;d  一些提示: JAVA中文站社区门户 N$I,wU3Wz&E'd

JAVA中文站社区门户?hW_J,{5~| ^

  面向对象技术是出现在20世纪80年代,但它并未完全解决我们遇到的问题。因为经缺乏一种让不同开发商提供的软件对象在同一地址空间里相互合作的机制。

3{G~ t}"h7k@7_2L JAVA中文站社区门户-v {)a0fw(m5TU}

  这些有用的对象就象是“千军万马”,但我们还缺少一个能够“统帅三军”的人物。而组件技术就是这个“统帅”。 JAVA中文站社区门户$uB#[:h z L;u

JAVA中文站社区门户M`6NR(V%\m

  组件技术的基本思想就是:创建和利用可复用的软件组件来解决应用软件的开发问题。组件是一种可复用的一小段软件(可以是二进制的,而不是源代码)。组件可以有多种多类,小到图形界面上的一个按钮,大到一个复杂的软件。

"w6VLr3p/\,@-VS4z JAVA中文站社区门户P F;D7E8vX

  只要开发者、应用商将它们的软件作品组件化,那么程序员们就可以在这些组件的基础上,根据自己的需要,将不同语言、不同厂商的组件组合在一起,编制自己的应用程序。通过复用这些组件,就能够使应用程序开发变得更加简单、更加快速,而且成本更加低廉。 JAVA中文站社区门户a z:f*U%d W

JAVA中文站社区门户/lam{C[!\ K)^7]9]

  组件技术的出现,使得: JAVA中文站社区门户Ho0OvW4qT

JAVA中文站社区门户+^h"Y;PZN`

  1) 大大提高开发速度:由于许多软件模块都是通过复用这些已用的软件组件而成,因此将大大减少开发量,缩短开发周期。 JAVA中文站社区门户Nv0@+l Ywqy

JAVA中文站社区门户|EK-D ]j&X

  2) 降低开发成本:开发量的减少,开发周期的缩短,都会节约大量的成本。

,^*wxinu1~~R

fm4c9iR)b1}Sv  3) 增加应用软件的灵活性:当软件中的某个组件升级了,功能增强了!我们只需简单地换掉这个组件,马止就可以升级整个应用软件。而且我们还可以根据自己需要将它们个性化,这大大提高了应用软件的灵活性。 JAVA中文站社区门户o G4uj5N

\M6Kn(e8`O  4) 降低维护费用:由于采用组件技术开发的应用软件,可以通过局部修改达到优化、修改软件的目的,而不必重新做全局修改,这将大大降低软件的维护费用。

[8rG0[4}K JAVA中文站社区门户mO7s_g

  最后,我们通过一个通俗、简单的例子,来说明使用组件技术开发应用软件前后的情形,希望这个例子能够帮助您理解组件技术的真谛。

m/I tc9P Pvn JAVA中文站社区门户^U_ uXz

  我们要开发一个具有收音、放音、录音三种功能的“三用机”。

M9wB9} sx

|%I7h TT&G  一些提示: JAVA中文站社区门户m'U:n } SZ$Fg1`:o'u;f

Af*V ul7m  这其实是一个无线电技术方面的开发,我们在此就把它做一个类比。

4SLo$t8By9g&}

jH4T,h(z*p Q7_e  1) 使用组件技术之前,我们开发应用软件就象:

a3Ynn4}%W']Wl

P'y5Zxa4L  我们做这个“三用机”时,我们放着现成的实现“收音”功能的集成电路、实现“放音”功能的集成电路、实现“录音”功能的集成电路不用,非得推倒一切,重新设计。由于时间有限,他可能做出了这些功能,但是整体的设计就可能无法让用户接受,最后可能得到一个不好的产品。而且要维护、维修这个产品,将会受到极大的困难。 JAVA中文站社区门户zd$u`"y ] Jw'Yo

JAVA中文站社区门户2B4n*m6St j

  这样做新产品开发的硬件工程师,肯定会受到各方面的批评吧!我想你也会觉得这种不可思义的工作方法是十分可笑的吧! JAVA中文站社区门户 ~9U*J3Q%Pbk Db

JAVA中文站社区门户 aA[ D%N2i4K0v

  可是,很遗憾的是,我们的软件开发工作却一直使用这种“令人可笑”的方法来做的。但这也是因为软件产业尚未成熟,还没有整理出“收音集成电路”、“放音集成电路”、“录音集成电路”这些可复用的模块。只好使用这种“没有办法的办法”来做这样的工作。这种现状,也就是“软件危机”。

+t&I"K/?+k p;S y;F JAVA中文站社区门户Ms%[m)KJ~,mq7@

  2) 使用组件技术之后,我们开发应用软件就完成不一样了:

(J3f9S;a6{ JAVA中文站社区门户+?7Rn,FM+?Ic'lL0GC%C

  我们做这个“三用机”时,我们认真设计,将实现“收音”、“放音”、“录音”功能的集成电路组合在一起,然后认真设计用户界面,外观、其它功能。结果我们得到了一个十分新潮的“三用机”

t,bv$sL)] O? JAVA中文站社区门户7Hn7aQHE\G-]

  我想,这种方法在硬件工程设计上早已不是什么新技术了,正是这种不断地站在巨人的基础向前发展的经历,使得我们的CPU越来越快(你现在知道,为什么摩尔定律为什么会实现了吧!)。 JAVA中文站社区门户%y!m$oU3w~|-p&c4u.P7e

JAVA中文站社区门户+q@%` oKt)S,W

  因此,想让我们的软件开发工作能够象硬件开发一样有效率的话,也得总结出各种有效的“组件”,以后应用软件的开发变得象“搭积木”一样简单有效。 JAVA中文站社区门户3f:o F%E*~,L!XxV7?.|

S0H+`g$T7M3ww  13.4.2 主流组件技术

] U,ddF9m*c:_:L JAVA中文站社区门户?@CLQ

  传授新知

` Z6{/}1M dfJ JAVA中文站社区门户R{e a bv)G

  但是真正有效的软件组件,并不能够随意构造。因此,软件界就开始了一场组件软件的体系结构和组件间的接口方式的研究。并且许多软件厂商、组织制定出了许多这方面的方案与规范,比较有代表性的有三种:CORBA、COM/DCOM/OLE/ActiveX、JavaBeans。 JAVA中文站社区门户0d YSF3clz5f+W

1Wc DV J D*o#i,O1e+j  1.CORBA

qKC9\ OXV:e"W JAVA中文站社区门户ETT6zr#s X$y

  历史最悠久的是CORBA组件技术。它是由OMG(对象管理组织)制定的。OMG组织有许多大名鼎鼎的IT公司:HP、3COM、SUN、CANON、PHILIPS等。它使得异构系统中的部件能够很容易地通信,就像是在本地进行通信一样。

/mlO8`,lr

Q;]{9fP  2.COM/DCOM/OLE/ActiveX

h+`!eF-P

3g~J]K}/n3t  最有市场竞争力的是Microsoft公司推出的COM/DOCM/OLE/ActiveX组件技术。它性能优越,但它仅局限于Windows平台上使用。 JAVA中文站社区门户.S6E|Q4W ~k

d4V"kk1qq  3.JavaBeans

!kS'a XW~ k)} x

mcP[2\"G+y3O$t  由于组件技术规范具有不可小视的重要性,因此Sun公司为了与Microsoft竞争,在不久前发布了基于Java的组件技术标准:JavaBeans。它的目标是实现一种与平台无关的组件技术。不过,由于Java的地位不断的提高,使得对手Microsoft公司也对其提供了支持。 JAVA中文站社区门户0x![Un(m2z V

M,oSA X9_  小知识:

NFM K?P g

pRQ+H!I3mN  第一个JavaBeans规格书是在1996年9月宣布。这个规格书是多家公司合作的结果。它包括Apple、Borland、IBM、JustSystem、Microsoft、Netscape、RogueWave、SunSoft和Symantec等等。 JAVA中文站社区门户|+O-x^`

'd TV2T/e%MS8` n  到现在,又有许多新的公司宣布对JavaBeans提供支持,这些公司包括:Corel、EnterpriseSoft、Gemstone、Jscape、K&A Software、KL Group、Lotus Development、NOVELL、ProtoView、Development、Rogue Wave和Stingray Software等。 JAVA中文站社区门户 O#tQC&q/U(P%A

#g t*uP-l?KM  关于JavaBeans的可多的内容,我们会在下一小节中讲述。

g1lu'q#Tg,D$u5~ JAVA中文站社区门户,Sjk,HUt m"]B+g

  那么在这些组件技术,哪一个能够“浪沙淘尽,谁是英雄”呢?从现在的发展趋势来看,可能答案是“群雄逐鹿”。这是因为这三种组件技术各有优缺点,并不存在一种技术有明显的优势。而且它们之间还在不断地融合,互相提供接口桥,因此,这些组件技术均可能占据一定的市场。 JAVA中文站社区门户_0czo'PdN

0hu+L4G icV o  13.4.3 组件技术:JavaBeans

|e*PV~r JAVA中文站社区门户n'P9J@:m

  传授新知 JAVA中文站社区门户'S,u ^:U~ N&Y,` TZo

8rO;D+}x9hT  在组件技术JavaBeans中,每一个组件就是一个Bean,Bean可以结合起来,开发出应用程序。一个组件Bean就是使用Java语言编写的一个组件。 JAVA中文站社区门户0g?*IXQ

+S9wA)~n`pZ$eu  JavaBeans是一个十分完整的组件模型,它能够支持标准组件技术中的各种特性:属性(properties)、事件(events)、方法(method)和持续性(persistence)。

Q V1pT/e]

$S7VE]5R O$X ]0|(t  1) 组件的属性: JAVA中文站社区门户2MLSA,jL g$@

/N?#t9ncT  组件要能够被使用,那么就必须有一组属性来定义他的状态。例如,一个图形组件可以有属性:前景色、背景色。而一个计算储蓄的组件的属性可能就有本金、利率等。

.C4g t y-B J)w| JAVA中文站社区门户6T(z pt]fd

  大家想一下,它象不象一个对象的属性。 JAVA中文站社区门户wK[J GV'h

g!h;^3Ft%KH L$F M  其实组件就是由一个或多个对象组件的,是一个更大些的软件组成部分。 JAVA中文站社区门户]]0g'm9L w M*M

JAVA中文站社区门户n&u(L~.v{GR!fp E

  2) 组件的方法: JAVA中文站社区门户q$_C(ezv9Kx'cgF

JAVA中文站社区门户6f(C|~_$z6C*A

  与一个对象一样,组件提供了一系列的方法(也可以理解为函数),其它部分或其它软件通过调用这些方法来使用组件,或修改组件的状态。

w5x WQQB"n0K

0r { t8\O9\$| ~6Q  3) 组件的事件:

7oxwg4E#ta8W;d JAVA中文站社区门户GW"QrDD:M

  由于组件技术是基于面向对象技术实现的,所以一样的,也是一种消息驱动机制,组件间是通过消息进行通讯的。这些消息就是事件。

9Dg|gf u JAVA中文站社区门户 I2Tl[ t?6],{ C,]

  例如,有一个“按钮”组件,当我们单击这个“按钮”时就会产生一个事件。

tanU1@

6?0iQt%pa9P$w"Y  设计一个JavaBeans的步骤是:

9vt P6y2mE2JiQ JAVA中文站社区门户w}_!q5}

  1) 指定Beans的属性; JAVA中文站社区门户tL[BjLXv

Bm N?Pi  2) 指定Beans所产生或响应的事件;

CufR3Oj;?$k,q~ JAVA中文站社区门户Y!f!w3Q \e ^7Ih

  3) 定义Beans应公开给其它Bean的属性、方法和事件。

"}D8RUl Z5M JAVA中文站社区门户jRS wW UNwt

  JavaBeans是一个比较复杂的课题,更多的内容你可以参考《Using JavaBeans》一书。

4x1TQAk SH }-E

0ENQV H@.?U  自测练习

J5? T%C#p

7{ LRs6B tZ8Q  1) 组件技术的基础是_______________。

:fO~.a Dt JAVA中文站社区门户}"i#oa `.t!BA

  a.JavaBeans技术 b.传统的软件开发方法

;M*g.XgyE{

z V1Uk;Q  c.面向对象技术 JAVA中文站社区门户i{l1s%e:at

lWX*O:]yd  2) 最早的组件技术规范是____________。

9s nz}zB-Bgpu] JAVA中文站社区门户tsQ|*oE@e*B

  a.JavaBeans b.CORBA c.COM/DCOM JAVA中文站社区门户wQ-o"L-~

lR j*}g u  3) 与平台相关的组件技术规范是____________。

Iln,{b JAVA中文站社区门户~(wd1W0`#pl \j

  a.JavaBeans b.CORBA c.COM/DCOM

%`*Ts+l^*NYF ` JAVA中文站社区门户eq:|^i-u

  4) OMG组织制订的组件技术规范是_________。 JAVA中文站社区门户 g4L @(r?3k^3[ M#tOz

JAVA中文站社区门户K Q"vC2o L

  a.JavaBeans b.CORBA c.COM/DCOM JAVA中文站社区门户2QU@8o&c7tp d

JAVA中文站社区门户%~7H#c uo

  5) 以下关于组件的说法,正确的是__________。 JAVA中文站社区门户l?m%I2F2G A

Yi,B'm'z ]  a. 组件就是一个可复用的“对象” JAVA中文站社区门户#gilw0|

f.X};F ka f[  b.组件技术是一个软件开发技术的里程碑 JAVA中文站社区门户9A O J-}$V%{!ymk iJ'T

e{ `$oU(b X m3it  c.使用组件技术开发,会耗费更高的成本 JAVA中文站社区门户uG{M b0h9\+C

JAVA中文站社区门户F1g_+W.S

  练习答案 JAVA中文站社区门户O'bH q9K9v

LMM:lX6H"{/Q.l!w0J  1)c 组件技术的基础是面向对象技术。JavaBeans是一种组件技术,它是为了解决传统的软件开发方法提出来的一种改进。

EU y#[ u!A JAVA中文站社区门户 d3hI ? yia|

  2)b 最早的组件技术规范是OMG组织开发的CORBA技术规范。

@%?G `{!g\,x

r@wD Ct^H  3)c COM/DCOM组件规范是Microsoft公司制定的,它只能够在Windows平台上使用,它是一种平台相关的技术。 JAVA中文站社区门户 c [ E1J_mc'|NI

JAVA中文站社区门户-W;T5rxT#g!N

  4)b CORBA规范是OMG组织开发的。

W\#^8F5[/s

z m u,a@;{1]uA:n  5)b 组件技术是软件开发技术的一个里程碑。它比对象的粒度要大,它可以由多个对象组成。使用它能够更加高效地进行组件开发。

+|tc `uP,b'a JAVA中文站社区门户}/O*Q Thtju

  13.5 Java的学习资源 JAVA中文站社区门户R/pU!iQz Iv"GIDg

|0XV0c%pe3I;C_  传授新知 JAVA中文站社区门户J"ucT s'B7d

s1i5y5B;['_ M\  善用Java的学习资源,能够给你学习Java插上腾飞的双翼! JAVA中文站社区门户x7C.S:Nc~ Y5?+l7O

JAVA中文站社区门户G(q8^+Dxz+]t

  13.5.1 最好的学习资源JDKDOC

a aD1Ow8v}_ O JAVA中文站社区门户5{-f`%a$Z:qJX

  学习Java语言,最好的资源就是JDKDOC(Java Development Kit Documentation),你可以在sun公司网站上下载。下图就是JDKDOC文档的主页: JAVA中文站社区门户|b9^ N1H s

JAVA中文站社区门户(D+U$l0Gq

 JAVA中文站社区门户F Mx A3PX*z

5cO"MJT JAVA中文站社区门户 D:g4YE%vo8g[/u

Oc/U Y HJAVA中文站社区门户8R@ f_3W%hkH
  图13-22 JDKDOC JAVA中文站社区门户7kX*|F SY `

$|N)q'YG9O:}2@\  13.5.2 WEB站点 JAVA中文站社区门户$Qp&Q%X;X"f B

JAVA中文站社区门户9B3L;{ u(eRU)W&m4m

  Java语言更新迅速,要掌握最新的内容,最好的方法就是通过Java相关的WEB站点来学习。下面就是一些著名在Java站点,不过可惜的是大多都是英文站点。 JAVA中文站社区门户a thK w3X1fP F`

F'h:UF2C6m  1. Java的老家:

v/E0C1H7xW JAVA中文站社区门户#]8vP1s-tL5]

  链接:[url]www.javasoft.com[/url] java.sun.com

B[.[1\v m

i2ry!f^XW!}9c  简介:这是查找各种Java官方资源的好地方,我们可以在这里下载到最新的JDK、Java工具、以及JDKDOC。

8Tj/EW;BL_ n6D(ys.|

v6lgq\  2. Earthweb的开发网站:

{7E `| b-p{

dLT&X~pX.`hu  链接:[url]www.gamelan.com[/url] JAVA中文站社区门户x/o)s"\-Mor8g6x

JAVA中文站社区门户4X'm-n]2s2a

  简介:它是所有Java资源站点的始祖。 JAVA中文站社区门户 G;enT0MA%Db,IR

za_E2D6aQ  3. Java Focus网站: JAVA中文站社区门户O%Jy(Sbn/s

6E6v8j"[^I\  链接:[url]www.miningco.com[/url] JAVA中文站社区门户vz-Oi,^1ANcH1@6L

IU {"KEo)A(NK  简介:在这里你能够找到一大批关于Java的特殊信息。

or8n?5Q,|(M[ JAVA中文站社区门户IVP!vc

  4. Java Inside网站: JAVA中文站社区门户e{2g-fFE y

?&|KGFp X  链接:[url]www.inside-java.com[/url]

.y w/UyV2@g JAVA中文站社区门户N2K7Z yE5j

  简介:这时Java程序员的一个很极好的信息源。这里我们可以找到许多关于Java语言的论文,以及许多Java的最新动态。

)X]-H,m-{

MMNj%l7cH  5. Java小应用程序评级服务网站: JAVA中文站社区门户%{o/z:r%W\3L(E

Es&nb7mz`,Z  链接:[url]www.jars.com[/url]

Zv nYe#wf?M JAVA中文站社区门户 ]|'m.F.i

  简介:这是一个十分有趣的网站,它提供了一个Java小应用程序的排名。 JAVA中文站社区门户2d? ShP/e1A

JAVA中文站社区门户0D y j2XD$Bhj#W$J

  6. Java开发者杂志 JAVA中文站社区门户8j?2AS5] X NzRk

JAVA中文站社区门户"V$kK1N ["db

  链接:[url]www.javadevelopersjournal.com/java/[/url] JAVA中文站社区门户 o JTm jk5GP,i-e

\n+V:V#qNIc#|w  简介:在这里有免费的Java讲座,有免费的软件,可惜杂志并不是免费的,你只能免费试读3期。 JAVA中文站社区门户Cz,q J%?3p

JAVA中文站社区门户r6qP/|V V^

  7. Java Lobby JAVA中文站社区门户su6~s1[L+tO

JAVA中文站社区门户y:?7^ r2cE)f

  链接:[url]www.javalobby.org[/url] JAVA中文站社区门户m Rx7|H

JAVA中文站社区门户/Qj Nn2E$t

  简介:这是一个由Java开发人员组成的群体。

i"i t)j|.~

z,yZ'O5K {!q  8. Java世界 JAVA中文站社区门户Ioc`\!lc

E{Lz*J1m\  链接:[url]www.javaworld.com[/url]

x4[v$`n"Dg

!^n4Ycq  简介:这是一个关于Java的在线月刊。它是IDC公司面向Java一族的经典杂志。 JAVA中文站社区门户Gz {/`Yl

Gp)|.WSH*a I  9. 微软公司的Java主页:

6FCbdm;Az f'Wp

.aH(Nk'N.\ Uw  链接:[url]www.microsoft.com/java[/url]

K O$t"LZA2l

YBlu,_  简介:如果你想了解在Microsoft window平台上的Java的信息,你可以到这里看一看。注意它的Java可是不“纯”的哟。 JAVA中文站社区门户R$G1UM1UY4[6ZO

JAVA中文站社区门户0x]6[ k!Q,e(jr

  10. Java团队

._ \ {N2dr

/gQY[6`#^  链接:[url]www.teamjava.com[/url]

6f+e,n!iQ#u} @n&v

7j_tb"a  简介:这里的目的是通过提供关于Java的工作机会、新闻、教育材料及其它有用的Java资源,以向Java爱好者服务。

4K @ZX M7H0F9N?7G)xId

9AXUt;Wo/~  13.5.3 新闻组 JAVA中文站社区门户&Kce8f8d p

JAVA中文站社区门户 e lh+{e

  以下是最经典的Java新闻组列表: JAVA中文站社区门户 j3V7l9M]0R%z#]b!Nq

JAVA中文站社区门户4rp K` sB!Bo

  1) comp.lang.java:Java语言和编译; JAVA中文站社区门户(w$pPdJ2j/M

D4u&YE'qJDM-x|  2) comp.lang.java.advocacy:Java支持者的论点;

%MX7j#M _&v JAVA中文站社区门户6wY6HNw4Rz

  3) comp.lang.java.announce:Java产品及其它服务公报;

!Y9P8m!X(?)z;D

}(R-a GsB*f;BOK  4) comp.lang.java.beans:JavaBeans讨论与编程;

N/[:X1rzY] Rf

2X] }!xA~V.WkZ  5) comp.lang.java.databases:Java数据库编程;

ZncQ`1j\l

'E9D o^2}7kNul  6) comp.lang.java.gui:图形用户界面提示及帮助; JAVA中文站社区门户x/E%t9Z,Y;{

%o'f N f6G4uV  7) comp.lang.java.help:关于Java编程语言的一般性帮助;

d$y*h;W+} Rm JAVA中文站社区门户\1kxf&Jy f

  8) comp.lang.java.machine:Java虚拟机讨论; JAVA中文站社区门户9H{ E9GrLu

^8r+S_D  9) comp.lang.java.programmer:Java程序员帮助;

l;Nz ^XGL/Q f)e JAVA中文站社区门户 Nk Eu ]'r

  10)comp.lang.java.security:Java安全性讨论; JAVA中文站社区门户 r7]_W al T%m

A+nUrSl  11)comp.lang.java.softwaretools:Java工具讨论组;

A:e1I3cvl&d1\ JAVA中文站社区门户fe p'hj n"DAA`

  好,到此相信各位读者已经走进了Java的殿堂,可谓是“师傅”(笔者冒昧当一回师傅)带进门,修行靠个人。希望这些广泛的资源能够帮助你遨游Java世界。

Z?-T3zl I n&I

TAG: Java JAVA java 试题 More
 

评分:0

我来说两句

seccode