常见问题二

本文深入讲解Java中的静态方法特性、StringBuilder与StringBuffer的区别、正则表达式的应用等核心技术,并介绍了DOM解析方法及单例模式的使用。

三:静态方法的理解

静态方法是属于类的,内存必须为它分配内存空间,这个空间一直由静态方法占用,内存管理器不会由于静态方法没有被调用而
将静态方法的存储空间收回,这样如果将所有的方法都声明为静态方法,就会占用大量的内存空间,最后是系统变慢。而普通的
成员方法是由对象调用的,内存并不会一直为起分配内存,只有调用的时候才为其分配存储空间,而当其没有被调用时,存储空
间就会被内存管理其收回,释放没有用的空间,提高的系统的运行速率!

静态方法的特征:静态的方法属于类的可以直接使用类名.方法名()调用,

Java中也可以使用类的实例来调用比如:
类名实例名=new 类名()
实例名.方法名();

但在静态方法中不能直接调用实例方法.!!

一个简单静态方法
public static void Get(){
   System.out.println("这是一个静态方法!")
}
实例和静态方法自己多去写几个例子就明白了!
静态方法只能被静态方法调用。

.静态方法只能访问静态成员变量.

非静态方法能访问静态成员变量也能访问非静态成员变量

类名可以直接调用静态成员变量。
静态方法只能调用静态成员变量。
静态方法的产生要先于成员变量的初始化。
应该是静态方法只能调用静态变量

你想想,假如你用静态方法调用非静态变量,当类没有初始化的时候就可以使用静态方法,但是这个时候,非静态变量还未产生呢.
 编译都会报错的

类装载步骤 
   Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、
准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下: 
装载:查找和导入类或接口的二进制数据; 
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 
校验:检查导入类或接口的二进制数据的正确性; 
准备:给类的静态变量分配并初始化存储空间; 
解析:将符号引用转成直接引用; 
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。 
初始化类中属性是静态代码块的常用用途,但只能使用一次。
(简单来讲就是项目加载的时候就执行静态代码块,你想了解更清楚的话就写点代码测试一下)
凡是声明为static的语句(变量,方法,代码块),是在加载类的时候就执行的

 

般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候就已经加载可以用类名直接调用
比如main方法就必须是静态的这是程序入口
两者的区别就是:静态代码块是自动执行的;
静态方法是被调用的时候才执行的.
静态方法
1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法。要实现这样的效果,只需要在类中定义的方法前加上static关键字。例如:
public static int maximum(int n1,int n2)
使用类的静态方法时,注意:

a在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
b 静态方法不能以任何方式引用thissuper关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。
2)静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,例如:
fun()
{
static int i=0;//非法。
}
3)一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
}

 

四:StringBuilder StringBuffer 

1.  在执行速度方面的比较:StringBuilder >  StringBuffer   
2. StringBufferStringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象
   上操作的,不像String一样创建一些对象进行操作,所以速度就快了。
3.  StringBuilder:线程非安全的 ; StringBuffer:线程安全的
    当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证
    StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而
  不用StringBuffer的,就是速度的原因。
对于三者使用的总结:  1.如果要操作少量的数据用 = String
                     2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder
                   3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer

 

五:正则表达式的应用

指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。

因此,典型的调用顺序是

p
后的为正则表达式

String regex="正则表达式"

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher("aaaaab");
while(m.find()){}在仅使用一次正则表达式时,可以方便地通过此类定义 matches方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句


六:获取指定的文件名称


关于绝对路径相对路径 
绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz est.txt 代表了test.txt文件的绝对路径
http://www.sun.com/index.htm也代表了一个URL绝对路径。
相对路径:相对与某个基准目录的路径。包含Web相对路径HTML中的相对目录),
例如:在Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表示。例如:"./" 代表当前目录,"../"代表上级目录。这种类似的表
示,也是属于相对路径。另外关于URIURL,URN等内容,请参考RFC相关文档标准。
RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,(http://www.ietf.org/rfc/rfc2396.txt)2.关于JSP/Servlet中的相对路径和
绝对路径。2.1服务器端的地址服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的
(不同于htmljavascript中的相对地址,他们是由客户端浏览器解析的) 

第一种: 
File f = new File(this.getClass().getResource("/").getPath()); 
System.out.println(f); 
结果: 
C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin 
获取当前类的所在工程路径; 
如果不加“/” 
File f = new File(this.getClass().getResource("").getPath()); 
System.out.println(f); 
结果: 
C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin\com\test 
获取当前类的绝对路径; 

第二种: 
File directory = new File("");//参数为空 
String courseFile = directory.getCanonicalPath() ; 
System.out.println(courseFile); 
结果: 
C:\Documents and Settings\Administrator\workspace\projectName 
获取当前类的所在工程路径; 

第三种: 
URL xmlpath = this.getClass().getClassLoader().getResource("selected.txt"); 
System.out.println(xmlpath); 
结果: 
file:/C:/Documents%20and%20Settings/Administrator/workspace/projectName/bin/selected.txt 
获取当前工程src目录下selected.txt文件的路径 

第四种: 
System.out.println(System.getProperty("user.dir")); 
结果: 
C:\Documents and Settings\Administrator\workspace\projectName 
获取当前工程路径 

第五种: 
System.out.println( System.getProperty("java.class.path")); 
结果: 
C:\Documents and Settings\Administrator\workspace\projectName\bin 
获取当前工程路径

 

 

第七:dom解析

文档根节点:document.documentElement
子节点集合:childNodes
子节点数目:childNodes.length,如 document.documentElement.childNodes.length
节点值:nodeValue
document.documentElement.childNodes[1].nodeValue

判断是否存在子节点:hasChildNodes()...

document.getDocumentElement().getChildNodes().getLength();应该是取这个xml文件中节点的总个数;

getDocumentElement()是获得xml文件的节点;
document.getElementsByTagName("book"),getLength();
是取<book>节点的个数,得到的值当然就是1了。

 

 

1.获取所有节点的集合NodeList nodelist=element.getChildNodes();

2.Node cnode=nodelist.item(i);遍历节点的集合获得每一个节点;

3. cnode.getNodeName()获得节点名字;

4. cnode.getChildNodes()获得子节点;

5. cnode.getNodeValue()获得节点的值

6. NamedNodeMap nameAttrMap = connectors.item(0).getFirstChild().getAttributes();          

    返回的是键值对  map形式存放,可以通过key值取!

 

第八:所谓的开辟缓存;

所谓的开辟缓存,是开辟一个静态的空间,存放数据供后续使用,在方法入口处就将数据准备好存入 

action中将页面的元素信息传入manger中的一个方法,该方法为封装页面的元素的静态方法,这样在该action方法被调用后,

后续的manger中要用到页面元素都可以从封装的静态map中取值!

 

第九:单例的用法

  直接把一个类设计成单例,加入单例的特定模式就可以。其它的方法照常编码!

 

第十:将一个类放入session

 

十二:代码提交的几种样式

1.window.location.href="nmssave.action";


2.$("#userform").attr("action","<%=request.getContextPath()%>/usersave.action?time="+new Date());

     document.getElementById("nmsform").submit();


3. varuserform=document.getElementById("userform");

    userform.action="<%=request.getContextPath()%>/usersave.action?time="+new Date();

    userform.submit();

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值