Java编程

2024-10-22

Java编程(共11篇)

Java编程 篇1

Java动画编程中的手机动画死机、图像闪烁或残缺、图像迟滞等现象,是Java程序员经常遇到的问题。Java动画编程有多种实现方法,但实现的基本原理都是在屏幕上画出一系列的帧来造成运动的感觉。阐述如何运用技巧达到动画显示的优化。

Java的动画编程,为了不断更新屏幕显示图像,一般采用创建线程,在线程中调用帧图像循环的方法实现动画。而如果在主线程中调用动画循环,则会占用过多CPU资源而影响程序效率,并且不利于动画程序的调用控制。因此,应单独创建一个实现动画循环的动画线程,当动画循环完成后,应及时停止该线程以释放CPU资源,即在程序中将线程置为null,代码为:animatorThread=null。如需同时实现多个动画显示,可利用Java多线程技术,利用主AWT线程调用其余各线程,图像过大时可采用其后所述技术优化动画显示效果。

动画显示不平滑甚至发生闪烁的原因是因为图像更新的频率与屏幕的刷新频率不一致造成的。发生闪烁有两个原因:一是由于在显示下一帧画面的时候,调用了repaint()方法;而repaint()方法被调用时,要清除整个背景,然后才调用paint()方法显示画面。在清除背景和绘制图像的短暂时间间隔内被用户看见的就是闪烁。另一个是由于paint()方法要进行复杂的计算,绘制每一帧花费的时间太长,图像中的各个像素值不能同时得到,使得动画的生成频率低于显示器的刷新频率,从而造成闪烁。可利用重载和双缓存技术解决这个问题。重载:当AWT接收到一个Applet的重绘请求时,它就调用update()方法清除Applet的背景,然后调用paint()方法。重载update()方法就可以将以前在paint()方法中的绘图代码包含在update()方法中,从而避免每次重绘时将整个区域清除。既然背景不再自动清除,Java程序员需要自己在update()中完成。双缓冲技术:主要原理是创建一幅后台图像,将每一帧画入图像,然后调用drawImage()方法将整个后台图像一次画到屏幕上去。这种方法的优点在于大部分绘制是离屏的。将离屏图像一次绘至屏幕上,比直接在屏幕上绘制要有效得多。在创建后台图像前,首先要通过调用createImage()方法生成合适的后台缓冲区,然后获得在缓冲区做图的环境(即Graphics类对象)。双缓存技术的缺点是当图像过大时,会占用内存很大的空间而影响程序的运行。实现较高的帧速度会产生平滑的动画,从而消除闪烁,因此,可在动画显示的每两帧之间,调用线程的sleep()方法休眠一个固定的时间。这样做的缺点是使用绝对的延迟时间会使延迟过长,即造成等待时间过长。

当需要动画速率不因硬件环境而发生改变时,为了保持恒定的帧速度(也就是恒定的显示频率),在线程的run()方法中可加入如下代码:

另一种方法是创建一个线程,用于提供一个严格的时间信号,控制动画定时刷新。

因为图像是逐帧载入屏幕的,所以当动画线程刚开始时,出现图像残缺等现象,这时可以使用MediaTracker或ImageOberver类对象进行图像跟踪,待图像全部载入后,再调用drawImage()方法将图像输出到屏幕上去。

而在不同硬件环境下,需要设计不同的动画优化方案。如在手机动画游戏等缓存过小的条件下设计程序,如采用双缓存技术显示动画,图像过大时会因占用过多内存,而使程序运行不稳定,这时就需要合理地设计和使用缓存。线程运行结束时应及时释放缓存,代码如下:

在Java程序运行中,采用的是自动回收内存的GC机制,而当内存泄露时,GC无法释放内存,即当程序中的对象申请了内存空间没有释放,而这些对象却是无用的,即程序以后不会再使用这些对象时,这些对象就可以判定为Java中的内存泄漏,这些对象不会自动被GC所回收,然而它却占用内存。可运行GC的函数System.gc()访问GC,根据Java语言规范定义,该函数虽然不保证GC一定会执行内存回收,但可在一定程度上调用GC防止内存泄露,所以,可在调用双缓存技术程序末尾加上语句System.gc()。不同的JVM实现者可能使用不同的算法管理GC。通常,GC的线程的优先级别较低,那么需要调整GC的参数,让GC工作的速率与需要释放缓存的速率一致,Sun提供的HotSpot JVM就支持这一特性。

具体的动画编程,应根据具体软硬件环境结合程序要求,选择适合的优化方案。

摘要:Java动画编程在游戏软件开发、程序设计中应用广泛。针对不同环境下的Java动画编程的常用技术进行了分析,介绍了根据不同编程环境,消除动画闪烁及优化显示效果的技巧。

关键词:Java动画编程,缓存技术,游戏动画优化,GC

参考文献

[1]刘岩松.基于Java的动画速率精确控制.辽宁师专学报,2005,10.

[2]李海兵.Java的缓存系统的设计.电脑编程技巧与维护,2010,(24).

Java编程 篇2

(切记基础知识一定要时时刻刻巩固)eg:Java编程思想、Java2 核心技术

2.第二阶段掌握要点:Tomcat,毋庸置疑,Tomcat为学习web服务首选。而应用服务器

目前主要有:jboss , weblogic.websphere.而Tomcat和jboss是首选。

3.第三阶段掌握要点:Java网络编程。包括:SocketRMLHTMLJSPJavaBean

Servlet.开发工具:Myeclipsedreamweaver顺序:

1、学习web 知识:htmldreamwavejavascript2、先学习jsp设计、Javaservlet编程

3、学习jdbc数据库编程

4、学习,他和学习ejb可以结合起来《《精通ejb》》学习ejb设计模式和看代码(最重要)《jsp2.0 技术手册》 在jsp上不要花太多时间,在时间放在servlet多一些

4.第四阶段 掌握要点:流行MVC 架构和Java对象持久化技术。包括struts

Java编程 篇3

关键词:IDEA;MA乘加模块;JAVA

中图分类号:TP312.1 文献标识码:A文章编号:1007-9599 (2011) 08-0000-02

The Programming Application of IDEA Algorithm on JAVA

Zhu Jun

(Shenyang Automotive Industries Institute,Shenyang110015,China)

Abstract:IDEA is a good block cipher,with hardware and software are relatively easy to implement,is widely used in various commercial software.Article focuses on the IDEA algorithm in JAVA language theory and implementation technology,and gives some of the key source code.

Keywords:IDEA;MA multiply-add module;JAVA

一、算法描述

(一)MA模块。IDEA密码算法采用混合的乘加(MA-Multiplication Addition)特殊网络结构来实现混淆和扩展功能,明文分组长度为64比特,但密钥长度为128比特,加密和解密算法相同,但解密时各轮子密钥要由加密时的子密钥按相应的运算推导出。加解密过程各采用8轮迭代实现。对任何加密算法的设计,混淆(Confusion)及扩数(Diffusion)是两个最重要的安全特性。混淆是说加密算法的密文与明文及密钥的关系十分复杂,无法从数学上描述,或从统计上去分析。扩散是说明文中的任一位以及密钥中的任一位,都对全体密文位有影响。经由此种扩散作用,可以隐藏许多明文在统计上的特性,增加密码的安全。IDEA的混淆特性是经由混合下述三种函数面达成。

1.以位为单位的Exclusive-OR即逐位MOD2加,用⊕表示。2.定义在模216(=MOD 65536)的模加法运算,其操作数都可以表示成16位整数,用图表示这个函数,为了表示方便下面用+号代替。3.定义在模216+1(=mod 65537)的模乘法运算。因为65537是一素数.所以对任何数(除0以外)的乘法逆元是存在的。值得一提的是,为了保证即使当“0”出现在16位的操作数时也有乘法逆元存在,“0”被定义成2M。用⊙表示这个函数。

其中需要提示的是:MA结构(如图)中相异符号不满足分配率和结合率。如

1.a⊙(b+c)≠(a⊙b)+(a⊙c)

2.a+(b⊙c)≠(a+b)⊙(a+c)

(二)加解密算法描述。将64比特的数据块分成4个子块,并定义4个子块为:X1,X2,X3,X4,每个子块16个比特作为第一轮迭代的输入。整个过程需要8轮迭代来完成。算法的每轮迭代都是在4个子块之间进行,主要执行与16比特的子密钥异或操作,MOD2加法运算和MOD(216+1)乘法运算。在每一轮的迭代运算中,输出的第

二、第三子块交换,具体的每一轮迭代运算顺序如下:

(1)X1和第一个密钥子块Z1相乘:H1(1)=X1(1)⊙Z1

(2)X2和第二个密钥子块Z2相加:H2(1)=X2(1)+Z2

(3)X3和第三个密钥子块Z3相加:H3(1)=X3(1)+Z3

(4)X4和第四个密钥子块Z4相乘:H4(1)=X4(1)⊙Z4

(5)将(1)和(3)结果相异或:H5(1)=H1(1)⊙H3(1)

(6)将(2)和(4)结果相异或:H6(1)=H2(1)⊙H4(1)

(7)将(5)的结果与第五个密钥子块相乘:H7(1)=H5(1)⊙Z5(1)

(8)将(6)和(7)的结果相加:H8(1)=H6(1)+H7(1)

(9)将(8)的结果与第六个密钥子块相乘:H9(1)=H8(1)⊙Z6(1)

(10)将(7)和(9)的结果相加:H10(1)=H7(1)+H9(1)

(11)将(1)和(9)的结果相异或:H11(1)=H1(1)⊕H9(1)

(12)将(3)和(9)的结果相异或:H12(1)=H3(1)⊕H9(1)

(13)将(2)和(10)的结果相异或:H13(1)=H2(1)⊕H10(1)

(14)将(4)和(10)的结果相异或:H14(1)=H4(1)⊕H10(1)

上述为第一轮情形的运算结果,经过第一轮迭代输出的四个子块形式分别为:第(11)、(12)、(13)、(14)步的运算结果。除最后一轮迭代运算外,其中每轮迭代过程均是第2、第3块交换(前面算法已根据交换后结果直接输出),分别作为下一轮的输入,即

X1(2)==Y1(1)=H11,X2(2)=Y2(1)=H12,X3(2)=Y3(1)=H13,X4(2)=Y4(1)=H14,

整个加密算法经8轮迭代运算后,最后输出变换产生Y1到Y4作为输出:

