博文
手把手教您如何编写一个动画Applet实例 (2006-05-09 16:03:00)
摘要:Applet是在浏览器中运行的小程序,Java也是从Applet开始风靡世界的。通过编写这个Applet,我们可以学习到如下知识:
1、Applet及JApplet中的主要接口
2、图像的装载及MediaTracker的使用
3、线程的使用及多个线程直接的通讯
4、Thread.join()方法的使用
5、volatile关键字的使用
动画的主要部分是一个Applet,从codebase中读取一组图片文件,然后每隔1秒轮换显示一张。代码如下:
import javax.swing.JApplet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
public class Animate extends JApplet
{
//图片数量
private static final int NUM_OF_PIC = 4;
int count;
Image pics[];
TimerThread timer;
public void init()
{
count = 1;
pics = new Image[NUM_OF_PIC];
MediaTracker tracker =
new MediaTracker(this);
for(int i = 0; i<NUM_OF_PIC; i++)
{
//将图片按照0,1,...,NUM_OF_PIC -1,
放置在目录中,格式为.jpg
pics[i] = getImage(getCodeBase(),
new Integer(i).toString()+".jpg");
tracker.addImage(pics[i], 0);
}
......
深入理解Java对象实例生成的例子(2006-05-09 16:03:00)
摘要:class A {
public int Avar;
public A() {
System.out.println("AAA");
doSomething();
}
public void doSomething() {
Avar = 1111;
System.out.println("A.doSomething()");
}
}
public class B extends A {
public int Bvar = 2222;
public B() {
System.out.println("BBB");
doSomething();
System.out.println("Avar=" + Avar);
}
public void doSomething() {
System.out.println("Bvar=" + Bvar);
}
public static void main(String[] args) {
new B();
}
}
讲解:
顺序是这样得,首先生成B就得先生成A(没有父,哪来子)
所以调用A的构造器,输出AAA,
然后调用方法dosomething,!!!
注意:A的该方法被B覆盖,
而你生成的是B的对象,
所以它调用B的方法,
由于BVAR目前没有给定值,
所以自动初始化为0,
然后生成B对象,
先初始化变量BVAR,
然后调用构造器输出BBB,
然后调用方法,
这时BVAR已初始化,
所以输出BVAR=2222,
而对象A中变量AVAR由于没有调用对象A的方法dosomething,
所以其值为0,则输出0
全部输出就如下:
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
注意:初始化顺序,当继承时,先生成超类对象,生成对象时,先生成静态变量,然后是一般变量,然后调用构造器!当所以超类对象生成后,生成本对象,顺序一样! 当方法被覆盖时,调用目前对象的......
Java中static用法(2006-05-09 16:02:00)
摘要:
一、static
请先看下面这段程序:
public class Hello{
public static void main(String[] args){ //(1)
System.out.println("Hello,world!"); //(2)
}
}
看过这段程序,对于大多数学过Java 的从来说,都不陌生。即使没有学过Java,而学过其它的高级语言,例如C,那你也应该能看懂这段代码的意思。它只是简单的输出“Hello,world”,一点别的用处都没有,然而,它却展示了static关键字的主要用法。
在1处,我们定义了一个静态的方法名为main,这就意味着告诉Java编译器,我这个方法不需要创建一个此类的对象即可使用。你还记得你是怎么运行这个程序吗?一般,我们都是在命令行下,打入如下的命令:
javac Hello.java
java Hello
Hello,world!
这就是你运行的过程,第一行用来编译Hello.java这个文件,执行完后,如果你查看当前,会发现多了一个Hello.class文件,那就是第一行产生的Java二进制字节码。第二行就是执行一个Java程序的最普遍做法。执行结果如你所料。在2中,你可能会想,为什么要这样才能输出。好,我们来分解一下这条语句。(如果没有安装Java文档,请到Sun的官方网站浏览J2SE API)首先,System是位于java.lang包中的一个核心类,如果你查看它的定义,你会发现有这样一行:public static final PrintStream out;接着再进一步,点击PrintStream这个超链接,在METHOD页面,你会看到大量定义的方法,查找println,会有这样一行:
public void println(String x)。
好了,现在你应该明白为什么我们要那样调用了,out是System的一个静态变量,所以可以直接使用,而out所属的类有一个println方法。
静态方法
......
Java的内存泄漏 出自:ibm:developerworks中国网站 欧(2006-05-05 15:28:00)
摘要:一 问题的提出
Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。
随着越来越多的服务器程序采用Java技术,例如JSP,Servlet, EJB等,服务器程序往往长期运行。另外,在很多嵌入式系统中,内存的总量非常有限。内存泄露问题也就变得十分关键,即使每次运行少量泄漏,长期运行之后,系统也是面临崩溃的危险。
二 Java是如何管理内存
为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。
监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。
为了更好理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。
以下,我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻,我们都有一个有向......
有趣的计算(好帖)(2006-05-01 21:08:00)
摘要:有趣的计算 原作 月儿
如果令A、B、C、D……X、Y、Z这26个英文字母分别等于百分之1、2、3、4……24、25、26这26个数值,那么我们就能得出如下的有趣的结论:
hard work(努力工作)=8+1+18+4+23+15+18+11=98%;
knowledge(知识)=11+14+15+23+12+5+4+7+5=96%;
love(爱情)=12+15+22+5=54%;
luck(好运)=12+21+3+11=47%;
这些我们通常非常看重的东西都不是最完满的,虽然它们非常重要。那么,究竟什么能使生活变得圆满?
是money(金钱)吗?
不!money=13+15+14+5+25=72%;
是leadership(领导能力)吗?
不!leadership=12+5+1+4+5+18+19+8+9+16=97%;
是SEX(性)吗?
更不是!SEX=19+5+24=48%;
那么,什么能使生活变得圆满呢?
是attitude(心态)。
attitude=1+20+20+9+20+21+4+5=100%。
正是我们对待工作、生活的态度能够使我们的生活达到100%的圆满!......
Java高级-Java中finalize()的另类用法(2006-04-30 16:41:00)
摘要:做过JAVA编程的都知道,在JAVA中有一种垃圾收集器的机制,当它运行时(通常在系统内存低到一定限度时自动运行),会回收不再使用的对象所占用的内存,所以,在JAVA程序中,我们通常只考虑创建对象,而从不关心对象的清除。Finalize()是JAVA为类提供的一种特殊方法。垃圾收集器的工作过程大致是这样的:一旦垃圾收集器准备好释放无用对象占用的存储空间,它首先调用那些对象的finalize()方法,然后才真正回收对象的内存。通过使用finalize(),就可以在垃圾收集器运行期间进行一些特殊的工作。下面一例就说明了finalize()的一种巧妙用法。
现在的商业应用系统越来越多的采用WEB形式。在WEB形式应用中,每一次页面访问是独立的,前后不相关联,哪怕多个用户在同一时刻访问应用的同一个页面,用户相互之间也是不知道的。如果想要检查当前有哪些用户正在使用系统(如准备恢复数据备份或进行系统升级时,系统管理员都很希望知道这些信息),该怎么办呢? 基于Servlet、JSP技术的WEB服务器提供了隐含的Session、Application对象,利用它可以帮开发者实现一些信息的持续保存和共享。当用户访问一个WEB应用时,WEB服务器会自动创建一个Session对象,该对象可以供用户在会话期内在应用的所有页面中共享数据; Application是WEB应用的一个全局对象。利用Session、Application对象,可以达到跟踪所有用户信息的目的。
当用户打开浏览器开始请求WEB应用的登录页面时,WEB服务即为该客户创建一个session,此后,在session的timeout时间内,该客户都使用这个session(timeout时间可设置,如Tomcat服务器是在各应用的web.xml文件中设置)。如果使用IE浏览器,Session与客户IP地址、客户程序进程ID所共同标识的连接有对应关系,相同IP地址、相同进程的窗口(如通过IE-文件-新建-窗口 打开的新窗口)具有同一个session,所以session可用于标识各个独立的客户应用连接。
下面是一个样例
为了方便处理,先建一个简单类(user)用来表达用户信息及存放sessionId:
package com;
publ......
煮酒论英雄-漫谈Java数据库存取技术 (2) (2006-04-30 16:40:00)
摘要:下面新生代代表JDO隆重登场,JDO绝对属于超年轻选手, JDO1.0也不过是2002四月份才发布。2003五月份出台1.0.1, 目前最新2.0草案已经发布,http://www.jcp.org/en/jsr/detail?id=243。就为这2.0,江湖上展开的讨论可以说是“血雨腥风”, 两大兵团, JDO兵团和EJB兵团争得是不可开交。有兴趣的不妨到这里瞧瞧,http://theserverside.com/news/thread.tss?thread_id=25695,里面也不乏重量级人物。单从这一点来看,它能对EJB产生这么大的冲击,足以说明了这个初生牛犊确有过人之处。JDO的诞生给java数据持久性带来很多新特性,特别是它弥补了EJB对OO编程的先天不足,JDO提供了完全的OO支持,继承,多态。JDO和 EJB比属于轻量级工具,无需容器支持。不像EJB, 要用你就非得整一个Weblogic, webSphere之类的。
JDO的简单易用是最为人们所称道的,不需要你写大量无用的接口,不需要你继承什么特殊的类,唯一所要做的就是对你的class文件做一下enhance。用了JDO,可以说我们的java程序这下真正OO了,我们无需再理会数据库里面有啥表格了,存取都是以java object为对象了,所有数据库表格都是自动生成的。这一点可以说也是一个革命了。在此之前,项目设计阶段,Database Schema设计可以说是个重头戏。而现在用JDO开发,完全不需要数据库设计了。那你的Database Schema呢? 就是你的Class 啊,JDO会根据你的Class自动生成相应的数据库表格。 一个字 , 爽!从数据库可移植性来看,JDO也是优势明显,就我使用过的Kodo 和 Genie来看,几个简单应用程序换数据库时候除了换一个JDBC driver, 换一下数据库URL,无需对程序做任何改动。 这一点对EJB 来说又是处于劣势。从家庭出身来看,JDO也是出生名门,从一开始就处于JCP管理之下。从企业级支持来看,它可以很好的和Session ......
煮酒论英雄-漫谈Java数据库存取技术 (1) (2006-04-30 16:40:00)
摘要:新技术的出现令人目不暇接,似乎每一天都在产生着新名词。不过归根结底IT所要实现的价值不外乎数据收集,然后再以客户希望的形式展示给客户而已。因此数据存取技术也就成了一个永恒的话题。而在Java这个开放的世界里,数据库存取技术是五花八门,种类繁多。我们也来侃侃Java世界里主流的数据库存取技术。
首先列出英雄榜
1. JDBC直接访问数据库
2. EJB entity bean.
3. JDO技术。
4. 第三方O/R工具,如目前大红大紫的Hibernate, 其它如Castor, Toplink.
先说说这个历史最为悠久的JDBC吧。从Java诞生的那天起,这位仁兄就开始登上历史舞台了。Java能有今天这么风光,JDBC可以说是功不可末。一路走来,如今已是JDBC3.0了。在没有JDBC的时候,访问数据库那是八仙过海,各显神通,各家数据库厂商都有自己的一套API, 苦就苦了开发人员了。换了个数据库,那个程序要改是面目全非。JDBC规范的出台,向世界宣告从此有了访问关系数据库的标准通用接口了。JDBC标准获得了几乎所有数据库厂商的支持,好像还真难找到这么一个数据库,它是没有JDBC 支持的。JDBC规范一经发布,获得了空前成功,很快成为java访问数据库的标准。JDBC的成功在于它的规范统一标准的接口,只需要掌握标准的SQL语言就可以访问各种不同的数据库了。这种数据库间的可移植性和Java一直高喊的口号Compile Once, Run everywhere遥相呼应。JDBC今天还是java访问数据库的基石,CMP, JDO, Hibernate 说到底只是更好的封装了JDBC, 提供了更为上层的更为强大的接口而已。然后说说JDBC直接访问数据库的方式来实现java 持久性。
这种方式相对于CMP来说比较简单直接,特别是......
int 和 String 互相转换的多种方法(2006-04-28 10:26:00)
摘要:1 如何将字串 String 转换成整数 int?
A. 有两个方法:
1). int i = Integer.parseInt([String]); 或
i = Integer.parseInt([String],[int radix]);
2). int i = Integer.valueOf(my_str).intValue();
注: 字串转成 Double, Float, Long 的方法大同小异.
2 如何将整数 int 转换成字串 String ?
A. 有叁种方法:
1.) String s = String.valueOf(i);
2.) String s = Integer.toString(i);
3.) String s = "" + i;
注: Double, Float, Long 转成字串的方法大同小异. ......
[巨搞笑]无极三宝-吉祥三宝?(2006-04-24 09:09:00)
摘要:
旁白:各位听众朋友们大家好,下面请大家欣赏歌曲《无极三宝》
作词:你告我我咋办 演唱者:胡哥哥、胡侵权、葫芦娃,
请大家欣赏!
(数来宝)这年头啊,啥子怪事全都有啊,
一部烂片吹大牛啊,
娘娘腔啊,风筝人啊,搞了半天心理变态抢馒头。
大家统统看不懂啊,
导演还要告观众。
吃饱了撑的~~
女儿:爸爸?
爸爸:哎!
女儿:全国人民看了无极说啥?
爸爸:被骗啦!
女儿:被骗的人心里能好受吗?
爸爸:堵啊!
女儿:可他为啥还要四处吹呀?
爸爸:丢人啊。
一起:所以大家一起上网使~劲~儿~地~骂!
女儿:妈妈?
妈妈:哎!
女儿:全国人民看了馒头说啥?
妈妈;真解气啊!
女儿:凯歌看了还能坐得住吗?
妈妈:早就疯啦!
女儿:听说凯歌去把胡哥告啦?
女儿:他会长大的。
一起:换作是咱咱就回家种~田~去~啦!
爸妈:宝贝!
女儿:啊?
爸妈:德艺双馨这词你听过吗?
女儿:说胡戈吧!
爸妈:片子很烂而且人品更差!
女儿:是凯歌吧!
爸妈:小朋友们千万不要学他。
女儿:宁死不屈。
一起:他的电影大家再也别~去~看~啦!
(间奏)
满神:无极不是得不得奥斯卡的问题,(啊)是的几个的问题!
凯歌:片子就是我的儿子,谁敢说我儿子长得丑,我就跟谁拼了!拼了!拼了……
女儿:爸爸?
爸爸:哎!
女儿:拍出烂片无极很可耻吗?
爸爸:超常发挥了!
女儿:四处招摇招摇撞骗就不对啦!
爸爸:相~当不好!
女儿:听说他们夫妻还很凶吗?
爸爸:见谁咬谁。
一起:一把年纪人品咋就这~么~差~nia!(狗叫声,啊~~)
女儿:妈妈?
妈妈:哎!
女儿:电影荒唐别人不能说吗?
妈妈:言论自由啊。
女儿:为啥有人横竖不乐意呢?
妈妈:这叫掩耳盗铃。
女儿:这么丢脸今后还能混吗?
妈妈:恶有恶报。
一......