下载了一个博客的源码来研究,
里面有几句竟看不懂,好受打击啊!别的都不用看,就看最后几行
public class IndexServlet extends HttpServlet {
private static MasterBean masterBean; protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
ArticleDao articleDao = new ArticleDao();
ArticleTypeDao artTypeDao = new ArticleTypeDao();
PhotoDao photoDao = new PhotoDao();
WordDao wordDao = new WordDao();
FriendDao friendDao = new FriendDao(); /** ******** 获取在主页面的内容显示区中显示的内容 ******** */
// 从tb_article数据表中获取前3篇文章
List articleList = articleDao.queryArticle(-1, null);
request.setAttribute("articleList", articleList);
// 从tb_photo数据表中获取前8张照片
List photoList = photoDao.queryPhoto("sub");
request.setAttribute("photoList", photoList); /** ******** 获取在页面侧栏中显示的内容 ******** */
/* 从tb_word数据表中获取前5条留言 */
List wordList = wordDao.queryWord("sub");
session.setAttribute("wordList", wordList);
/* 从tb_article数据表中获取前5章推荐文章 */
List artTJList = articleDao.queryArticle(4, "sub");
session.setAttribute("artTJList", artTJList);
/* 从tb_friend数据表中获取前5位好友信息 */
List friendList = friendDao.queryFriend("sub");
session.setAttribute("friendList", friendList); /** ******** 获取文章类别 ****************** */
/* 从tb_articleType数据表中获取文章类别 */
List artTypeList = artTypeDao.queryTypeList();
session.setAttribute("artTypeList", artTypeList); /** ********* 保存博主信息 **************** */
session.setAttribute("master", masterBean); RequestDispatcher rd = request
.getRequestDispatcher("/front/FrontIndex.jsp");
rd.forward(request, response);
} static {
LogonDao logonDao = new LogonDao();
masterBean = logonDao.getMaster();
}
}
static {
LogonDao logonDao = new LogonDao();
masterBean = logonDao.getMaster();
}
是什么意思?

解决方案 »

  1.   

    静态代码块
    相当于当前类class对象构造方法
    主要用来初始化静态成员
      

  2.   

    楼主可自己写个类,写一个static{}静态代码块,然后写个构造方法,在静态代码块和构造方法中写上控制台输出。最后写个测试类,看看其效果,就知道静态代码块的用法。当然没有方法签名和返回值这是语法规定,也是因为它根本不是我们调用,只是jvm调用,所以存在方法签名、参数列表和返回值是无意义的。
    /**
     * 测试静态代码块
     * @author dinghun8leech
     */
    public class TestStatic {
    public static void main(String [] args) {
    System.out.println("测试开始,由于当前没用到TestClass,所以类加载器并未加载TestClass");
    TestClass.call();
    /*
    走到这里会发现使用到这个类的静态方法,因此类加载器需要加载此类,
    而静态代码块中的打印方法在静态方法被调用前就调用了,显示出静态代码块
    是被类加载器加载时,就会调用
    */
    new TestClass();
    /*
    使用构造方法初始化一个TestClass实例,但先前TestClass已经被
    加载至jvm中,所以静态代码块不会再执行,除非jvm关闭再次启动

    ->也就是,静态代码块只会在这个类被加载到内存时执行一遍,后面不再执行

    !!所以,依此特性可知静态代码块的作用:即,某些重头至尾仅需执行
    一遍的操作,可以考虑放置在静态代码块中,比如jdbc中将驱动加载至
    内存中这一步:Class.forName("com.mysql.jdbc.Driver");

    */
    System.out.println("测试结束,其实这步是多余的,- -!");
    /*
    打印结果:
    测试开始,由于当前没用到TestClass,所以类加载器并未加载TestClass
    静态代码块被执行
    静态方法被调用
    构造方法被调用
    测试结束,其实这步是多余的,- -!
    */
    }
    }
    class TestClass {
    static {
    System.out.println("静态代码块被执行");
    }
    public TestClass() {
    System.out.println("构造方法被调用");
    }
    public static void call() {
    System.out.println("静态方法被调用");
    }
    }