X1(8)和第一个密钥子块作乘法运算:Y1=X1(8)⊙Z1(9)

X2(8)和第二个密钥子块作加法运算:Y2=X2(8)+Z2(9)

X3(8)和第三个密钥子块作加法运算:Y3=X3(8)+Z3(9)

X4(8)和第四个密钥子块作乘法运算:Y4=X4(8)⊙Z4(9)

(三)子密钥的产生。IDEA的初始密码为128比特,所有子密钥总长度为6*16*8+4*16=832比特。8轮迭代每轮使用6个16比特的子密钥,输出变换使用4个6个16比特的子密钥。具体密钥的扩展算法为:将128比特初始密码按16比特分成8个子块,作为前8个16比特的子密钥,接着将128比特密钥向左循环移位25位,再将其按16比特划分为接下来的8个子密钥,其它依次类推!

IDEA的加解密子密钥满足:

(1)(Zi(j))-1⊙Zi(j)=1(mod216+1)

其中:(Zi(j))-1表示子密钥Zi(j)的乘法逆;1≤i≤6,1≤j≤9

(2)-Zi(j)+Zi(j)=0(mod216)

其中:-Zi(j)表示子密钥Zi(j)的加法逆;1≤i≤6,1≤j≤9

(四)加解密密钥对应关系表

轮数加密子密钥解密子密钥

1Z1(1)Z2(1)Z3(1)Z4(1)Z5(1)Z6(1)Z1(9)-1-Z2(9)-Z3(9)Z4(9)-1Z5(8)Z6(8)

2Z1(2)Z2(2)Z3(2)Z4(2)Z5(2)Z6(2)Z1(8)-1–Z2(8)-Z2(8)Z4(8)-1Z5(7)Z6(7)

3Z1(3)Z3(3)Z3(3)Z4(3)Z5(3)Z6(3)Z1(7)-1–Z2(7)-Z2(7)Z4(7)-1Z5(6)Z6(6)

4Z1(4)Z2(4)Z3(4)Z4(4)Z5(4)Z6(4)Z1(6)-1–Z2(6)-Z2(6)Z4(6)-1Z5(5)Z6(5)

5Z1(5)Z2(5)Z3(5)Z4(5)Z5(5)Z6(5)Z1(5)-1–Z2(5)-Z2(5)Z4(5)-1Z5(4)Z6(4)

6Z1(6)Z2(6)Z3(6)Z4(6)Z5(6)Z6(6)Z1(4)-1–Z2(4)-Z2(4)Z4(4)-1Z5(3)Z6(3)

7Z1(7)Z2(7)Z3(7)Z4(7)Z5(7)Z6(7)Z1(3)-1–Z2(3)-Z2(3)Z4(3)-1Z5(2)Z6(2)

8Z1(8)Z2(8)Z3(8)Z4(8)Z5(8)Z6(8)Z1(2)-1–Z2(2)-Z2(2)Z4(2)-1Z5(1)Z6(1)

输出变换Z1(9)Z2(9)Z3(9)Z4(9)Z1(1)-1–Z2(1)-Z3(1)Z4(1)-1

三、IDEA在Java环境下的实现

(一)进行加密操作

private void idea_encrypt(int[]key,byte[]inbytes,byte[]outbytes)

{

int temp=0;

int a1=bytesToInt(inbytes,0);

int b1=bytesToInt(inbytes,2);

int c1=bytesToInt(inbytes,4);

int d1=bytesToInt(inbytes,6);

for(int i=0;i<8;i++) //经过8轮迭代

{

A1=x_multiply_y(a1,key[temp++]);

B1+=key[temp++];

B1&=0xffff;

C1+=key[temp++];

c1&=0xffff;

d1=x_multiply_y(d1,key[temp++]);

int tmp1=b1;

int tmp2=c1;

c1^=a1;

b1^=d1;

c1=x_multiply_y(c1,key[temp++]);

b1+=c1;

b1&=0xffff;

b1=x_multiply_y(b1,key[temp++]);

c1+=b1;

c1&=0xffff;

a1^=b1;

d1^=c1;

b1^=tmp2;

c1^=tmp1;

}

intToBytes(x_multiply_y(a1,key[temp++]),outbytes,0);

intToBytes(c1+key[temp++],outbytes,2);

intToBytes(b1+key[temp++],outbytes,4);

intToBytes(x_multiply_y(d1,key[temp]),outbytes,6);

}

(二)加密子密钥产生过程

private int[]idea_encrypt_subkey(byte[]byteKey)

{

int[]key=new int[52];

if(byteKey.length<16)

{

byte[]tmpkey=new byte[16];

System.arraycopy(byteKey, 0, tmpkey,

tmpkey.length-byteKey.length,byteKey.length);

byteKey=tmpkey;

}

for(int i=0;i<8;i++)

{

key[i]=bytesToInt(byteKey,i*2);

}

for(int j=8;j<52;j++)

{

if((j&0x7)<6){

key[j]=(((key[j-7]&0x7f)<<9)|(key[j-6]>>7))&

0xffff;

}else if((j&0x7)==6)

{

key[j]=(((key[j-7]&0x7f)<<9)|(key[j-14]>>7))&

0xffff;

}else

{

key[j]=(((key[j-15]&0x7f)<<9)|(key[j-14]>>7))&

0xffff;

}

}

return key;

}

四、结论

IDEA 算法加密速度快,密钥产生方法简单,硬件、软件均容易实现。目前还没有找到明显的安全漏洞,是一个被广泛使用的分组密码好算法。Java语言以其强安全性、平台无关性、硬件结构无关性、语言简洁同时面向对象,在网络编程语言中占据无可比拟的优势,使用Java实现基于IDEA的数据加密传输可以在不同的平台上实现并具有实现简洁、安全性强等优点。

参考文献:

[1]张青凤,殷肖川,李长青.IDEA算法及其编程实现[J].现代电子技术,2006,1:26-28

[2]李萍,蒋晓瑜,汪熙,梁艳.基于IDEA加密算法的语音保密通信系统的实现[J].计算机应用与软件,2010,1:23-25

[3]杨建武.IDEA加密解密算法的设计与实现[J].电脑知识与技术,2009,19:32-33

[作者简介]朱军(1972-),男,辽宁沈阳人,讲师,本科,学士,毕业于沈阳师范大学,研究方向:信息安全与计算机应用。

java编程平台的优势解析 篇4

关键词:java,编程,平台,优势

1 引言

计算机语言, 是计算机编程技术中最为核心的组成部分。不同的编程语言对应着不同的编程环境, 例如C语言就是有着C语言自己的编程环境。对于计算机语言的发展历程而言, 其最早的为汇编语言, 也是最为简单和基础的计算机语言。随着计算机语言的不断发展, 出现了功能与兼容性更强的C语言。C语言虽然功能强大, 但是却存在一定的缺陷。其语言的可读性和概括性不强。实现一个功能, 则需要非常繁杂的C语言代码。因此, 后来又出现了面向对象的程序设计语言, 就是C++。面向对象程序设计语言虽然能够解决C语言存在的弊端, 但是却无法实现跨平台的使用。因此, 在此基础上, 技术人员开发了java语言, java最大的优势就在于其能实现跨平台编程, 并能够囊括多个计算机语言的特点。本文将重点分析java语言的特点, 并分析其平台的优势。

2 Java语言简析

了解一个计算机语言平台的优势, 首先要对计算机语言进行彻底地了解。那么首先需要了解的就是java语言的概念及其发展的历史。

从其语言的类别上人事java, java是可以实现跨越平台的一种面向对象的程序设计语言, 开发之初, 存在java程序设计与java语言编译平台。其优势在于能够实现可跨越性以及很强的囊括性, 对于软件以及大型的游戏等的开发, 都有着非常良好的语言支持环境。其未来的发展前景广阔, 受到业内人士的普遍认可。

2.1 java编程语言的开发

为什么要开发java程序设计语言呢?纵观计算机语言的发展历史, 可以比较容易了解java程序设计语言出现的原因。计算机最初的应用是数学计算, 大规模的数学计算需要强大的数据计算机系统。具有强大计算能力的中央处理器, 也就是人们常说的CPU。而随着计算机的生活化普及化, 用户对于计算机的使用有着各种各样的需求。因此, 软件开始出现。最早的汇编语言, 就是计算机最为基础的语言。随后, 出现了最为经典的计算机语言——C语言。C语言可读性强, 并且覆盖面广泛, 具有强大的编译功能, 从而实现了计算机的软件革命。软件的发展越来越快, 开始逐渐超越了硬件的发展。随着人们要求的不断提高, C语言由于过于单一化, 无法适应于大规模的模块化编程。因此, 面向对象程序设计语言就应运而生。最早出现的就是C++面向对象程序设计语言, 其可以实现构造类, 并通过继承等方式, 进行大规模的编程。C++基本成为计算机的顶级高级语言, 承载着计算机的主要软件开发。但是, 在人们的生产和生活中, 操作系统开始不断推出。目前, 比较常用的有微软的windows操作系统, 苹果公司的ios操作系统, 还有就是用于软件开发的Linux操作系统。以往的计算机语言最大的弊端就在于, 计算机语言需要编译环境。也就是计算机语言要有编译平台, 才能实现软件的开发功能。但是, 计算机操作系统的多样化, 导致了C++这样的高级语言, 在不同操作系统下会出现bug, 从而影响软件开发。因此, 亟需一种能够可以跨越平台的一种计算机语言。所以, 在不断的开发过程中, java语言得以应用。Java不仅仅可以实现跨越平台, 更能够在一定程度上实现移植, 囊括了C语言以及C++等高级语言的特点。并且, java也具有面向对象的性质, 因此java可以用于大型的编程。以上就是java语言开发的历程, 因为有需求, 所以才应运而生。

2.2 java语言的以及java编译平台的主要优势分析

Java的语言的优势比较突出, 并且能够实现多种软件的开发和设计。从我们日常生活中, 就可以得以体现。例如, 大规模的游戏平台, 满足了人们对于游戏的渴望。其中多数游戏平台就是通过java编程实现的, 网页设计中也都需要使用java语言编译平台。其中使用java的主要原因在于, 第一是java的可移植性好。游戏一般都需要具有可移植性, 因此通过java进行编译, 对于游戏的效果体现更好一些。第二, 人们不断的追求方便快捷。游戏的平台也从计算机开始向手机发展, 从而让人们在使用手机的时候也能畅游游戏的乐趣。因此, java游戏是最先被人们熟知的。Java语言的可移植性, 从计算机到手机的转变, 就是对于java语言优势的最好诠释。

