package com.down.servlet;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class DownServlet
*/
public class DownServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DownServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/ ......
递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。
关键要抓住的是:
(1)递归出口
(2)地推逐步向出口逼近
例子:
example: 求5的阶乘。。
如下:
Java代码
public class Test {
static int multiply(int n){
if(n==1||n==0)
return n;
else
return n*multiply(n-1);
}
public static void main(String[] args){
System.out.println(multiply(10)); &n ......
在和谐的网络世界中,有一个神秘的乐园,叫CaoLiu社区(由于和谐,用了拼音),这是一个传说的所在,其入口如海市蜃楼一般不可捉摸,有人说这是为了给世人造成一种神秘感,也有人说,这是为了躲避神兽河蟹的追杀。有幸,我找到了这个入口。但是不幸的是,TMD注册账号还要邀请码。
还好,这个世界上还有好心人,每天会不定时发布4个邀请码,于是,有数不清的人趋之若鹜给自己的电脑换了钛合金F5不停刷新页面等待。只是恶魔果实可不是有毅力就能吃到的,还需要人品。此人每次会把邀请码隐藏两个数字,因此最多需要尝试100次才能得到正确的邀请码。有的人从00开始,有的人从99开始,也有人从中间开始,总之,最后比的还是谁扶老奶奶过街的次数多。
我呢,是一个懒人,没有精力,也没有这份热情,俗话说得好,懒人有懒人的办法。当年Gosling懒得管理内存,于是发明了Java,今天,阿鸟懒得等着试注册码,发明了用JAVA抢Adult社区注册码。
首先,我们需要知道的是何时发布注册码,因此,我们需要监视发布页面,代码如下
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
im ......
class Dog {
public static void bark() {
System.out.print("woof ");
}
}
class Basenji extends Dog {
public static void bark() { }
}
public class Bark {
public static void main(String args[]) {
Dog woofer = new Dog();
Dog nipper = new Basenji();
woofer.bark();
nipper.bark();
}
}
随意地看一看,好像该程序应该只打印一个woof。毕竟,Basenji 扩展自Dog,并且它的bark方法定义为什么也不做。main方法调用了bark方法,第一次是在Dog 类型的woofer上调用,第二次是在Basenji类型的nipper上调用。如果你运行该程序,就会发现它打印的是woof woof。
问题在于bark 是一个静态方法,而对静态方法的调用不存在任何动态的分派机制[JLS 15.12.4.4]。当一个程序调用了一个静态方法时,要被调用的方法都是在编译时刻被选定的,而这种选定是基于修饰符的编译期类型而做出的,修饰符的编译期类型就是我们给出的方法调用表达式中圆点左边部分的名字。在本案中,两个方法调用的修饰符分别是变量woofer和nipper,它们都被声明为Dog类型。因为它们具有相同的编译期类型,所以编译器使得它们调用的是相同的方法:Dog.bark。这也就解释了为什么程序打印出woof ......
Java中的23种设计模式
1、工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
2、建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。
3、工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
4、原始模型模式:通过给出一个原型对象来指明所要创建的对象的类 ......
OOP的特性主要有:1、封装;2、继承;3、多态。下面从这几个方面具体阐述。
1、封装
封装能将类的具体信息隐藏起来,使得数据得到保护。其具体实施主要是依靠访问控制机制权限,其权限主要有四种:1、private;2、default(C++没有这种权限);3、protected;4、public。在这四种权限下的数据在外界的可见性不同。Private只在类的内部可见,其子类亦不可见;default的可见范围扩展到同一个包内;protected在类的内部、同个包、其子类内部可见;public不对外界隐藏。
声明为private的变量为类内部可见,并非对象级别的内部可见,即在类的实例内可以引用同类型的另一实例的private变量。
封装将数据安全的保护起来,外界欲访问数据必须通过类设计的接口,类的设计对于数据的安全和类的功能有重要作用。
2、继承
继承是OPP的另一个大的特点,继承免去了重复开发类似的代码所带来的繁琐,节省了重复开发的开销,但由于现实中各种对象的复杂性和原来开发的类所描述的对象特性可能不够准确、不够全面,继承也面临很多困难。如某个对象的特性可能是某个类所描述的特性的一个子集,若以该类去描述这个对象,这就可能造成内存的浪费。某个对象可能主要由某个类描述但同时又有其它 ......