权重域名

已备案域名,老域名交易,高权重域名购买,百度权重域名出售,权重域名买卖,万网已备案老域名注册查询抢注转让,买老域名,二手老域名,鹰潭网站建设

会话捆绑侦听者

会话捆绑侦听者

会话API提供跟踪对象何时被加入和删除的方式。要收到这些事件通知的对象可以实现HttpSessionBindingListener接口。实现类必须提供两个方法,在两个方法中,均收到一个HttpSessionBindingEvent的实例。事件参数具有检索会话和判断对象捆绑到会话的名字的方法。通过会话捆绑侦听者得到的主要优点是它们可以释放其获得的资源。而不管客户端显式关闭应用或会话超时。这使得此接口对管理数据库连接非常有用。JDBC提供连接池,但许多驱动器还没有实现它。这样的话,一种替换方式是使用一个知道使自己断连的会话驻留的连接。

多线程的应用

多线程的应用

一些多线程特别有用的存在于服务器端环境。其中一个是自动开始的后台进程,并不捆绑到任何特定请求,类似于一个Unix例程或一个Windows 服务。这可以在servlet环境中使用下列技术实现:1、init方法启动一个线程执行所需任务。包括打开一个套接字服务于请求或周期性地读取具有动态修改数据的web页面。2、对命令,管理任务和状态报告严格使用doget方法。通常需要给出可以关闭或重启后台线程的命令。3、在destroy方法中,释放任意使用的资源后关闭线程。

Servlet(JSP)可设计为发布描述器中的load-on-startup,因此servlet引擎一运行它就开始运行,而无需注册用户。因为servlet引擎本身典型情况可作为一个例程或服务运行,因此可以将这样的进程写为Java servlet。多线程另一点有益的用法是处理长时间运行的请求,如复杂的数据分析或其他类似工程的请求。如果一个客户端请求一个事件负载相当重的服务器进程,则客户端和servlet引擎都将等待直到其完成,当然也还有其他情况存在。

基类的初始化

基类的初始化

现在要创建派生类对象已经不是一个类的事情了,它会牵涉到两个类——基类和派生类,因此要搞清楚它究竟是怎么创建的,就优点难度了。从局外人的角度来看,新类具备了和旧类完全相同的接口,并且还有可能会有一些它自己的方法和数据。但继承并不仅仅是拷贝基类的接口。当你创建一个派生类对象的时候,这个对象里面还有一个基类的子对象。这个子对象同基类自己创建的对象没什么两样。这是从外面看来,这个子对象被包裹在派生类的对象里面。

当然,基类子对象的正确初始化也是非常重要的,而且只有一个办法能保证这一点:调用基类的构造函数来进行初始化,因为只有它才掌握怎样才能正确地进行初始化的信息和权限。Java会让派生类的构造函数自动地调用基类的构造函数。构造行为是从基类向外发展的,所以基类会在派生类的构造函数访问它之前先进行初始化。即便你不创建cartoon()的构造函数,编译器也会为你造一个默认的构造函数,然后再由它去调用基类的构造函数。

继承所使用的语法

继承所使用的语法

继承是Java(也是所有OOP语言)不可分割的一部分。实际上当你创建类的时候,你就是在继承,要么是显式地继承别的什么类,要么是隐含地继承了标准Java根类:Object。合成的语法很平淡,但继承就有所不同了。继承的时候,你得先声明“新类和旧类是一样的”。跟平常一样,你得先在程序里写上类的名字,但是在开始定义类之前,你还得加上extends关键词和基类的名字。做完这些之后,新类就会自动获得基类的全部成员和方法。

你可以为每个类都创建一个main(),而且这也是一种值得提倡的编程方法,因为这样一来,测试代码就能都放进类里了。即使程序包括了很多类,它也只会调用你在命令行下给出的那个类的main()方法。于是,当你输入Java detergent的时候,它就会调用detergent.main()。虽然cleanser不是public的,但是你也可以用Java cleanser来调用cleanser.main()。这种往每个类里都放一个main()的做法,能让类的单元测试变得更容易一些。做完测试以后,你也不必移除main(),留下它可以供以后的测试用。

合成与继承的选择

合成与继承的选择

合成与继承都能让你将子对象植入新的类(合成是显式的,继承是隐含的)。也许你向了解一下这两者有什么区别,以及该如何进行选择。一般来说,合成用于新类要使用旧类的功能,而不是其接口的场合。也就是说,把对象嵌进去,用它来实现新类的功能,但是用户看到的是新类的接口,而不是嵌进去的对象的接口。因此,你得在新类里嵌入private的旧类对象。