对于java的编译平台, 其优势的体现主要是在多元化方面。例如, 在进行软件开发的时候, 人们习惯了使用linu操作系统, Linux操作系统被称为是软件开发的基础平台。但是, 由于大多数人们比较习惯使用windows操作系统, 因此就会造成人们更习惯使用windows平台进行软件的开发与测试, 从而查找bug。如果采用C++等面向对象的程序语言, 虽然可以实现大规模编程以及软件开发等。但是, 从平台的移植上分析, C++的局限性太大。只能够活跃在windows操作系统中, 而脱离了操作系统, 其编辑环境就无法存在。对于java而言, 通过使用任何的操作系统进行编译, 都可以实现。并且, 在一定程度上java实现了编译的简易化。同样的软件效果, java需要进行编译的内容就非常简单, 而且容易理解。因此, 从其平台的优势角度分析, 可移植性占据了最大的优势, 并能够实现多平台的编译与测试。

java语言的以及java编译平台的主要优势, 集中体现在其能够囊括高级语言的优点, 并且能够克服其缺点, 从而达到高效编译的目的。

3 结语

Java作为计算机语言的一种, 能够建立在C语言以及C++的基础上发展起来, 足以证明java有着其语言的优势以及编译平台的优势。对于C语言以及C++而来, 两者虽然都是高级语言, 但是却都无法实现跨越平台。因为微软的windows系统应用过于广泛, 因此C语言以及C++的编译环境都是建立在windows操作系统下的。而大多数的软件开发平台都是Linux, 因此就造成了编译上的缺陷。此外, C语言和C++虽然都是高级语言, 但是其编译方法并不是最佳的。也就是其资源的利用上, 并不十分有效。而java语言能实现可移植的条件下, 囊括高级语言中面向对象的特点, 从而最大限度实现计算机语言的利用最大化。因此, java语言以及其编译平台最大的优势在于不仅仅能够实现高级语言的特性, 并且具有面向对象的特性, 从而可以实现大规模编程。最为重要的是, java可以跨越平台, 实现多平台编程。

参考文献

[1]张健康, 杨宜康, 李雪, 刘磊, 基于Java 3D的地球空间环境可视化研究[J], 计算机应用研究, 2013 (01) :211-214

[2]蓝雯飞, 李子茂, “Java程序设计”课程教学思考[J], 计算机时代, 2013 (01) :37-39

[3]田夏利, 李雄飞, Java框架对初级开发者的束缚及化解策略[J], 软件导刊, 2013 (01) :57-59

Java AWT编程总结 篇5

a)GUI是Graphics User Interface的全称,意思是图形用户界面.2.为什么需要GUI?

a)图形用户界面能够让最终用户通过鼠标拖动、单击等动作就可以操作整个应用,从而提高应用的用户体验效果,使程序受到用户的欢迎.3.Java通过AWT和SWING来完成GUI图形用户界面编程.4.AWT

a)AWT是SUN公司提供的一个基本的GUI类库,被称为抽象工具集(Abstract

Window-Toolkit),它为Java应用程序提供了基本的组件.b)AWT组件需要调用运行平台的图形界面来创建和平台一致的对等体,所以AWT只

能使用所有平台都支持的公共组件,因此AWT只能够提供一些 常用的GUI组件.5.AWT的主要组成部分

a)Component,代表一个具体图形表示能力的对象,可以在屏幕上显示,并与用户交互.通常我们把它称为”组件”.b)MenuComponent,代表图形界面的菜单.i.MenuBar,代表菜单条.ii.Menu,代表一个菜单项的集合.iii.MenuItem,代表一个菜单项.c)Container,代表一个AWT组件容器,可以盛装其他Commponent组件,它继承自

Component抽象类,本身也代表一个Component组件.i.Window,可独立存在的顶级窗口.1.Frame,代表一个窗体.2.Dialog,代表一个对话框

a)FileDialog代表一个文件对话框,用于打开或保存文件.Panel,可容纳其他组件,但不能独立存在,必须被添加到其他容器中.ii.iii.ScrollPane,带滚动条的容器.d)LayoutManager,布局管理器,表示容器管理其他组件的方式.i.ii.iii.iv.v.vi.FlowLayout,流式布局,类似于Window平台记事本的文本布局方式.BorderLayout,边框布局,只能盛装5个组件,这5个组件分别位于边框布局容器的东西南北中五个方位.GridLayout,网格布局,将组件以网格形式显示在容器中.GridBagLayout,网格包布局,一种较为复杂的布局管理器,依赖GridBagConstraints来约束组件.CardLayout,卡片布局,以时间来管理容器内的组件,将组件看作是一张张卡片,每次显示最外面一张卡片(组件).BoxLayou,箱式布局,通常与Box容器结合使用.6.AWT 的事件

a)应用程序响应用户的某个动作或请求,如用户单击了一下鼠标,用户请求关闭应用

程序窗口等.b)AWT编程中,所有事件的处理都必须交给特定的对象来完成,我们将这个特定的对

象称为事件监听器.c)AWT的事件处理机制是一种委派式的事件处理方式,通过将某个事件监听器注册

到用户指定的组件,当用户进行某个操作并触发指定事件时,应用程序会自动产生一个事件(Event)对象并作为参数传给事件监听器中的事件处理器,然后由事件监

听器通知事件处理器来响应用户,完成用户的请求.d)不同的事件需要不同的事件监听器,不同的监听器需要实现不同的监听器接口.e)事件监听器接口:为某个特定事件定义了响应用户请求的方法,当用户将某个事件

监听器注册到指定组件上以响应特定的事件时,则该事件监听器必须实现对应的事件监听器接口才能对用户的请求进行有效处理.例如,用户点击了鼠标右键,希望打开某个应用程序的右键菜单,则注册到该应用程序上的事件监听器必须实现鼠标事件监听器接口,并实现该接口内部某些方法来完成用户的请求.f)事件适配器,很多时候,我们只需要实现某个事件监听器接口中个别方法就能完成应用程序的实际需求,但实现该事件监听器接口的类必须实现该接口中所有的抽象方法,这会造成代码的冗余.而事件适配器可以帮我们解决这个问题,事件适配器实现了所有的拥有多个抽象方法的事件监听器接口,并空实现了这些接口中所有的抽象方法,所谓空实现,就是方法中没有任何实现代码,因此,我们可以通过继承对应事件监听器接口的事件适配器抽象类,并实现我们感兴趣的方法来完成应用需求即可.g)Java事件处理过程中主要涉及的三类对象

i.事件源,通常为普通组件.ii.事件,通常指用户的某个操作,如单击了一下鼠标,按了一下回车键.iii.事件监听器,负责监听事件源上所发生的事件,并作出响应.h)AWT事件监听器的实现形式

i.ii.内部类形式 顶级类形式

iii.类本身作为事件监听器

iv.匿名内部类形式

v.注:目前最为流行的事件监听器的实现形式是内部类形式和匿名内部类形式.7.AWT绘图

a)AWT绘图的实现过程.i.重写画布类的paint方法,绘图图形.ii.注册事件监听器到指定的组件.iii.调用Component类的repaint方法绘制图形.b)AWT实现绘图主要涉及的对象

i.ii.c)Component类的子类Canvas类,它代表一个画布.Graphics,代表一个画笔,可以在Canvas的子类中绘制用户自订的图形.Image类代表了位图,它的一个主要的实现类BufferedImage是可以访问图形数据

缓冲区,并可以返回一个Graphics对象来绘制该BuuferedImage.d)可以使用ImageIO工具类的ImageReader和ImageWriter读写磁盘上的位图文件.8.AWT的优缺点

a)AWT在许多非桌面环境,如嵌入式设备中有着自己的优势,它的主要优点如下:i.ii.iii.iv.更少的内存:对运行在有限环境中的GUI程序的开发,是合适的。2.更少的启动事件:由于AWT组件是本地由操作系统实现的。绝大多数的二进制代码已经在如系统启动的时候被预装载了,这降低了它的启动事件。3.更好的响应:由于本地组件由操作系统渲染。4.成熟稳定的:能够正常工作并很少使你的程序崩溃。

b)同样它也有不少的缺点

i.ii.iii.更少组件类型:表和树这些重要的组件缺失了。它们是桌面应用程序中普遍使用的。2.缺乏丰富的组件特征:按钮不支持图片。3.无扩展性:AWT的组件是本地组件。JVM中的AWT类实例实际只是包含本地

组件的引用。唯一的扩展点是AWT的Canvas组件,可以从零开始创建自定义组

件。然而无法继承和重用一个已有的AWT组件

9.AWT总结:AWT是SUN不推荐使用的工具集,实际开发中很少使用AWT而是使用SUN公司

Java编程 篇6

关键词:计算机软件;开发;JAVA编程语言

中图分类号:TP312.2 文献标识码:A 文章编号:1674-7712 (2014) 06-0000-01

计算机应用技术的发展推动了JAVA程序的开发应用。起初,JAVA语言被命名为OAK,主要用于家用小型电器的编程语言中,从而有效地解决了家用电器的控制问题,比如电视机、冰箱以及闹钟等。随着智能化技术的市场需求和发展,OAK在互联网的应用前景越来越广泛,因而JAVA语言逐渐代替OAK,成为一种单纯地面向对象的程序设计语言。

一、JAVA编程语言的特点分析

与传统的编程语言相比较,JAVA编程语言具有更加方便快捷的优势,同时在传统的编程运用上有了更新的发展。经过不断地发展和改进,JAVA编程语言能够兼容多种计算机种类的操作系统,还能够根据实际情况实现跨平台的操作。JAVA编程语言主要有以下特点:

(一)实用性

JAVA编程语言能够将系统中的内存空间进行智能化收集、处理,从而可以有效地保持系统运行的速度。同时,JAVA编程语言主要应用于网络及其分布式的环境中,能够拥有多个阶层的互锁保护功能,从而及时地避免黑客和病毒的侵入和破坏,保障计算机系统的安全。

相对于C语言,JAVA编程语言具有动态性,尤其是能够更好地适应不断变化的环境。即使程序库已经更新,JAVA编程语言也可以继续沿用之前的编译程序。

(二)广泛性

