??xml version="1.0" encoding="utf-8" standalone="yes"?> Class aClass = Class.forName(xxx.xx.xx);
JAVA的确是一Uo(h)E序员陷入两隑֢地的语言, 切的说是思想. 它提供了如此丰富的library,让程序员能够很容易的写出功能强大的程? 同时它也装了如此多的细? 让程序员能够L的写出很拙略的程? 它所代表的object指向思想设计之初是ؓ(f)了把E序员从UL(fng)复杂的编E细节中解放出来,来达到对已有E序的利? 但是在编E?nbsp;实际上又要求E序员了解其实现的细节而避免写出因调用已有library不正引v的performance慢的,耗费pȝ资源多的E序.通常成ؓ(f)一个优U的JAVAE序员需要较长时间的l验U篏,包括从程序的tuning?或从其他有经验的E序员口?才知道一定功能需要怎样实现,在程序中需要避免那些问?但这往往是比较片面的,知其然而不知其所以然.我想大多数程序员都有cM的经?举一个简单的例子,下面有三U对String的篏加操?
?nbsp;String tmp = "a" + "b" + "c";
?nbsp;String tmp = null;
tmp+= "a";
tmp+= "b";
tmp+= "c";
?nbsp;String tmp = null;
StringBuffer buf = new StringBuffer();
buf.append("a");
buf.append("b");
buf.append("c");
tmp = buf.toString();
有些JAVAE序员在L的用q三U方法的MU?无视它们的区??nbsp;些程序员知道W三U方法好一直在用而不知其Z么好,以至于作?nbsp;
l验教条的传授给JAVA新手.真正的答案是什么呢?让我们揭开JAVA String Class和StringBuffer Class的封装面Uq看它的内部实?在JAVA中的String Class是一个不可变c?所有对一个Sting Object的改变都?x)导致一个新的String Object的生?那么对tmp+=a?W号的实现呢?如果你注意一下StringBuffer的Javadoc?x)发?JDK对它的实现是tmp=(new StringBuffer().append(tmp).append("a")).toSting(); q样我们发现②这U方法在隐性生成了一个StringBuffer Object和一个String Object 再乘3是六个object 的资源耗费.(q不包括String Class 和StringBuffer Class内部使用的Char[])而方法③只用了两?也许有些E序员会(x)对这些耗费不以为然,的确也是,不过在一些场景下它会(x)成ؓ(f)perfamence的瓶?再回头看看①q种Ҏ(gu),它会(x)被JAVA~译器编译ؓ(f)tmp=(new StringBuffer().append("a").append("b").append("c")).to String();我们发现做的和③Ҏ(gu)是同L(fng)?
]]>
Object anInstance = aClass.newInstance();
q其中Class.forName("").newInstance()q回的是object
例:(x)
Class Driver{
protected static Driver current;
public static Driver getDriver(){
return current;
}
}
Class MyDriver extends Driver{
static{
Driver.current=new MyDriver();
}
MyDriver(){}
}
用时:
Class.forName("MyDriver");
Driver d=Driver.getDriver();
有的jdbcq接数据库的写法里是Class.forName(xxx.xx.xx);而有一些:(x)Class.forName(xxx.xx.xx).newInstance()Qؓ(f)什么会(x)有这两种写法呢?
在JDBC规范中明要求这个DrivercddDriverManager注册自己Q即M一个JDBC Driver的Drivercȝ代码都必ȝ似如下:(x)
public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}
所以我们在使用JDBC时只需要Class.forName(XXX.XXX);可以了Q在JDBC驱动中,有一块静态代码,也叫静态初始化块,它执行的旉是当class调入到内存中执行(你可以想像成Q当c调用到内存后就执行一个方法)。所以很多h把jdbc driver调入到内存中Q再实例化对象是没有意义的?/p>
是在服务器端起作?当用forward()?Servlet engine传递HTTPh从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文g,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获?参数自动传?但forward ()无法重定向至有frame的jsp文g,可以重定向至有frame的html文g,同时forward()无法在后面带参数传?比如 servlet?name=frank,q样不行,可以E序内通过response.setAttribute("name",name)来传至下一个页?重定向后览器地址栏URL不变.
?servlet文g中重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html; charset=gb2312");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp");
rd.forward(request, response);
}
2.response.sendRedirect()
是在用户的浏览器端工?sendRedirect()可以带参C?比如servlet?name=frank传至下个面,同时它可以重定向至不同的L?且在览器地址栏上?x)出现重定向面的URL.sendRedirect()可以重定向有frame的jsp文g.
?servlet文g中重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html; charset=gb2312");
response.sendRedirect("/index.jsp");
}
有时候,你不希望别h坐n其成Q通过l承你写的类得到他自己所需要的c,怎么办呢Q这个时候你可以在你的class之前加上finalq个修饰府,例如public final class test{……}Q加上了q个修饰W之后,别h在承这个类的话׃(x)~译出错Q提CZq个cM能构建子cR从q我们可以看出,final修饰W和abstract修饰W是不能同时使用的,因ؓ(f)abstractcd以说是专门用来承的Q而finalcd不能用于l承。那么如果是在方法的前面加上final修饰W有什么作用呢Q比如说AcM有个声明为final的方法a(){….}Q那么Bl承A的时候,B׃能覆盖方法a(){….}Q否则编译出错,提示Cannot override the final method from A。此外,如果一个类声明为finalcȝ话,它里面所有的Ҏ(gu)都自动成为finalcd的。自然的Q你肯定?x)问Q如果一个域x为final的时候有什么作用?一个属性声明ؓ(f)final之后Q你不能在对它重新进行赋|否则~译报错QThe final field ×× cannot be assigned。另外,h意,cd明ؓ(f)final的时候,仅仅它的Ҏ(gu)自动变ؓ(f)finalQ而属性则不会(x)?br />
2Q抽象类
抽象cȝ用处是十分大的,特别是对于OOP而言Q关于抽象类Qȝ几点Q?br />
aQ?nbsp; 抽象cM能实例化Q即不能对其用newq算W;
bQ?nbsp; cM如果有一个或多个abstractҎ(gu)Q则该类必须声明为abstractQ?br />
cQ?nbsp; 抽象cM的方法不一定都是abstractҎ(gu)Q它q可以包含一个或者多个具体的Ҏ(gu)Q?br />
dQ?nbsp; 即一个类中不含抽象方法,它也可以声明为抽象类Q?/p>