java中static块执行的时间
先放一个引用:http://www.javaeye.com/topic/11003
引用
一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化;而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。所以,static块的绝对不是什么“只是在类被第一次实体化的时候才会被仅仅调用一次”,而应该是在类被初始化的时候,仅仅调用一次。
有上面的引用可知,static块在类加载的时候执行,但是什么时候类加载? 首先明确不是在类加载的时候执行,可以像写jdbc的时候:
Class.forName(“com.mysql.jdbc.Driver”);
这样就会加载并初始化程序,但不实例化,具体可以参考:
http://tech.it168.com/j/d/2007-01-09/200701091303176.shtml
jdbc只需加载并初始化,无需实例化。
在javaApi中有:
newInstance 实例化
可见初始化可以在Class.forName(第二个参数为true)的时候进行,或者在第一次实例化的时候,如果没有初始化先初始化。
–EOF–
java中try catch finally的执行顺序
直接贴代码
package com.wasw100.test;
public class CatchTest {
public static void main(String[] args) {
System.out.println(test());
}
public static String test() {
int i = 0;
TestData td = new TestData();
try {
i=1;
td.setS("1");
System.out.println("try块执行 \ti:"+i+" s:"+td.getS());
Integer.parseInt("a");
return "正常返回\ti:"+i+" s:"+td.getS();
} catch (Exception e) {
i=2;
td.setS("2");
System.out.println("catch块执行\ti:"+i+" s:"+td.getS());
return "catch块返回\ti:"+i+" s:"+td.getS();
} finally {
i=3;
td.setS("3");
System.out.println("finally块执行\ti:"+i+" s:"+td.getS());
// return "finally块返回";
}
}
}
class TestData{
private String s;
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
}
执行结果:
try块执行 i:1 s:1
catch块执行 i:2 s:2
finally块执行 i:3 s:3
catch块返回 i:2 s:2
执行顺序很好理解,但是返回的i、s的值为什么是2,不是3?
一个很不错的解释:http://www.javaeye.com/topic/79092?page=2#284368
总结:
try或者catch执行后,如果有return语句,那么先把返回值copy到栈顶,例如上面的例子会把 “catch块返回\ti:”+i+” s:”+td.getS() 得到的字符串的引用copy到栈顶,也就是说return已经执行,但是还没返回(在MyEclipse的debug模式下可以看的很清楚) 然后执行finally,执行完finally,再把栈顶的值返回。如果返回的是一个对象的引用的话,那么将是finally执行后的值
因为字符串是一个在java中有特殊的对待,所以和普通对象有所不同,字符串是放到字符串常量池的,而换成一个普通对象作为返回值就能够看出来了。
java中的字符串可以看http://b0r0j0.blogbus.com/logs/8213193.html
–EOF–
TortoiseSVN的安装和简单使用
下载安装TortoiseSVN:http://cdnetworks-kr-2.dl.sourceforge.net/project/tortoisesvn/Application/1.6.5/TortoiseSVN-1.6.5.16974-win32-svn-1.6.5.msi
1.下载项目
新建一个目录,进入目录,在空白处右击,点击SVN Checkout…
第一个文本框(URL of repository)填写svn的地址,其余默认,如果还没有用户,首先就是输入用户名密码
2.清除原来的用户
想修改用户,首先就是清除原来的用户
右击空白处-》 TortoiseSVN-》settings
选择左侧的saved data, 点右侧界面Authentication data的clear按钮
新用户的创建将按第一个步骤就可以了
3.update,commit
都很简单了,都在对应的目录下点击右键就可以了
4.上传工程
右击工程->import
相关文章: 用MyEclipse和googlecode的svn控制自己的代码
–EOF–
mysql更改引擎 (InnoDB,MyISAM)
mysql默认的数据库引擎是MyISAM,不支持事务和外键,也可使用支持事务和外键的InnoDB。
查看当前数据库的所支持的数据库引擎以及默认数据库引擎
show engines;
更改方式1:修改配置文件my.ini
我将my-small.ini另存为my.ini,在[mysqld]最后添加为上default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB
更改方式2:在建表的时候指定或者建完表修改
--建表的时候指定 create table mytbl( id int primary key, name varchar(50) )type=MyISAM; --建完表后修改 alter table mytbl2 type = InnoDB; --查看修改结果(mytest为表所在的database名字) show table status from mytest;
相关文章:绿色版MySQL的安装和使用
参考文章:Mysql支持事务的InnoDB
–EOF–
hsqldb时间使用总结
官方文档:http://hsqldb.org/doc/guide/guide.html
可以查看有关时间的函数(可以搜索datediff,马上就可以转到时间函数那块)
hsqldb中时间可以使用now、CURRENT_TIMESTAMP这样的函数表示,也可以使用字符串,类似'yyyy-MM-dd','yyyy-MM-dd HH:mm:ss.SSS'这样的字符串
例如建一张表,插入一条数据
create table user( id INTEGER primary key, birthday DATETIME default 'now' );
插入时间插入可以使用默认值now(无需填写)、或者sql语句中使用函数now(),curdate()之类的 、或者使用'yyyy-MM-dd','yyyy-MM-dd HH:mm:ss.SSS'这样的字符串。
insert into user(id) values(1); insert into user values(2,now()); insert into user values(3,'2009-12-20'); insert into user values(4,'2009-12-20 20:01:02'); insert into user values(5,'2009-12-20 20:01:02.123');
结果:
1 2009-12-20 23:17:06.211 2 2009-12-20 23:17:06.211 3 2009-12-20 00:00:00.0 4 2009-12-20 20:01:02.0 5 2009-12-20 20:01:02.123
当你向hsqldb中插入某个时间,就可以结合DateFormat、Calendar等类组合出字符串了
–EOF–
用Swing显示时间比实际的晚8小时解决方法
参考文章:http://blog.csdn.net/subchen/archive/2008/04/18/2303402.aspx
在main中调用:
System.setProperty(“user. timezone”, “GMT+8″);
不起作用
改为
TimeZone.setDefault(TimeZone.getTimeZone("ETC/GMT-8"));
时间显示正确
–EOF–
PL SQL Developer和精简版Oracle客户端安装
用自己的xp连接远程的oracke10g,单独安装个oracle太浪费了。
安装了精简版oracle居然成功了。
步骤:
1.下载oracle精简版:
From: http://x.gd2.xdowns.com:8080/088/oracle9i310.rar
To: C:\Documents and Settings\Administrator\桌面\oracle9i310.rar
Size: 12.2 MB (12,710,213 bytes)
Transferred: 12.2 MB (12,710,213 bytes)
安装后也只有33.4M
2 .安装(D:\Oracle)
3.配置,下面是一个配置文件的参考
打开D:\Oracle\ora90\network\ADMIN下的tnsnames.ora
ORCL_192.168.0.19 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.19)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcl)
(SERVER = DEDICATED)
)
)
可能出现的问题:
无法连接远程服务器 报无法处理服务名 的提示
解决方法:
在Path环境变量中找到D:\Oracle\ora90\BIN\; 把位置放在前面,使用sql plus连接ORCL_192.168.0.19成功
在pl sql developer中也能成功
–EOF–
用java判断数据库某个表是否存在
ResultSet rs = conn.getMetaData().getTables(null, null, "carpark".toUpperCase(), null);
while(rs.next()){
System.out.println(rs.getObject(3).toString());
}
主要就是用到getTable方法
前两个参数没研究,直接用null就可以,感兴趣的可以去查查api
第三个参数是表名:null 和“%”都表示所有的表,其中是区分大小写的,必须是大写才可以
第四个参数:types – 要包括的表类型所组成的列表,必须取自从 getTableTypes() 返回的表类型列表;null 表示返回所有类
例如:new String[]{“TABLE”,”VIEW”}
只有在hsqldb中测试通过,其他数据库没有测试
–EOF–