通常,互联网是由多个不同种类的机器所组合而成的。因此,如何能够使一个应用程序能够在多个机器上执行相关操作是编程语言设计的重点。JAVA编程语言中的编译器能够产生一种文件格式(Object File Format),具有结构中立的优点,进而能够在多个处理器中顺利地运行。作为一种跨平台的编程语言,JAVA能够轻松地将一个环境转移到另一个环境中。比如,用户能够在Web网站上灵活地下载和使用该应用程序,包括图像和HTML等。

(三)简易性

JAVA编程语言主要利用C++面向对象的相关概念[1]。JAVA程序能够自动地将输入的数据装入类中,类在实现程序的简易性中具有独特的优点。因此,程序设计人员只要将大部分精力用于对类和接口的科学设计和应用上。同时,JAVA编程语言还能够将一些不常用的能力进行自动地删除,以降低编程语言设计的复杂性,便于用户更好地掌握。在计算机软件的编写工作中,JAVA编程语言具有更加方便和快捷的优点。

(四)独立性

JAVA虚拟机是一种建立在硬件和操作系统之间的接口,可以顺利地解释JAVA二进制代码。JAVA编程语言将JAVA虚拟机视为一种独立的思想向导,将起初编译的中间码进行自动地校验,可以适应平台环境的特殊要求。简而言之,如果一套计算机系统能够运行JAVA虚拟机,那么该系统就可以实现相关的JAVA编程语言程序设计工作。

二、关于计算机软件开发的JAVA编程语言相关应用探究

JAVA编程语言在计算机软件的开发中得到了良好应用。本文主要探究的是JAVA编程语言在Internet和电子商务中的应用。

(一)Java相关技术在Internet中的应用

Internet中web服务器的发展为人们更加方便快捷地获取信息提供了良好途径。其中web服务器也称为WWW服务器,其主要功能是为用户提供一些网上信息浏览的相关服务。其中,Tomcat是一个免费的开源Serlvet容器[2]。作为Jakarta项目中的一个重点部分,Tomcat具有性能稳定、免费的优点,因而深受广大用户的欢迎。目前,Tomcat的最新版本是8.0。当计算机的配置正确时,Apache能够为HTML页面服务,同时也能够对HTML的相关页面进行处理,具有和IIS服务器相同的功能。

WWW服务器上所提供的浏览信息丰富多彩,不仅具有文本形式和语音形式,而且还具有影视、卡通动漫以及图像等。这些不同模式的信息资源可以在JAVA编程语言的设计下,进行组合、归纳和集成。同时,JAVA编程语言还可以在此基础上衍生出更多具有创意性的产品,比如影视作品和文学艺术等。Tomcat通过借助JAVA应用平台,能够安全地运行并且支持WEB的应用部署。尤其是在Tomcat在以系统管理员的身份运行时,JAVA程序运行能够获得用户系统的全部权限。也就是说,JAVA运行时能够获得所有系统文件夹中文件设置的权限。因此,JAVA可以采用代码的形式,将SDK中的文件API和文件夹中的文件进行合理地调用,不仅可以方便用于提取所需信息,而且还能够保障系统的安全。

(二)Java相关技术在电子商务系统的应用

电子商务系统中JAVA 相关技术扮演着重要的角色。尤其是随着现代电子商务的不断发展,JAVA相关技术的应用能够极大地提高工作效率。

例如,在电子商务的发展过程中,为了达到某种功能,JSP、servlet以及其他的相关资源会自动地组合成一个系统单元。JAVA作为一个理想的编程模型,能够极大地减少系统开发设计中的工作量,同时也可以方便进行后台和后期管理。其中HTML文件主要是以一种静态的形式出现,反应时间较快,但是不具有灵活性。因此,JAVA编程的应用能够对HTML语言进行科学设计,提供一种有效地动态机制[3]。用户只需要进行简单地操作,进行数据的确认,从而可以满足自身的信息需求。这种操作可以在JAVA应用平台上顺利完成。同时,JSP作为一种面向web服务器的相关技术,不需要用户任何的附件支持,其代码可以在编译后由JAVA虚拟机直接执行,从而为用户提供了一个基于JAVA的服务器解决方案。

三、结书语

综上所述,作为一种针对计算机网络开发的专业语言,JAVA编程语言具有一定的优点。互联网时代的到来,JAVA编程语言的设计更加科学化、人性化、合理化。JAVA编程语言在计算机软件的开发过程中得到了良好的应用,为提高计算机软件的开发水平发挥了重要作用。

参考文献:

[1]伍睿恩,基于计算机软件开发的JAVA编程语言分析[J].信息通信,2013(01):55.

[2]杨小琴,JAVA程序设计语言的一点体会[J].电脑知识与技术,2011(03):63.

Java面向对象编程的教学思路 篇7

关键词:Java,面向对象编程,教学方法

Java是当前最流行的编程语言之一, 几乎所有的计算机专业学生都要学。通常, 学生先接触的编程语言是C语言, 而Java在语法上又与C语言非常类似, 因此, 教学的重点应放在面向对象编程的概念和技术上, 然而, 在刚接触面向对象编程时, 学生一般都很难理解OOP的概念。原因是教师过分强调Java语言规范, 却没有告诉学生OOP编程的理念和原则。这极大地挫伤了学生学习的兴趣, 更谈不上对能力的培养。因此, 笔者认为教学重点应放在介绍面向对象编程的基本思想以及Java语言与此相关的特征上。

1 Java编程基础

(1) 简单的Java应用程序;课程开始时, 教师应演示简单示例让学生了解Java程序。由于学生熟悉C语言, 示例应与其类似, 使学生快速地了解Java编程。将“Hello World”程序作为第一个示例使用, 学生就很容易了解Java程序和C程序之间的异同点。

(2) 简单的数据类型和数组;Java的语法类似于C语言, 这对于熟悉C的学生有利有弊。学生要区分C和Java语法和句法上的差异, 教师也必须提醒学生两者只是类似, 如两者的布尔类型和数组类型就很容易混淆。

(1) 布尔类型:C语言中, 经常会使用1和0来表示真假, 而Java使用布尔变量来表示。因此, while (1) 在C语言中是合法的, 在Java里就不是了, 这是Java初学者常见的一种错误。

(2) 数组类型:数组在Java中被视为对象。教师可以将数组作为第一个例子来演示如何使用Java对象, 但需要强调数组对象必须先声明后使用, 而C语言数组是可以先使用后声明的。

(3) 使用预定义的Java类。

教学目标:

*让学生学会使用Java类库中强大的预定义类;

*引入Java中一些重要的概念和技术, 如构造函数、对象、方法重载等。

讲解中, 笔者选择了两种典型的类: (1) String类:String类或类型几乎在任何编程语言中都会用到。Java也提供了该类, 教师可通过例子来演示调用构造函数创建String对象, 调用实例方法, 访问成员变量等等。 (2) Math类:学生经常会用到C语言的数学函数, 在Java中, 他们同样也要用到这些功能。为此, Java提供了Math类。由于Math类所有的成员都是静态的, 教师可以通过例子来说明静态方法的调用, 类静态成员的访问, 方法重载等等。

2 定义类

(1) 从C结构到Java类;带有实例变量的Java类和C语言的结构类型非常类似, 但是, 两者虽然在形式上类似, 性质却完全不同。例1中, 变量id是创建Rectangle对象的序号, 静态成员变量next Id用于跟踪创建的对象, 即每创建一个对象, next Id值将加1。