有时,让用户直接访问新类的各个组成部分也是合乎情理的;这就是说,将成员对象定义成public。成员对象各自都有隐藏实现的机制,因此这么做也是安全的。如果用户知道你用了哪些零件,那么接口对他们来说就变得更简单了。

Final关键词的使用——数据

Final关键词的使用——数据

Java的关键词final的含义会根据上下文略有不同,但是总的来说,它的意思都是“这样东西不允许改动”。你可能会出于两点考虑不想让别人改动:设计和效率。由于这两个原因差别很大,因此很可能会无用final关键词。

很多编程语言都有通知编译器“这是段数据”的手段。常量能用于下列两种情况:1、可以是“编译时的常量”,这样就再也不能改了。2、也可以是运行时初始化的值,这个值你以后就不想再改了。如果是编译时的常量,编译器会把常量放到算式里面:这样编译的时候就能进行计算,因此也就降低了运行时的开销。在Java中这种常量必须是primitive型的,而且要用final关键词表示。这种常量的赋值必须在定义的时候进行。

Final和private的使用

Final和private的使用

Private方法都隐含有final的意思。由于你不能访问private的方法,因此你也不能覆写它。你可以给private方法加一个final修饰符,但是这样做什么意义也没有。这个问题有可能会造成混乱,因为即使你覆写了一个private方法(它隐含有final的意思),看上去它还是可以运行的,而且编译器也不会报错。

只有是基类接口里的东西才能被覆写。也就是说,对象应该可以被上传到基类,然后再调用同一个方法(这一点我们应该很清楚的)。如果方法是private的,那它就不属于基类的接口。它只能算是被类隐藏起来的,正好有着相同的名字的代码。如果你在派生类里创建了同名的public或protected,或package权限的方法,那么它们同基类中可能同名的方法,没有任何联系。你并没有覆写那个方法,你只是创建了一个新的方法。由于private方法是无法访问的,实际上是看不见的,因此这么做除了会影响类的代码结构,其它什么意义都没有。

初始化与类的装载

初始化与类的装载

在较传统的编程语言中,程序启动的时候都是一次装载所有的东西,然后进行初始化,接下来再开始执行。这些语言必须仔细的控制初始化的过程,这样static数据的初始化才不至于会产生问题。就拿C++为例子,如果一个static数据要依赖另一个static的数据,而它又没有初始化的话,问题就来了。

Java采用了一中新的装载模式,因此没有这种问题。Java的所有东西都是对象,因此很多事情就都变得简单了,这就是一例。编译之后每个类都保存在它自己的文件里。不到需要的时候,这个文件是不会装载的。总之你可以说“类的代码会在它们第一次使用的时候装载”。类的装载通常都发生在第一次创建那个类的对象的时候,但是访问static数据户籍哦static方法的时候也会装载。

Java语言的多态性

Java语言的多态性

多态性是继数据抽象和继承之后的,面向对象的编程语言的第三个基本特性。它提供了另一个层面的接口与实现的分离,也就是说把做什么和怎么做分开来。多态性不但能改善代码的结构,提供其可读性,而且能让你创建可扩展的程序。所谓可扩展是指,程序不仅在项目最初的开发阶段能成长,而且还可以在需要添加新特性的时候成长。

封装通过将数据的特性与行为结合在一起,创建了一种新的数据类型。隐藏实现通过将细节设成private,完成了接口与实现的分离。之所以要采取这种比较呆板的顺序来讲解,是要照顾那些过程语言的程序员们。但是,多态性是站在类的角度来处理这种逻辑上的分离的。我们常看到,继承是怎样允许你将对象当作它自己的,或者它的基类的类型来处理。

方法调用的绑定

方法调用的绑定

将方法的调用连到方法本身被称为绑定。当绑定发生在程序运行之前时(如果有的话,就是由编译器或连接器负责)被称作前绑定。可能你从没听说过这个术语,因为面向过程的语言根本就没有这个概念。C的编译器只允许一中方法调用,那就是前绑定。当编译器只有一个instrument的reference的时候,它是不知道该连到哪个方法的。

解决方案就是后绑定,它的意思是要在程序运行的时候,根据对象的类型来决定该绑定哪个方法。后绑定也被称为动态绑定或运行时绑定。如果语言实现了后绑定,那它就必须要有能在运行时判断对象类型,并且调用其合适的方法的机制。也就是说,编译器还是不知道对象的类型,但是方法的调用机制会找出,并且调用正确的方法。后绑定机制会随语言的不同而不同,但是你可以设想,对象里面必定存有“它属于哪种类型”的信息。