形成一个思想of course须要一定的基础知识 --而且有了一定的基础知识才能对该思想有更深的认识 先不说思想,怎样才能更快地提高我们的基础知识呢? 基础知识如何获得并进一步深化呢? 这里简略谈谈我自己对学java(包括学其它方面知识)的一些愚见。 1 广泛的阅读 对各方面都要有一定的了解,这样才能更准确的把握全局,但不要过份地去追求新的事物,必须要有自己的重点项目。 2 深入的学习(当然是有一定基础的前提下) 对于某一种方法,你得了解它为什么这么做,这样做有什么好处,进而类推能否用到其它的方面,同时应该思考该方法能否得到进一步改善。 3 大量的实践 要大量地用手,不是说你只要点击两个按钮,改两个属性,而是要进行真正的手工,尽量不要让代码自动生成(除非你能倒着背出这段代码),这样才能发现问题(自己不懂的),进而分析解决问题。--这绝对是你掌握精通某一知识的捷径!! 4 反复的测试 进一步发现问题(程序本身的)。找出新的解决方案,提高程序的可读性,可扩展性,可reuse性--当然是在执行效率不明显降低的情况下。 后来我发现其上所述在我们学习过程中存在着一定的规律: 当你以某一领域研究得愈透彻,其靠后的方面(如实践和测试)就显得愈为重要。 另外再给出两句名言: 最重要的不是做什么,而是怎样去做。如果认真去做了,就会发现从这个项目得到的收获远远超过项目本身。 如果没有丰富的实践经验,脱离了一个很扎实的基础,就算是学到了系统分析和系统设计的一个皮毛,那成功的可能性也是很小的。 谈谈系统类java.lang.System的一些特点 java.lang.System 是一个特殊的类,它是Object类的子类,其最主要的特点是使用前不需要用new语句进行初始化,因为在系统启动时,已自动对系统类进行初始化,分配了 相应的内存区。系统类是专门为用户程序而设置的,它为用户程序提供当前环境下的系统资源。 其有一些好用的功能:(in和out,err就不用说了,) getProperty();系统属性的获取 比如:System.getProperty("OS.name");// System.getProperty("Java.version");// 同样还有其它入口参数 user.dir//用户目录 user.name//用户名 path.separator//当前操作系统的路径分隔符 Java.name//java安装目录 File.separator//文件分隔符 同样还有setProperties()啦,setProperties方法用来设置或修改系统的属性。不过,经过用户程序修改的系统属性是暂时性的,如果系统重新启动,系统属性又将是其原始属性了。 比如System.setProperties(p); 上述语句将系统属性按对象p的内容来设置,p是此前已经创建的一个属性对象。 System.currentTimeMillis();获取当前时间,这个功能可用在一些系统管理程序中。 System.exit();几乎每个程序里都有的啦,就是退出系统。 俺就知道这么多,谁知道再补上去啊! 关于线程和进程 线 程是指程序能顺序执行的一个序列。一个线程只有一个入口点,但可能有几个出口点,不过,每个时刻的执行点总是只有一个。线程不是能够独立运行的程序,而只 是某个整体程序内部的一个顺序执行流。所谓多线程,就是通过系统的调度使几个具有不同功能的程序流即线程同时并行地运行。在处理器计算机系统中,实际上是 不可能使多个线程真正并行运行的,而要通过系统用极短的时间,极快的速度对多个线程进行切换,宏观上形成多个线程并发执行的效果。 线程和进程之间的差别 线 程和进程很想象,它们都是程序的一个顺序执行序列,但两者又有区别。进程是一个实体,每个进程有自己独立的状态,并有自己的专用的数据段。创建进程时,必 须建立和复制其专用数据段。同一个程序中的所有线程只有一个数据段,所以,创建线程时不必重新建立和复制数据段。由于数据段建立和复制方面的差异,使线程 的建立和线程的切换速度大大优于进程,另一方面,线程又具备进程的大多数优点。 举个例子: 假设银行系统输存款和取款手续,将帐本看成数据 段。如果用进程这种机制办,那么当储户去存/取款时,银行应先把帐本复制一遍,为储户建立一个独立的帐本再结算。如果按线程机制办,那么,银行里所有的出 纳员都用同一个帐本,储户来办存/取款时,也从这个帐本直接结算。用线程机制省去了数据段复制这一步显然会使线程独具特点。 但是由于多个线程共享一个数据段,所以也出现了数据访问过程的互斥和同步问题,这使系统管理功能变得相对复杂。总的说,一个多线程系统在提高系统的输入/输出速度、有效利用系统资源,改善计算机通信功能以及发挥多独步一时器硬件功能方面显示很大优势。 也谈JVM java 虚拟机(java vistual machine)是一种假想的计算机。从结构上看,它由一组抽象的部件组成,这些部分包括指令集、寄存器组、类文件格式规定、堆栈、内存垃圾收集器、存储 区六个部分。指令集采用独立于平台的字节码形式;寄存器给中包含程序计数器、堆栈指针、运行环境指针和变量指针;类文件也独立于平台;堆栈用来传递参数和 返回运行结果;垃圾收集器收集不再使用的内存片段;存储区则用来存放字节码。JVM仅仅规定了部件的功能和规格,虽然这些功能和规格是统一的,但是并没有 元宝这些部件的具体实现技术,就是说,可以用任何一处技术来实现。在java推出初期,jvm都是通过软件仿真的方法实现的,这种方法目前仍被广泛采用。 但是,现在也有硬件实现的java虚拟机,它们都必须符合和遵从jvm规范,完成相应的功能。 指令集规定了java支持的基本数据类型, 可以是1、2、4、8字节,也包括浮点数,指令集也也规定了指令格式,如规定所有指令都有操作码和操作数组成,操作码为8位。这样,理论上最多可以有 256条指令。JVM只设置了数量很少的寄存器,它们是程序计数器,堆栈栈顶指针,运行环境指针和局部变量指针。这些寄存器全是32们的。这样做可以使得 一只配置少量寄存器的计算机也能建立java运行环境,而使一些配置较多寄存器的计算机通过优化技术则能充分利用资源,提高性能。 从结构上,类文件的内容可以分为四个部分。 第一部分是标志和版本信息,每个类文件都以CAFEBABE开头,这是类文件的标志,接着标明java编译器的版本号。 第二部分称为常数池,常数池的前两个字节指出当前常数池中的表项数,接下来一字节叫标签,它指出常数类型。其实,常数池是一系列常数组成的一个表,这些常数可能是字符串,域名,类名以及代码所引用的常数等。 第三部分是对程序中用到的类的方法的说明。 最后一部分就是由字节码表示的程序主体JVM彩面向堆栈的机制,这为只设置少量寄存器建立了前提。在JVM中,许多指令的操作数来自堆栈,操作结果也放在堆栈中。 确定JVM规范的意义在于为Java提供了跨平台性和安全性。 凡是符合JVM规范的计算机机,便可以作为JVM来运行Java软件。所以符合JVM规范的计算机就可以成是一种Java平台。 Servlet常见错误校验表: ________________________________________________________________ 故障现象 可能的原因 ________________________________________________________________ servlet不能编译 除了通常的java语言错误以外,还有一些跟servlet有关的原因: 1 没有导入javax.servlet.*或javax.servlet.http.*; 2 类没有实现子类servlet或者它的一个子类; 3 servlet.jar没有在类路径中设置 ________________________________________________________________ 没有加载servlet 这可能有多种原因: 1 使用了错误的url(如,没有指定/servlet); 2 大小写错; 3 类没有在servlet引擎的servlet路径中; 4 有关的类没有在servlet引擎的类路径中; 5 servlet在初始化过程中失败 6 servlet引擎没有处于运行状态; 7 web服务器没有处于运行状态 ________________________________________________________________ 空的参数值 查看getParameteter()是否使用了一个带多个值的参数 __________________________________________________________________ 空指针异常 这可能表明这样的失败:在从会话提取值以前创建会话失败 ___________________________________________________________________ 初始参数的错误取值 确认参数名称拼写得是否跟程序中的和servlet属性中的完全一样 (注意大小写) ___________________________________________________________________ 空的初始化参数 init()方法没有调用super.init(config) ___________________________________________________________________ Servlet引擎在关闭时挂起 destroy()方法没有调用super.destroy(); ___________________________________________________________________ 错误的MIME类型 确保在写入到响应流以前是否调用了setContentType(); ___________________________________________________________________ (责任编辑:laiquliu) |