例1.class Rectangle{

double length, width;

int id;

如果消除静态变量, Rectangle类就非常类似于C结构。不过, 两者的区别也显而易见。首先, 类通过调用构造函数创建新对象, 而C结构没有构造函数。其次, 类的静态成员变量在对象创建之前就初始化, 由该类的所有对象所共享, 而C结构没有此功能。在这, 需要通过例子向学生说明实例变量和类变量之间的区别, 以及它们的使用。

(2) 定义构造函数。

构造函数的作用是创建对象并初始化。不过, 学生可能认为没有必要为类提供构造函数, 他们可以用例2来创建新对象:

在此, 教师可展开写构造函数的原因:如果没有自定义的构造函数, 那么创建一个新对象必须要写五条语句。比如, 用户要创建1000个对象, 就不得不写5000条语句。而如果提供了构造函数, 就只需1000条调用构造函数的语句。这是简化代码的一种方法, 同时也反映了简单实用的编程理念。在此可提醒学生在平时注意消除重复代码, 它的好处是: (1) 避免多次调试同样的代码; (2) 简化程序, 使程序清楚且便于阅读。

(3) 定义方法。

Java中有两种成员方法:类方法和实例方法。它们的区别:类方法可由类中的任何成员方法调用, 但是类方法不能直接调用任何实例方法。笔者教学发现, 不少学生不愿意使用成员方法, 教师就必须点出编写成员方法的理由: (1) 消除重复代码, (2) 隐藏程序执行细节, 使程序更安全。

(4) 访问控制符与封装。

Java对方法有public、private、protected、private protected四个访问控制符, 教师可分别用例子来说明这四个访问级别的区别。另外, 教师还必须向学生充分解释控制访问的理由。例如, 如果Rectangle类的长度和宽度都是public访问级别, 变量值可以自由修改。因此, 输入的值就有负值的危险。如果其访问级别是private, 别的类就看不到两个变量, 它们只能由同一类的成员来进行修改。另外, 还要编写方法来核实数据合法性后再将其赋给成员变量, 以保护成员变量, 避免非法操作。只有让学生了解了控制访问的原因, 他们才能更积极主动地来学习有关访问控制的内容。

3 结语

回顾以上讨论的教学思路。开始, 我们让学生写一个类似C程序的Java程序。这个阶段的重点是使学生熟悉Java语言的一些重要概念。接着, 讨论了如何定义类, 在这一阶段, 我们强调了构造函数的优势, 类方法和控制访问的原因, 并将面对对象编程的思想贯穿始末。

根据这条思路, 逐步讲授面向对象编程的概念和原则。我们不止要告诉学生怎么做, 更要告诉他们为什么这样做。只有这样, 学生才会更积极地学习Java以及潜在的面向对象编程思想, 并逐渐突破从面向过程编程到面向对象编程的障碍。

参考文献

[1]B.Joshua, Effective Java[J].Addison-Wesley, 2001.

[2]Bruce Eckel[著], 陈昊鹏[译], Java编程思想[M].机械工业出版社, 2007.

[3]林信良.Java学习笔记[M].清华大学出版社, 2007.

八人过河问题的Java编程实现 篇8

过河问题是一个非常有趣的智力游戏,许多学者都对这类问题进行了深入研究。王国全[1]对其中的商人过河问题进行了分析并用Java程序来解决此类问题。张念发等[2]将经典的商人过河问题进行了泛化讨论,并在此基础上着重分析了安全渡河问题的状态空间,建立了满足问题需求的渡河规则,研究了相应的控制策略,得出了求解路径的搜索规则和搜索策略,给出了基于状态空间搜索法的问题解决方案。然而,王国全和张念发等方案无法解决八人过河问题,该过河问题描述如下:现有一条河,总共有8个人要过河,他们分别是妈妈、爸爸、两个儿子、两个女儿,一位犯人和一位警察。现有一条小木船,该船一次最多只能搭载两个人;在这8人当中,只有爸爸、妈妈、警察会开船,即这个船上必须有爸爸、妈妈,警察3个中的一个,船才会开动。船过去无法自动回来。并且要避免以下3件事发生:(1)如果警察不在,犯人就会伤害一家6口;(2)如果爸爸不在,妈妈就会伤害儿子。(3)妈妈不在,爸爸会伤害女儿。应当如何过河?

此外,还有农夫过河问题:一位农夫带着一只羊、一只狼和一棵白菜,身处河南岸边。他要把这些东西全都运送到对岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜。请给出农夫将所有的东西运过河的方案。

其实,这两个问题类似,只要解决了其中一个问题,另外一个问题自然就会被解决。所以,重点讨论八人过河问题。

2问题分析

八人过河问题可以看成二元组节点<S1,S2>状态变化过程。其中S1,S2是集合,分别代表着河岸以及河对岸的人员集合。由于集合的元素不能重复,所以二个儿子可分别用儿子1,儿子2来表示。同理,二个女儿可以分别用女儿1,女儿2来表示。设坐船Boat的人员集合是C,在过河过程中,这些人通过坐小船在河两岸来回,二元组节点的值则必然发生改变。

所以,一次过河或返回策略可以用下面公式表示:

设Boat船上的人员集合是C。如果集合C中规定的人员过河时,则S1’=S1-C,S2’=C+S2;当集合C中规定的人员返回时,则S1’=S1+C,S2’=S2-C。而且新集合S1’、S2’应该遵循安全规则,即要避免以下3件事发生:(1)如果警察不在,犯人就会伤害一家六口;(2)如果爸爸不在,妈妈就会伤害儿子。(3)妈妈不在,爸爸会伤害女儿。

另外当由节点<S1,S2>变迁到新节点<S1’,S2'>后,则Boat的航行方向跟原来的航行方向相反。

在过河之前,此时二元组节点的初始值vfirst是<{爸爸,妈妈,儿子1,儿子2,女儿1,女儿2,警察,犯人},{}>;而所有人都过河了,则二元组变成了最终值VLast,即为<{},{爸爸,妈妈,儿子1,儿子2,女儿1,女儿2,警察,犯人}>。要得到过河方案,即要找到由开始二元组节点v_first,经过若干次过河或返回后,最后变迁到结束二元组节点VLast,便结束。待结束后,依次输出节点变迁过程中船Boat的行为(即船上人员集合过河或返回),就是过河方案。

而为了更有效地从一节点变迁到下一节点,采用有效回溯算法:即根据当前船的信息,为每一个节点保存过河或返回的所有有效的坐船人员候选集合,如果所选择的集合不是有效的,则从该节点的候选集合中删除掉该集合。例如,对于初始节点v_first,如果过河的话,该节点的坐船人员候选集合是{{爸爸,妈妈},{爸爸,儿子1},{爸爸,儿子2},{妈妈,女儿1},{妈妈,女儿2},{警察,犯人}}。如果选择{爸爸,妈妈}集合坐船过河,得到新节点<{儿子1,儿子2,女儿1,女儿2,警察,犯人},{爸爸,妈妈}>,随后,如果{爸爸,妈妈}返回,则又得到了初始节点vfirst;另外,如果爸爸或妈妈中的一人返回,得到的新节点不安全。所以,回溯到节点vfirst,并从节点vfirst的有效过河候选集合中删除掉集合{爸爸,妈妈}。然后,重新选择新的候选集合,并变迁到其他的节点,重复循环这种操作,直到得到的新节点时是结束节点VLast,就结束。在此算法中,利用栈来保存每个节点以及相应的坐船人员候选集合。八人过河问题的流程图如图1所示。其中图2是图1中处理候选集合list不为空情况的细化部分。

3编程实现

在程序中定义的类有:集合类CSet、船类Boat、安全规则类Rule、节点类Node、节点候选集合类Node Edges以及方案类Scheme。

3.1集合类CSet

该类提供了多种方法,主要提供了集合的加减运算以及产生子集等功能。

集合类CSet中的主要方法有:

方法public void Add(CSet s):当前集合加集合s,结果保存到当前集合中。

方法public void subtract(CSet s):当前集合减法集合s,结果保存到当前集合中。

方法public boolean Is Same Of Content(CSet s):比较当前集合与指定集合s的内容是否相同,如果相同,返回true,否则返回false.

方法public Hash Set<Hash Set<String>>get Sub Set Of Length(int start Length,int end Length)功能:得到当前集合的子集的集合,且子集中的元素(集合)的长度大于等于start Length,而小于等于end Len。例如,对于集合{a,b,c},如果start Length=2,end Len=3,则产生的集合是:{{a,b},{a,c},{b,c},{a,b,c}}。

方法public Hash Set<Hash Set<String>>get Sub Set()功能:得到当前集合的所有子集,对于集合{a,b,c},则产生的所有子集的集合是:{{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}}。

方法public Array List Get List Of Boat People Set(Boat boat,Rule rules[])功能:依据船boat的有关信息和安全规则rules,从当前集合中选出坐船人员集合的列表(在保证当前集合和船都安全的情况下)。其中,返回Array List类型值的元素是CSet类型。例如,如果河岸人员集合是{妈妈,女儿1,儿子2,爸爸,女儿2},而对岸人员集合是{犯人,警察,儿子1},若boat的方向是过河,则有效坐船人员集合的列表是:{爸爸,儿子2}-{爸爸,妈妈},注意,不能包括{妈妈,女儿1},{妈妈,女儿2};若boat的方向是返回,则坐船人员集合的列表则是:{警察,犯人}-{警察,儿子1},注意,不能包括{警察}。

方法boolean Is Safe(Rule r[])功能:依据安全规则(由数组r规定),判断当前集合set是否安全,如果安全则返回true,否则返回false。当前集合中存在害人者,和受害者,但没有相应的控制者时,这种情况就不安全。

3.2 Boat类

该类主要是对过河所需要的船进行了定义。有关船的信息包括:船方向、坐船人员集合、船载人数量以及规定的水手。

集合类CSet中的主要方法有:

方法public boolean Is Over Load()功能:判断船是否超载,如果超载返回true,否则返回false.

方法public void On Boat(CSet s)功能:指定坐船人员集合s坐船。

方法public CSet Off Boat()功能:船上人员下船,并返回下船人员集合。

方法public boolean Is Safe()功能:判断船是否安全:是否超载,以及是否存在指定水手人员。如果超载或者没有指定的水手人员,则返回false(船不安全);如果安全且存在指定水手人员则返回true(表示船安全).

3.3 Rule类

该类是是定义安全规则,规则控制者、害人者以及受害者集合。如果控制者不在现场的话,害人者与受害者在一起的话,则害人者会伤害受害者。例如,如果警察不在,犯人就会伤害一家6口,警察是控制者,犯人是害人者,而集合{爸爸,妈妈,儿子1,儿子2,女儿1,女儿2}是受害者集合。

3.4 Node类

该类是对河岸以及对岸人员集合,所用到的船以及两岸人员集合应该遵循的若干安全规则进行了定义。

Node类中有如下主要方法:

方法public Node get Next Node(CSet set)功能:依据节点中船信息和安全规则,从河岸或对岸的当前集合中选出坐船人集合的列表(在保证当前集合和船都安全的情况下),产生新节点并返回新节点。

方法public Array List Get List Of Boat People Set()功能:依据当前节点船的方向,得到合法的坐船人员集合列表。

方法public boolean Is Safe()功能:判断当前节点是否安全(即判断河岸以及对岸人员集合是否安全),如果安全则返回true,否则返回false。

方法public boolean Is Same Node Of Content(Node n)功能:当前节点是否与指定节点(n)内容(包括船的方向)相同时,内容相同返回true,否则返回false

方法public boolean Is Same Node Of Content1(Node n)功能:判断当前节点是否跟指定节点n的河岸以及河对岸人员是否是相等的。不包括船的方向。

3.5 Node Edges类

由于下面Scheme类的方法Deal With(),采用了有效回溯法,Node Edges类主要作用是为了保存节点的有效的坐船人员候选集合。

3.6 Scheme类

该类规则了过河游戏的开始节点和结束节点。其中方法Deal With()是得到过河方案的主要算法。方法Scheme1()解决了八人过河问题,而方法Scheme2()则是处理农夫过河问题。

Scheme类主要方法有:

方法public boolean Is Exist In Stack(Stack stack,Node node)功能:判断指定节点node是否与栈stack中节点内容相同,如果相同的话,则返回true,否则返回false。

方法public int Best Index In List(Array List list,int direction)功能:船过河时(即direction的值为Boat.PASSRIVER),从候选集合列表中随机选择一个元素的下标返回,船返回时(即direction的值为Boat.BACK),优先选择那些元素个数最小的下标返回。比如:对于列表{a,b}-{a,c}-{b,c}-{a}-{b,c},当船过河时,返回0到4范围内的随机值。当船返回时,则返回3值,因为集合{a}的元素个数最小。

方法public void Deal With()功能:得到过河方案,保持在栈stack中,然后输出栈中内容(即过河方案)。其具体情况如下:

方法public static void Scheme1()功能:得到八人过河游戏方案。

方法public static void Scheme2()功能:农夫过河问题。

3.7程序运行情况

在Scheme类中,方法scheme1()得到了八人过河方案,而scheme2()得到了农夫过河方案,运行Scheme类的main()方法,运行结果如下:

八人过河方案:

步骤(1):{犯人,警察}过河

步骤(2):{警察}返航

步骤(3):{警察,儿子1}过河

步骤(4):{犯人,警察}返航

步骤(5):{儿子2,爸爸}过河

步骤(6):{爸爸}返航

步骤(7):{妈妈,爸爸}过河

步骤(8):{妈妈}返航

步骤(9):{犯人,警察}过河

步骤(10):{爸爸}返航

步骤(11):{妈妈,爸爸}过河

步骤(12):{妈妈}返航

步骤(13):{妈妈,女儿2}过河

步骤(14):{犯人,警察}返航

步骤(15):{警察,女儿1}过河

步骤(16):{警察}返航

步骤(17):{犯人,警察}过河

一个农夫带着一只狼、一只羊和一棵白菜过河方案:

步骤(1):{农夫,羊}过河

步骤(2):{农夫}返航

步骤(3):{白菜,农夫}过河

步骤(4):{农夫,羊}返航

步骤(5):{农夫,狼}过河

步骤(6):{农夫}返航

步骤(7):{农夫,羊}过河

摘要:针对八人过河问题,设计了一种有效回溯算法,Java编程实现了八人过河的过河方案,同时,该算法亦可以得到农夫过河问题的过河方案,并给出有效的Java程序来解决此类过河问题。

关键词:八人过河问题,农夫过河问题,回溯法

参考文献

[1]王国全.商人过河问题的Java实现[J].电脑编程技巧与维护,2009,(05),25-27.

[2]张念发,张宪新,刘长征.基于状态空间搜索法的商人过河问题解决方案[J].电脑编程技巧与维护,2010,(18):36-38.

Java编程 篇9

Java语言的一个非常重要特点就是平台无关性, 而使用Java Virtual Machine (JVM, Java虚拟机) 是实现这一特点的关键。JVM是一个虚构的计算机, 它是通过在实际的计算机上仿真模拟各种计算机功能来实现的, 因此JVM屏蔽了与具体平台相关的信息, 使得Java语言编译程序只需生成在JVM上运行的目标代码 (字节码) , 就可以在多种平台上不加修改地运行。JVM在执行字节码时, 把字节码解释成具体平台上的机器指令执行, 这就是Java能够“一次编译, 到处运行”的原因。

虽然JVM是为支持Java语言的语义而设计的, 但是这种将编程语言与运行时环境分开的技术使得它也可以用作其他语言的目标。在过去几年间, 使用JVM来运行非Java程序的情况成增长趋势, 据统计有超过200种语言能够运行在JVM平台上。有的基于JVM的语言Jython (1997年) 和JRuby (2000年) 都是从其他已存在的语言移植到JVM中来的, Jython (之前被称为Jpython) 是一个基于JVM的Python语言实现, Sun公司资助的JRuby是一个基于JVM的Ruby版本, 而全新的基于JVM的语言是Groovy、Scala。Clojure还算不上是JVM的一种新的编程语言, 它是一种Lisp方言。

随着运行在JVM上的程序设计语言大量增多, 大大激发了多语言编程理念, 因为这样你可以混合使用编程语言并可以选择最佳匹配, 同时还维护着相同的底层字节码和类库。在实际应用中, 没有一种语言可以做到完美解决一切问题, 每种语言都有自己擅长的方面, 而且日趋复杂的软件需求也使得混合编程的应用场景更加频繁。对于Java程序员来说, 技术单一正面临着危机, 混合编程时代已经到来, 这是Java程序员必须迎接的挑战。

本文接下来首先回顾静态类型语言和动态类型语言、命令式语言和声明式语言的基本概念和各自的优缺点, 然后介绍Java语言的发展趋势和基于JVM的代表性语言Jython、JRuby、Groovy、Scala和Clojure, 最后指出软件项目的未来在于混合语言编程, Java仍将是JVM生态系统中的重要组成部分。

2 静态类型语言和动态类型语言 (Statically typedlanguage vs. dynamically typed language)

根据变量的类型是在编译时确定还是在运行时确定, 编程语言可分为静态类型语言和动态类型语言。静态类型语言是指在编译时变量的数据类型即可确定的语言, 如:Java, C++等等, 多数静态类型语言要求在使用变量之前必须声明数据类型 (某些具有类型推导能力的现代语言可能会部分减轻这个要求) 。与此相反, 动态类型语言是指在运行时确定数据类型的语言, 变量使用之前不需要类型声明, 通常变量的类型是被赋值的那个值的类型, 如:Python和Ruby就是典型动态类型语言, 很多脚本语言vbscript, javascript也是这类语言。

要区分静态和动态类型语言仅从语法格式上就足够了, 如代码清单1和代码清单2所示:

public int add (int x, int y) {

return x+y;

}

代码清单1:静态类型语言 (Java)

function add (x, y) {

return x+y;

}

代码清单2:动态类型语言 (JavaScript)

静态类型语言的主要优点在于其结构规范, 便于调试, 方便类型安全, 缺点是为此需要写更多的类型相关代码。静态类型语言为了达到多态会采取一些类型鉴别手段, 如继承、接口, 而动态类型语言则不需要。动态类型语言的优点在于不需要写非常多的类型相关的代码, 缺点自然就是不方便调试, 命名不规范, 会造成不利于理解等。

3命令式编程语言和声明式编程语言 (Imperative programming language vs. declarative programming language)

根据编程范式的不同, 高级编程语言可分为命令式语言和声明式语言, 两者的编程方式有很大的差异。

命令式语言是基于动作的语言, 以冯诺依曼计算机体系结构为背景。机器语言及汇编语言是最早的命令式语言, 在这种语言中, 计算机被看作是动作的序列, 程序就是用语言提供的操作命令书写的一个操作序列。用命令式语言编写程序, 就是描述解题过程中每一步, 程序的运行过程就是问题的求解过程。命令式语言分为面向过程和面向对象, 传统的命令式语言比如Fortran、C和Pascal都是面向过程的, 它们主要的程序设计单元是过程。现代的命令式语言比如C++、Java和C#则是面向对象的, 它们将对象作为程序的基本单元, 将程序和数据封装其中, 通过对象之间的协作来解决问题。

声明式编程与命令式相对立, 不同于命令式编程需要用算法明确指出每一步该怎么做, 声明式编程描述目标的性质, 让计算机明白目标, 而非流程, 即告诉计算机需要计算“什么 (What) ”而不是“如何 (How) ”去计算。声明式编程是一个大的概念, 其下包含一些有名的子编程范式:约束式编程、领域专属语言、函数式编程、逻辑式编程等。例如:数据库查询语言 (SQL, XQuery) , 正则表达式属于领域专属语言, LISP属于函数式编程语言, Prolog属于逻辑式编程语言。声明式编程语言通常用作解决人工智能问题和约束满足问题。

命令式编程通常会让代码变得十分冗长, 更重要的是由于它提供了过于具体的指令, 使得执行代码的基础设施 (如JVM) 没有太多的发挥空间, 只能老老实实地根据指令一步步地向目标前进。因为像“执行目的”这样更高层次的信息已经丢失了, 并行执行程序会变得十分困难, 因此, 编程语言的趋势之一, 便是能让代码包含更多的“What”, 而不是“How”, 这样执行环境便可以更加聪明地去适应当前的执行要求, 所以声明式编程自2009年起备受人们的关注。

4 Java语言的发展趋势 (The trend of the Javalanguage)

Java语言集许多语言的优点于一身, 它的面向对象特性让大型软件工程变得更加容易管理, 它的自动垃圾回收机制能有效地管理内存和防止内存泄露, 它的平台无关性让Java在服务器端软件领域获得巨大成功。Sun公司在推出Java时就将其作为开放的技术, 得到了广大软件开发商的支持, Java拥有世界上最大的开发人群和开源生态系统, 这是其他语言无法比拟的。

Java语言已经证明了它的强大与成功, 但是Java并不是尽善尽美的。对Java语言的批评主要集中在三个方面:语言问题、模块化问题、性能问题。首先是语言问题, Java是静态类型语言, 属于命令式编程范式, 它的语法与固有范式存在着已知的局限性。Java语言的一个发展趋势是在可能的范围内降低语言本身的语法复杂度, 从J2SE 5.0中增强的for循环, 到Java SE 7中的try-with-resources语句和<>操作符, 再到Java SE 8中引入的lambda表达式, Java正在不断地简化自身的语法并引入一些重要的现代语法特征, 例如函数式编程中的某些特性。第二是模块化问题, Java平台所包含的各种功能不同的类库是一个统一的整体, 在一个程序的运行过程中很多类库其实是不需要的。模块化的含义是把Java平台提供的类库划分成不同的相互依赖的模块, 程序根据需要选择运行时所依赖的模块, 只有被选择的模块才会在运行时被加载。模块化的实现不仅可以应用到Java平台本身, 也可以应用到Java应用程序的开发中, OpenJDK中的Jigsaw项目提供了这种模块化的支持[1]。第三是性能问题, 这主要是因为JVM这个中间层次的存在。随着硬件技术的发展, 越来越多的硬件平台采用了多核CPU和多CPU的架构, Java平台需要帮助开发人员更好地充分利用这些资源来提高程序的运行性能。Java SE 7中的fork/join框架是一个高效的任务执行框架。Java SE 8对集合类框架和相关API做了增强, 以支持对批量数据进行自动的并行处理。

Java仍然是最受欢迎的编程语言, 而且至少在接下来的这几年里不会改变, 原因有很多:首先, 许多计算机科学的程序和其他领域的程序是用Java编写的。第二, Java有一个巨大的稳定的代码库。第三, 有大量的厂商投资、工具、培训和其他产品, 使得无论是供应商还是他们的客户都依赖Java。第四, Java拥有最大的开发社区和开源生态系统, 当涉及到选择何种工具、供应商和开发者作为未来的开发方向时, Java仍然是首选。

5 基于JVM的语言 (JVM-hosted languages)

Java面临的最大的威胁是快速发展的JVM-hosted语言, 如Jython、JRuby、Groovy、Scala和Clojure, 这些语言都基于JVM, 它们可以与Java语言方便简单地集成, 相比Java都有更加简明的语法和丰富的表达能力。以Groovy、Scala和Clojure为代表的JVM语言被业界称为“JVM三巨头”, 调查显示Groovy和Scala两者都显示出强劲的商业应用热度, Clojure的支持绝大部分来自业余爱好者和lisp黑客, 而不是商业组织[2]。没有任何一种语言可以彻底地取代另外一种或是所有的语言, 它们根据各自的擅长很好地解决问题。

Java是静态类型语言, 遵循命令式编程范式, 是面向对象语言。而其他JVM语言较好地结合了各种语言优势。表1显示, 五种JVM语言中除了Scala其余四种都是动态类型语言;除了Groovy, 其余四种都支持函数式编程;除了Clojure, 其余四种都是面向对象语言。

5.1 Jython

Jython即是Python语言的Java实现。要了解Jython, 首先要了解Python。Python支持命令式程序设计、面向对象程序设计、函数式编程、面向方面的程序设计、泛型编程多种编程范式。Python开发者的哲学是“用一种方法, 最好只有一种方法来做一件事”, 因此Python源代码具备很好的可读性, 并且能够支撑大规模的软件开发。Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表, 甚至开发科学计算应用程序。一些知名大学采用Python教授程序设计课程, 例如卡耐基梅隆大学的编程基础和麻省理工学院的计算机科学及编程导论就使用Python语言讲授。

Jython是用Java编写, 它继承了Java和Python二者的特性而显得很独特, 如Jython代码的可读性和清晰性, 与Java的无缝集成, 动态类型, Java程序员在数日内就能熟悉Jython。

5.2 JRuby

JRuby是Ruby语言的纯Java实现 (Ruby是用C写的) , 它结合了Ruby简洁的语法以及Java丰富的类库, 通过JRuby可以在JVM上直接运行Ruby程序, 调用Java的类库。JRuby无缝地“组合”了Java和Ruby的优势, 使我们的开发效率事半功倍[3]。

Ruby发明的理念是“你既能进行高效开发又能享受编程的快乐”, 其次是良好的界面设计, 他强调系统设计必须注重人性化, 而不是一味从机器的角度设想, 遵循上述的理念, Ruby语言通常非常直观, 按照编程人认为它应该的方式运行。Ruby是一种有趣的语言, 它支持使用多重范式, 其中之一是“函数式范式”, JRuby是完全面向对象的。

5.3 Groovy

Groovy是Java平台上设计的面向对象编程语言。这门动态类型语言拥有类似Python、Ruby和Smalltalk的一些特性, 可以作为Java平台的脚本语言使用。Groovy的语法很像Java以至于多数的Java代码也是正确的Groovy代码, 这样了解Java的开发者可以更快地学习Groovy。Groovy代码动态的被编译器转换成Java字节码。由于其运行在JVM上的特性, Groovy可以使用其他Java语言编写的库。Groovy的优势在于易用性以及与Java无缝衔接, 一些开发者由于Groovy和Java的无缝集成而使用Groovy[4]。

5.4 Scala

Scala是一种纯粹的面向对象编程语言, Scala中的每个值包括基本数据类型都是对象, 连函数也是对象。Scala包含若干函数式语言的关键概念, 把函数式和面向对象的编程思想很好地统一到了一种语言里。Scala可以与Java互操作, 可以访问现存的数之不尽的Java类库, 这使得Scala成为Java程序员解决某些问题的另一种选择。Scala把Erlang风格的基于actor的并发带进了JVM, 开发者现在可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序, 它会自动获得多核处理器带来的优势, 而不必依照复杂的Java线程模型来编写程序。因此与Groovy相比, Scala的优势在于性能和一些高级特性[5]。

5.5 Clojure

Clojure给JVM带来了Lisp。Lisp是基于λ演算的函数式编程语言, 以表达性和功能强大著称, 但人们通常认为它不太适合应用于一般情况, Clojure的出现彻底改变了这一现状, 它是一种运行在Java平台上的Lisp方言, 在任何具备JVM的地方都可以利用Lisp的强大功能。Clojure不是面向对象的, 但提供了很多你想从OO中得到的东西, 如封装 (通过名字空间、私有定义和闭包) 、强大的多态 (multimethods) 、函数重用比继承更胜一筹。同时, Clojure可以无缝地与Java进行交互操作, 因此, Java开发团队学习Clojure具有优势。Clojure还把函数式编程语言引入JVM, 使Clojure成为一种进行并行、并发编程的完美语言, 支持现在的多核、多CPU以及分布式计算。

6 结论 (Conclusion)

我们究竟需要什么样的编程语言?企业级项目和Web项目需要怎样的语言?一般而言有以下要求:可伸缩性、可移植性、并行编程、高性能、DSL (领域专属语言) 的实现, 还有对于低风险的要求, 如与旧项目的兼容性, 旧项目迁移的成本, 开发工具的支持, 开发团队对语言的熟悉情况, 以及语言开发团队的稳定性等等。而具体到每一位开发者头上情况变得更加复杂。他们可能想要:动态的、静态的、强类型的、函数式的、富有表达力的、面向对象的、容易学习的 (在有Java或其他语言开发经验的基础上) 、快捷的、模块化的、有强大的类库、有好用的框架、有合适的IDE、有活跃的社区等等。某些语言可能满足上述条件中的若干条, 但是没有任何一种语言能够满足所有条件。同时, 一个项目的不同层面的需求也是不同的, 比如, 广受欢迎的社交网络及微博网站Twitter, 表层是Ruby on Rails, 底层是Scala;著名的在线学习网站Coursera把Scala作为服务器语言使用。

综上所述, 软件项目的未来在于混合语言编程, 而Java仍将是JVM生态系统中的重要组成部分。

参考文献

[1]OpenJdk Project Jigsaw[EB/OL].http://openjdk.java.net/projects/jigsaw/

[2]The Big Three-Scala, Clojure and Groovy[EB/OL].http://thecodegeneral.wordpress.com/2012/03/04/the-big-threejvm-languages/.

[3]JRuby Homepage[EB/OL].http://www.jruby.org/.

[4]Groovy Homepage[EB/OL].http://groovy.codehaus.org/.

Java编程 篇10

1 JAVA语言概述

其主要特征包括以下几个方面:1) 语言难度较低, 从语法上来看JAVA与C++较为相似, 因此只要具有一定的C++基础都可较好的适应JAVA, 同时Java语言不使用指针, 而是引用并且还具备了自动废料手机, 因此程序员无需担心内存管理。2) JAVA语言在面向对象时具有一定的强制性, 一般只支持类之间的单继承, 对于接口而言则可支持多承接, 同时JAVA语言支持动态绑定, 也就是说JAVA语言属于典型的面向对象语言。3) 分布性。在JAVA应用当中其编程接口存在一个javanet, 它带来了网络应用编程类库从而使JAVA具备了分布性。4) 安全性。JAVA具备专门的安全机制可有效避免恶意代码攻击, 同时网络下载的类也具备了与Class Loader相似的安全防范功能。5) 动态性[2]。JAVA语言最初设计目标是能够让语言可满足环境动态变化, 这便于应用升级。在这个过程中JAVA可动态性地被置于运行环境当中, 同时也能够利用网络环境向其中置入类。

