博文
java数据类型转换(2006-04-15 02:31:00)
摘要:一些初学JAVA的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double型之间的转换,整数和String类型之间的转换,以及处理、显示时间方面的问题等。下面笔者就开发中的一些体会介绍给大家。
我们知道,Java的数据类型分为三大类,即布尔型、字符型和数值型,而其中数值型又分为整型和浮点型;相对于数据类型,Java的变量类型为布尔型boolean;字符型char;整型byte、short、int、long;浮点型float、double。其中四种整型变量和两种浮点型变量分别对应于不同的精度和范围。此外,我们还经常用到两种类变量,即String和Date。对于这些变量类型之间的相互转换在我们编程中经常要用到,在下面的论述中,我们将阐述如何实现这些转换。
1 数据类型转换的种类
java数据类型的转换一般分三种,分别是:
(1). 简单数据类型之间的转换
(2). 字符串与其它数据类型的转换
(3). 其它实用数据类型转换
下面我们对这三种类型转换分别进行论述。
2 简单数据类型之间的转换
在Java中整型、实型、字符型被视为简单数据类型,这些类型由低级到高级分别为
(byte,short,char)--int--long--float--double
简单数据类型之间的转换又可以分为:
●低级到高级的自动类型转换
●高级到低级的强制类型转换
●包装类过渡类型能够转换
2.1自动类型转换
低级变量可以直接转换为高级变量,笔者称之为自动类型转换,例如,下面的语句可以在Java中直接通过:
byte b;
int i=b;
long l=b;
float f=b;
double d=b;
如果低级类......
漫谈Java程序设计中的接口应用(2006-04-15 02:14:00)
摘要:
大多数人认为,接口的意义在于顶替多重继承。众所周知Java没有c++那样多重继承的机制,但是却能够实现多个接口。其实这样做是很牵强的,接口和继承是完全不同的东西,接口没有能力代替多重继承,也没有这个义务。接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,可以更好的管理他们。Java的精髓,我认为,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
设计模式中最基础的是工厂模式(Factory),在我最近的一个很简单的应用中,我想尽量的让我的程序能够在多个数据库间移植,当然,这涉及很多问题,单是如何兼容不同DBMS的SQL就让人头痛。我们不妨先把问题简单化,只考虑如何连接不同的数据库。
假设我有很多个类,分别是Mysql.java、SQLServer.java、Oracle.java、DB2.java,他们分别连接不同的数据库,统一返回一个Connection对象,并且都有一个close方法,用于关闭连接。只需要针对你的DBMS,选择不同的类,就可以用了,但是我的用户他会使用什么数据库?我不知道,我希望的是尽量少的修改代码,就能满足他的需要。我可以抽象如下接口:
package org.bromon.test;
public interface DB
{
java.sql.Connection openDB(String url,String user,String password);
void close();
}
这个接口只定义两个方法,没有任何有实际意义的代码,具体的代码由实现这个接口的类来给出,比如Mysql.java:
Package org.bromon.test;
import java.sql.*;
public class Mysql implements DB
{
private String url......
抽象类和接口的区别(2006-04-15 02:01:00)
摘要:
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。
理解抽象类
abstract class和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的......
java中的对象序列化(2006-04-15 00:30:00)
摘要:java对象序列化机制一般来讲有两种用途:
1.需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态
2.使用套接字在网络上传送对象的程序来说,是很有用的。
我们通过让类实现java.io.Serializable 接口可以将类序列化。这个接口是一个制造者(marker)接口。也就是说,对于要实现它的类来说,该接口不需要实现任何方法。它主要用来通知Java虚拟机(JVM),需要将一个对象序列化。
对于这个,有几点我们需要明确:
1.并非所有类都可以序列化,在cmd下,我们输入serialver java.net.socket,可以得到socket是否可序列化的信息,实际上socket是不可序列化的。
2.java有很多基础类已经实现了serializable接口,比如string,vector等。但是比如hashtable就没有实现serializable接口。
将对象读出或者写入流的主要类有两个: ObjectOutputStream与ObjectInputStream 。ObjectOutputStream 提供用来将对象写入输出流的writeObject方法, ObjectInputStream提供从输入流中读出对象的readObject方法。使用这些方法的对象必须已经被序列化的。也就是说,必须已经实现Serializable接口。如果你想writeobject一个hashtable对象,那么,会得到一个异常。
下面举个例子:
import java.io.*;
public class testser implements Serializable {
public int ii;
testser()
{
}
......
Java服务器端编程安全必读(2006-04-15 00:29:00)
摘要:一、概述
编写安全的Internet应用并不是一件轻而易举的事情:只要看看各个专业公告板就可以找到连续不断的安全漏洞报告。你如何保证自己的Internet应用不象其他人的应用那样满是漏洞?你如何保证自己的名字不会出现在令人难堪的重大安全事故报道中?
如果你使用Java Servlet、JavaServer Pages(JSP)或者EJB,许多难以解决的问题都已经事先解决。当然,漏洞仍有可能出现。下面我们就来看看这些漏洞是什么,以及为什么Java程序员不必担心部分C和Perl程序员必须面对的问题。
C程序员对安全漏洞应该已经很熟悉,但象OpenBSD之类的工程提供了处理此类问题的安全系统。Java语言处理这类问题的经验要比C少20年,但另一方面,Java作为一种客户端编程语言诞生,客户端对安全的要求比服务器端苛刻得多。它意味着Java的发展有着一个稳固的安全性基础。
Java原先的定位目标是浏览器。然而,浏览器本身所带的Java虚拟机虽然很不错,但却并不完美。Sun的《Chronology of security-related bugs and issues》总结了运行时环境的漏洞发现历史。我们知道,当Java用作服务器端编程语言时,这些漏洞不可能被用作攻击手段。但即使Java作为客户端编程语言,重大安全问题的数量也从1996年的6个(其中3个是相当严重的问题)降低到2000年的1个。不过,这种安全性的相对提高并不意味着Java作为服务器端编程语言已经绝对安全,它只意味着攻击者能够使用的攻击手段越来越受到限制。那么,究竟有哪些地方容易受到攻击,其他编程语言又是如何面对类似问题的呢?
二、缓存溢出
在C程序中,缓存溢出是最常见的安全隐患。缓存溢出在用户输入超过已分配内存空间(专供用户输入使用)时出现。缓存溢出可能成为导致应用被覆盖的关键因素。C程序很容易出现缓存溢出,但Java程序几乎不可能出现缓存溢出。
从输入流读取输入数据的C代码通常如下所示:
char buffer[1000];
int len = read(buffer);
由于缓存的大小在读入数据之前确定,系统要检查为输入保留的缓存是否足够是很困难的。缓存溢出使得用户能够覆盖程序数据结构的关键部分,从而带来了安全上的隐患。有经验的攻击者能够......
如何学好J2ME(2006-04-13 13:28:00)
摘要:
来源: J2ME开发网 作者: mingjava 日期: 2005-6-2 10:17:10
现在工作很忙,最近没有时间写技术文章了。因此今天谈谈自己学习J2ME的一些心得。希望对大家有所帮助。同时欢迎大家谈谈自己的感受!
具备良好的java语言基础,不要还没有学习java语言就拿起一本J2ME的书来看。这样效果并不好,相反如果你有良好的java语言基础的话,J2ME就显得比较容易掌握!
如果你决定开始学习J2ME了,那么首先你应该清楚J2ME的体系结构是什么样的。当你真正清楚了Configuration和Profile的关系、了解了CDC和CLDC的区别后,那么你可以开始编写自己的HelloWorldMIDlet了
选择优秀的开发环境,J2ME的开发环境比较灵活。我推荐使用Eclipse和EclipseME插件。因为Eclipse的插件非常丰富且灵活,当你开发联网应用程序的时候安装Lomboz就可以了。当然你也可以选择Jbuilder等IDE,但是不推荐记事本!
在编写代码之前,应该多读一下好的代码。毕竟MIDlet的写法和一般的java Application不是很一样。推荐WTK中的Demo程序。
MIDP的API doc比较少,每个类的方法也很少。如果有时间的话,每天看个4-5个。这会对你帮助很大。毕竟它的API和J2SE的并不一样,只是它的子集,不应该想当然的使用。
清楚MIDP中高级UI和低级UI类的使用和区别,在你做用户界面的之前,思考好什么符合你的要求,推荐使用高级UI,这样更简单、可移植性更好。但是需要使用Canvas的时候不要犹豫,大胆使用!清楚高级事件和低级事件处理的机制。
在开发应用程序的时候尽量使用MVC模式,这样扩展性出色。
彻底掌握Record Management System,这是MIDP的一个重要子集。实现数据持久性存储不可缺少的系统。善于使用RecordFilter和RecordEnumeration来简化RMS的操作,在我的blog里面有一系列的关于RMS的文章,有时间就看看吧!
重视线程,如果你还不真正清楚线程的时候的话,那么赶快找资料看看吧。在J2ME的开......
吐血总结关于找工作的20条经验!!! (2006-04-09 16:24:00)
摘要:吐血总结关于找工作的20条经验
以下信息,由上海求职客栈www.qzkz.com为你收集整理,希望对你有用!
04年毕业,还没有单干的资本,我分析我自己也不适合单干,一直在打工,也倾向于一辈子打工。我工作快两年了,回顾一下自己的经历,写了点东西。大家也一起来说说经验吧,共同交流一下,互相促进,增长一点本领。
凡是跟帖回复的,写出真实经历的,揭露无良公司假招聘手法的,表扬优秀雇主的,谴责恶劣雇主的,能给版友们启发的,介绍你现在所在的城市的人力资源状况的,……,识字不疯狂同志都向您表达崇高的敬意。下面就是我的文字了。
经验一:光鲜的招聘现场背后不一定代表一个正规友善、蓬勃向上的公司。比如2004年初我经历过一个大型**超市,它很快就倒闭了,招聘现场非常热闹,招聘手法非常有现代感--但是,两个月后,这家公司倒闭了。所以判断一个公司的实力,最好还是上网查一下、到公司问一下,像这个公司的供货商或者合作伙伴打听一下,绝人不能看招聘时的场面或者招聘人员的自我宣传。
经验二:招聘人员的高素质,不代表将来直接和你一起工作的人同样素质高;很多朋友都遇到过这样的问题,好不容易看到了一个知情达理的HR,谈得也很好。去工作了以后,才发现那个公司很乱套,除了那个HR以外的人员都非常差,甚至你会发现那个HR也很差。
经验三:经常招聘的公司,基本都不好地方,多数还有圈套。广为人知的就是**证券、**建材、**保险,别看他们还是上市公司,骗起人来都是一套一套的。在国外店越大越得谨慎,但是目前国内越大的店越具有欺负人的潜质,还没人管,**建材就是典型。
经验四:招聘人员夸夸其谈的、使用煽动性语言的,多数都是陷阱。这样的有很多,一般都是几个穿着西装领带的人在招聘现场唾沫横飞,职位一般都是销售,许诺只要你能干,月薪3000、5000、10000,甚至100000都不在话下。比较出名的还有**保险的"保险,永不失业的朝阳产业",靠,如果是永不失业的朝阳产业,你怎么还每周都到人才市场招人?
经验五:如果你不喜欢现在的专业,决心要通过考研究生改行,那么不必在考研究生之前找工作,考完后也会有工作的,尤其是春节以后。人的精力有限,集中兵力做好一件事情。反正你都想改行......
Java数据库程序中的存储过程设计(2006-04-08 10:34:00)
摘要:本文阐述了怎么使用DBMS存储过程。阐述了使用存储过程的基本的和高级特性,比如返回ResultSet。本文假设你对DBMS和JDBC已经非常熟悉, 也假设你能够毫无障碍地阅读其它语言写成的代码(即不是Java的语言),但是,并不要求你有任何存储过程的编程经历。
存储 过程是指保存在数据库并在数据库端执行的程序。你可以使用特殊的语法在Java类中调用存储过程。在调用时,存储过程的名称及指定的参数 通过JDBC连接发送给DBMS,执行存储过程并通过连接(如果有)返回结果。
使用存储过程拥有和使用基于EJB或CORBA这样的应用 服务器一样的好处。区别是存储过程可以从很多流行的DBMS中免费使用,而应用服务器大都非常昂贵。这并不只是许可证费用的问题。使用应 用服务器所需要花费的管理、编写代码的费用,以及客户程序所增加的复杂性,都可以通过DBMS中的存储过程所整个地替代。
你 可以使用Java,Python,Perl或C编写存储过程,但是通常使用你的DBMS所指定的特定语言。Oracle使用PL/SQL,PostgreSQL使用pl/pgsql, DB2使用Procedural SQL。这些语言都非常相似。在它们之间移植存储过程并不比在Sun的EJB规范不同实现版本之间移植Session Bean困难。并 且,存储过程是为嵌入SQL所设计,这使得它们比Java或C等语言更加友好地方式表达数据库的机制。
因为存储过程运行在DBMS自 身,这可以帮助减少应用程序中的等待时间。不是在Java代码中执行4个或5个SQL语句,而只需要在服务器端执行1个存储过程。网络上的数据 往返次数的减少可以戏剧性地优化性能。
使用存储过程
简单的老的JDBC通过CallableStatement类支持存 储过程的调用。该类实际上是PreparedStatement的一个子类。假设我们有一个poets数据库。数据库中有一个设置诗人逝世年龄的存储过程。 下面是对老酒鬼Dylan Thomas(old soak Dylan Thomas,不指定是否有关典故、文化,请批评指正。译注)进行调用的详细代码:
try
{
int age = 39;......
Java中文处理, 资源包后缀详解 (2006-04-08 10:13:00)
摘要:
作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com
写于:2002/07 最后更新: 02/22/2006 14:42:55
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.chedong.com/tech/hello_unicode.html
关键词:linux java mutlibyte encoding locale i18n i10n chinese ISO-8859-1 GB2312 BIG5 GBK UNICODE
内容摘要:
不知道你有没有这样的感受:为什么PHP很少有乱码问题而用Java做WEB应用却这么麻烦呢?为什么在Google上能用简体中文查到繁体中文,甚至日文的结果?而且用Google的时候发现它居然能自动根据我使用浏览器的语言选择自动调出中文界面?
很多国际化应用的让我理解了这么一个道理:Unicode是为更方便的做国际化应用设计的,而Java核心的字符是基于UNICODE的,这一机制为应用提供了对中文“字”的控制(而不是字节)。但如果不仔细理解其中的规范,这种自由反而会成为累赘,从而导致更多的乱码问题:
关于字符集的一些基本概念;
试验1:显示系统的环境设置和支持的编码方式;
试验2:系统缺省编码方式对Java应用的输入输出影响;
试验3:在WEB应用中输出和输出中的字符集问题;
关于字符集的准备知识:
ISO-8859-1 GB2312 BIG5 GBK GB18030 UNICODE 为什么会有这么多字符集编码方式?
注意:以下说明不是严格定义,一些比喻仅作为方便理解使用。
假设一个字符就是棋盘上的一个棋子,有其固定的坐标,如果需要区别所有的字符,就需要有足够的棋格容纳不同的“字符”。
英文和欧洲其他语言的单字节字符集(SingleByte Charsets):
首先对于ISO-8859系列的字符集都想象成一个:2^8 = 16 * 16 = 256个格子的棋盘,这样所有的西文字符(英文)用这样一个16×16的坐标系就基本可以覆盖全了。而英文实际上只用其中小于128(\x80)的部分就够了。利用大于128部......
让自己学会写的一个在线升级的程序 (2006-04-03 20:55:00)
摘要:void CUpdateDlg::OnButtonDoupdate()
{
// 读取升级文件
CFileStatus rStatus;
CString szIniData;
CString inFile;
CString tmp;
inFile=m_szPath+"\\update.ini";
CFile UpdateFile;
UpdateFile.Open( inFile, CFile::modeRead);
UpdateFile.GetStatus(inFile,rStatus);
UpdateFile.Read(szIniData.GetBuffer(rStatus.m_size),rStatus.m_size);
UpdateFile.Close();
CStringArray arType;
CStringArray arVersion;
for(int i=1;i<=27;i+=2){
AfxExtractSubString(tmp,szIniData,i,'\n');
tmp.TrimRight();
tmp.TrimRight();
arType.Add(tmp);
}
for(int j=2;j<=28;j+=2){
AfxExtractSubString(tmp,szIniData,j,'\n');
tmp.TrimRight();
tmp.TrimRight();
arVersion.Add(tmp);
}
GetDlgItem(IDC_BUTTON_DOUPDATE)->EnableWindow(FALSE);
CProgressCtrl* pBar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS_UPDATE);
pBar->SetPos(5);
m_szEditMessage = "\r\n取得网络升级地址\r......