2 基于JAVA的网络安全通信分析

由于JAVA对于网络环境具有专门的面向性, 因此可以完全面向对象的方式带来相关的支持, 从机制方面来看主要分为两个层次:1) 通过是利用Socket实现CLIENT/SERVER通信模式的类库。在通信协议的支持下类库也可采取两种方式进行通信, 首先可通过具备连接的流方式进行通信。在此连接上, 可采取相同进程提供字节流服务, 而这些字节流具有可靠性、有序性等特征, 保证了通信的稳定。2) 数据报方式在无连接条件下进行。该方式无需在系统初始化时连接, 并且I/O操作可由不同主机完成亦可在不同进程当中操作, 同时可进行独立分组进行传输, 长度一般为32kb[3]。在传输过程中并不能保证数据的顺序性、可靠性等特性。因此在安全性上也不如流方式。

另一方面JAVA可以通过统一资源来对URL进行有效定位, 那么当用户对应用类库进行访问时就无须对URL当中的条件协议进行处理, 这也使其可给予HTTP充分的支持。以JSSE客户端为例, 基于JSSE可为Java应用程序提供Java API, 同时JSSE可支持数据加密并可实现服务器端身份验证, 可保持数据的完整性, 利用JSSE可保证基于HTTP、Telnet、FTP等协议的客户程序与服务器进行有效的数据交换。若要使JSSE可顺利进行上述过程, 需要相关证书作为保证。以下为客户端局部代码:

3 结语

正是由于利用JAVA可对各类用户接口进行有效处理, 为设置网络访问权限提供了极大的便捷并且适用于各个平台, 需要注意的是利在JAVA (JSSE) 的应用过程中要先置入有效的证书才能使其正常工作。JAVA为网络安全通信来说带来了强力的技术支持, 值得推广。

参考文献

[1]廉洁, 赵群荣, 乌兰.Java网络安全研究[J].内蒙古民族大学学报 (自然科学版) , 2008.

[2]范婕, 贾伟.电子商务中的安全问题及对策探讨[J].大众科技, 2008.

Java编程 篇11

福建省自然科学基金项目(Z0512003)资助MATLAB是由Mathwork公司推出的一种高性能的数值计算和可视化软件。它的编程比较简单,有强大的矩阵运算及图形显示能力,还有多样化的各种工具箱可供使用,在数值分析、信号处理、系统辨识、特殊函数和图形等方面具有广泛的应用。不过,由于MATLAB是一种解释性语言,执行效率比较低,而且它并不适用于通用的编程平台,这就大大限制了它的应用场合。

JAVA是由Sun公司开发的一种面向对象的程序设计语言。它具有简单、跨平台、分布式、解释性、可靠、安全、结构中立性、可移植性、高性能、线程等优点,已被广泛应用于开发各种商业软件。但是,JAVA对某些比较复杂的数学运算的编程比较繁琐,处理速度也较慢 。

因此,如果能在JAVA程序中调用MATLAB程序来处理一些比较复杂的数学运算,充分发挥MATLAB强大的数学运算能力和仿真功能,就能弥补单独编程的缺点,提高编程效率和加快处理速度。

1 通过JNI技术调用MATLAB Engine函数

通过JAVA的JNI技术调用MATLAB向C/C++语言提供的MATLAB Engine函数,能实现JAVA程序对MATLAB程序的调用。

1.1 JNI技术

JAVA的JNI技术[1]是JAVA Native Interface的简称,意思是本地编程接口。 Java语言是一种功能很强的编程语言,应用程序如果能全部用JAVA语言来编程固然很好。但在实际的编程过程中,如果已经有了大量测试过和调试过的其它语言的代码,将这些代码移植成JAVA语言很费时间,而且产生的代码还需要再次测试和调试。这时候如果能在JAVA中使用其他语言将会减少开发的时间。JAVA语言提供的JNI技术,使得JAVA程序代码能够调用使用其他编程语言(如C++)编程的有关知识。JNI最重要的好处是它没有对底层JAVA虚拟机的实现施加任何限制。因此,JAVA虚拟机的厂商可以在不影响虚拟机其他部分的情况下添加对JNI的支持。程序员只需编写一种版本的本地应用程序获库,就能够与所有支持JNI的JAVA虚拟机一起工作。

1.2 MATLAB Engine函数

MATLAB Engine函数[2]是指一组MATLAB提供的面向C/C++和Fortran等语言的接口函数,用户可以通过在其它编程环境中调用这些接口函数,实现对MATLAB的控制。通过MATLAB Engine ,应用程序会打开一个新的MATLAB进程,可以控制它完成任何计算和绘图操作。同时,MATLAB Engine方式打开的MATLAB进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制MATLAB运行的流程,并可在其中输入任何MATLAB命令。

常见的MATLAB Engine函数有:

engOpen:开启Matlab Engine。

engClose:关闭Matlab Engine。

engGetVariable:从Matlab Engine中获得一个Matlab矩阵,用于数据交换。

engEvalString:执行一个Matlab命令。

engPutVariable:从应用程序向Matlab Engine发送一个Matlab矩阵,用于数据交换。

engOutputBuffer:创建字符缓冲区以获取Matlab文本输出。

1.3 JNI技术调用MATLAB Engine函数的基本步骤

1)编写JMatLink.java,将所有要调用到的MATLAB Engine函数定义成native。

2)在JMatLink.java中加入static的System.loadLibrary("JMatLink")。

3)使用javac编译JMatLink.java生成JMatLink.class。

4)使用javah-jni JMatLink.class 来生成JMatLink.h。

5)在VC中创建动态链接库工程JMatLink.dll,将JMatLink.h文件加入工程中。

6)编写实现JMatLink.h文件对应的JMatLink.cpp文件。

7)编译JMatLink.dll文件,将JMatLink.dll文件放到JMatLink.java的目录中。

要在VC中成功编译JMatLink.dll,必须在JMatLink.cpp包含MATLAB Engine头文件engine.h并引入MATLAB对应的库文件libmx.lib、libmat.lib、libeng.lib、libmatlb.lib。具体的设置如下:

1)通过菜单工具→选项,进入目录页面,在目录下拉列表框中选择Include files,添加路径:"C: MATLABextern include"(假定MATLAB安装在C: MATLAB目录)。

2)选择Library files,添加路径:C: MATLAB extern lib win32 microsoft msvc60。

3)通过菜单工程→设置,进入连接页面,在对象/库模块编辑框中,添加文件名libmx.lib libmat.lib libeng.lib libmatlb.lib。

2 混合编程在量子密码通信中的应用

加密是保障信息安全的重要手段之一。当前最常用的加密技术是用复杂的数学算法来改变原始信息。这种方法虽然安全性较高,但存在被破译的可能,并非绝对可靠。而量子密码是一种截然不同的加密方法,主要利用量子状态作为信息加密和解密的密钥。任何想测算和破译密钥的人,都会因改变量子状态而得到无意义的信息,而信息合法接收者也可以从量子态的改变而知道密钥曾被截获过。从理论上来说,用量子密码加密的通信不可能被窃听,安全程度极高。1984年,Bennett和Brassard在研究中发现,单量子态虽然不好保存但可用于传输信息,两人共同提出第一个量子密码分配协议BB84协议[3]。

丹麦Aarhus大学用JAVA语言编写了一个模拟量子密钥分配协议的软件平台——QuCrypt,利用它在互联的计算机上实现了对BB84协议和B92协议的模拟。现在要在QuCrypt软件平台上模拟另外一种量子密钥分配协议——Reverse Reconciliation Gauss-moduled QKD协议[3]。

Reverse Reconciliation Gauss-moduled QKD协议(简称RR协议)[4]是基于连续变量的一种量子密钥分配协议。在QuCrypt平台上模拟RR协议共分为三步:首先,由发送方通过QuCrypt软件的量子信道发送连续调制相位和幅度的相干光脉冲来获得具有高斯分布的密钥信息,同时接收方进行零差拍的探测。然后,通信双方执行样条纠错算法(slice算法)将连续变量的密钥转换成离散的二进制密钥。最后,双方再通过QuCrypt软件的公共信道进行比较,得到最终密钥。在这个过程中,第二步的slice算法是用MATLAB语言编写的,而通信平台是JAVA语言编写的。因此,这就要求在JAVA的程序中实现对MATLAB程序的调用。

2.1 Slice算法的MATLAB程序

slice算法是实现将连续的高斯变量离散化的算法。假设发送方拥有一连串的高斯变量X(1…n), 接收方也拥有X′(1…n),由于信道噪声的存在X′=X+ε, εN(0,σ)。函数S(X)可以将初始密钥转换成mbit的二进制数S1…m(X)=(S1(X),…,Sm(X))。图1表示的是m=3的情况:

P(X)是变量的概率密度分布函数,依据一定的规则划分为2m片段,在X轴上对应的区间为[Ti,Ti+1](0<≤i≤2m-1)。每一个区间对应密码本中特定的S1…m(X)。量化时首先判断变量X落在那一个区间里,然后再映射到相应的S1…m(X)。同理,接收方量化得到S1…m(X')。把S1…m(X)和S1…m(X')又称为“Slice(片段)”。

MATLAB源代码的核心部分及其说明如下:

%t是总的量化区间

t=[-10,-2.347,-1.808,-1.411,-1.081,-0.768,-0.514,-0.254,0,0.254,0.514,0.768,1.081,1.411,1.808,2.347,10.0];

%共有5000个随机数

numall=5000;

variance1=1;

%打开保存随机数的文件

fid=fopen('ziggurat.txt','r')

randn=fscanf(fid,'%f');

fclose(fid);

for i=1:numall;

%x是发送方送出的数

rawx(i)=variance1.*randn(i);

end

%goodkey保存了发送方和接收方采用相同基的位

fid3=fopen('goodkey.txt','r')

pos=fscanf(fid3,'%c')

fclose(fid3);

goodkey=1;

for i=1:numall;

%如果采用相同基,则保留该随机数

if( pos(i)==′1′)

x(goodkey)=rawx(i);

y(goodkey)=rawy(i);

goodkey=goodkey+1;

else goodkey=goodkey;

end

end

goodkey=goodkey-1;

%将发送方的值量化成四位二进制数

for i=1:goodkey;

for k=1:16;

d=k-1;

if x(i)>=t(k)&x(i)<=t(k+1)

sx1(i)=mod(d,2);

sx2(i)=mod(fix(d/2),2);

sx3(i)=mod(fix(fix(d/2)/2),2);

sx4(i)=mod(fix(fix(fix(d/2)/2)/2),2);

break;

end

end

end

2.2 JAVA程序的实现

为了在QuCrypt软件平台上调用MATLAB Engine函数,首先,把JMatLink.java,JMatLink.class和 JMatlink.dll加到QuCrypt软件的程序里面。然后,用JAVA编写一个界面程序Jmatlabtest.java也加入到程序里面,JMatLink.java的功能是建立一些按钮,只要按下这些按钮,就可以调用由MATLAB编写的slice算法。它运行后的界面如图2所示,其中,slice1,slice2,slice3,slice4就是slice算法。

Jmatlabtest.java中先要在程序的开头新建MATLAB Engine函数的对象:

JMatLink eng=new JMatLink();

Jmatlabtest.java中实现按钮功能方法的核心代码如下:

class Btn1 implements ActionListener {

public void actionPerformed(ActionEvent e)

{

eng.engOpen();//打开MATLAB Engine函数

eng.engEvalString(……);//执行括号里面的程序

eng.engClose(); //关闭MATLAB Engine函数

}

}

eng.engEvalString(……)的括号里面是经过修改过的实现slice算法的MATLAB代码。这些代码是先将原来的MATLAB代码整个拷贝过来,然后修改代码中一些在MATLAB环境下和JAVA环境下不同的符号。比如,在WINDOWS中,MATLAB程序的路径分隔符号是“”,而JAVA程序的路径分隔符号则是“/”。又比如,MATLAB程序的注释符号是“%”,而JAVA程序的注释符号是“//”。图2中的转化代码按钮就是实现这些功能的。

按下图2中“执行slice1”按钮后,就会跳出一个MATLAB命令窗口。在命令窗口中可以输入MATLAB命令来观察程序运行的状况。比如,在命令窗口中输入workspace后可以跳出MATLAB工作区间,在工作区间中就能对程序中的一些变量进行操作处理了。

3 小结

通过MATLAB Engine函数来实现JAVA程序对MATLAB程序调用的方法和应用,要利用VC作为中介,建立一个JAVA和MATLAB Engine函数相关联的JMatLink库。因此,在处理数据量非常大的程序中,这种方法会比较慢。但是,这种方法只需要建立一次JMatLink库,以后只要根据需要增加JMatLink库里面的MATLAB Engine函数。而且,在JAVA程序调用MATLAB程序的过程中对原来的MATLAB代码改动较少,这就能够充分利用好很多现有的MATLAB代码。使用JAVA和MATLAB进行混合编程可以提高程序处理速度和简化程序处理过程,在需要复杂的数学运算与数学仿真的领域,必将会得到越来越多的应用。

摘要:JAVA和MATLAB的编程有各自的优缺点。将它们结合起来进行混合编程能够充分发挥它们各自的优点,弥补单独编程的不足之处。本文介绍了通过JNI技术实现JAVA对MATLAB调用的方法,并说明了其在量子密码通信中的一个应用。

关键词:JAVA,MATLAB,量子密码,混合编程

参考文献

[1]Cay S,Cornell.Gary JAVA2核心技术卷2第7版.陈昊鹏,王浩,姚建平,等译.北京:机械工业出版社,2006:717—759

[2]余啸海.Matlab接口技术与应用.北京:国防工业出版社,2004

[3]Bennett C H,Brassard G.Quantum cryptography:pablie key distribu-tion and coin tossing.In:Proceedings of IEEE International Conference on Computers,Systems and Processing.Bangalore,1984;175

上一篇:第一人称叙事视角下一篇:二元分析