`
文章列表
  RT。不信自己去试。
  如有下列代码: public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { doGet(req, resp); } 则称doPost() delegates to doGet()。delegate可以简单理解为give power to。  
  有的文章上说只用CATALINA_HOME这么一个,也有的说是CATALINA_HOME、CATALINA_BASE、TOMCAT_HOME这3个,我翻Tomcat Document也没找着具体的说明,不过CATALINA_HOME好像是必须的,还有地方提到了CATALINA_BASE,既然这样的话,那就三个都设置好了。 CATALINA_HOME = x:\apache-tomcat-yyy CATALINA_BASE = x:\apache-tomcat-yyy TOMCAT_HOME = x:\apache-tomcat-yyy   注意:如果环境变量的内容只有一项的话,就 ...
  本文对[#0x0001]、[#0x0008]、[#0x000B]做统一归纳。     一个类在能够被程序使用之前,必须经历三个准备工作(以下统称为类的执行):   -> 1. loading   -> 2. linking       --> 2.1 verification       --> 2.2 preparation       --> 2.3 resolution (optional)   -> 3. inintialization     在[#0x0008]、[#0x000B]中,我们使用的loading (加载),其实 ...
  在其所在的块内(即{}之内,如方法body、if {...}等)(只是单纯的一对{}不能称为块),throw语句可以屏蔽其后的语句(即在块内,该throw语句后面不能再写其他语句),但在块之外,还是可以写其他的语句的。如: public class ExceptionTest { private static void func() throws Exception { throw new Exception(); //System.out.println("Threw Exception"); //error } private st ...
  当有继承发生时,会伴随着重载、覆写(包括接口方法的实现)、构造器的重写等行为。此时,如果基类或是接口的方法存在异常声明,那么导出类或是接口的实现类的对应方法该如何声明异常?同时对这些方法的调用该如何捕捉异常?下面就这2个问题进行探讨,你会看到,针对覆写和构造器的重写是2种完全不同的处理方式(针对重载则没有任何限制)。代码如下: //@file Example1.java class ExtException extends Exception {} class AnotherException extends Exception {} class Base { publ ...
  finally总是会被执行,即使try中有break、continue、return这样的语句,如: public class FinallyTest { public static void main(String[] args) { int i; for (i = 0; ;i++) { try { if (i == 0) continue; else if (i == 1) break; } finally { System.out.println(&qu ...

[#0x001D] first catch

    博客分类:
  • Java
  try块里有异常抛出时,程序会进入第一个异常类型匹配的catch块执行,其他的catch块不执行。   注意这里说的“第一个匹配的异常类型”。我们知道,所有的异常类型都是extends Exception,所以catch (Exception e)可以catch所有的异常;也就是说,这里说的“异常类型匹配”包括向上转型。   同时,对基类异常的catch块会屏蔽其后的对其导出类异常的catch块,而且这个屏蔽只与catch块代码的位置有关系,如: class MyException extends Exception { } public class ExceptionTe ...
  Iterable是一个接口,它只有一个方法iterator(),要求返回一个Iterator。 package java.lang; public interface Iterable<T> { Iterator<T> iterator(); }     而Iterator本身也是个接口,它有hasNext()、next()、remove三个方法。 package java.util; public interface Iterator<T> { boolean hasNext(); T next(); void ...
  Arrays和Collections包含的都是static方法,可以将其视为工具类。Arrays.asList()这个方法有点特殊,这里记录一下。   首先,Arrays.asList()返回的是一个List (List是一个接口,返回List实际是返回List接口的一个实现),这个List在底层是有数组实现的,所以size是fixed的。所以,下面的代码是不可以的: List<Integer> list = Arrays.asList(1, 2, 3); list.add(4); //error     其次,如果不指定返回List的类型(即<>部分)的话 ...
  前面对继承的理解常常用到了这么一用表述:Base的代码会被复制到Ext中。其实这么理解欠妥,看代码: class Base { private String inf = "Here is Base"; public String getInf() { return inf; } } class Ext extends Base { public static void main(String[] args) { Ext e = new Ext(); System.out.println(e.getInf()); } }   很明显,B ...
  首先我们要搞清楚关于closure这个单词的逻辑关系。如果说内部类是一个closure,那么外部类就是enclosing class,because OuterClass encloses InnerClass。     如果一个一般类来继承内部类,需要在构造器中使用特殊的语法。 class Outer { class Inner {} } public class ExtInner extends Outer.Inner { public ExtInner(Outer o) { o.super(); } }   ExtInner的构造器必须要有一个Outer参数,然后调用.s ...

[#0x0016] 代理

    博客分类:
  • Java
  前文多次提到了代理(Proxy),那么到底什么才是代理呢?   类和类之间有3种关系:组合、继承和代理。   组合即是一个类包含另一个类的对象作为自己的一个field,如: class A { class B b = new B() ; ...... }      继承就不多说了。如果把接口看作abstract class的延伸的话,那么对接口的实现也可以看作继承。     代理是组合的一种特殊形式。假设我们有上文的class A的对象a,如果要用class B提供的接口时,一般是a.b.function()或是a.b.field。如果我们这里不想暴露class B ...
  一般的内部类是不能有static (data/field/function)的,因为普通的内部类必须创建对象,不需要有static只属于内部类本身,所以static对普通内部类来说是没有意义也是不允许的。同样,嵌套类也是static,所以一般的内部类中也不能有嵌套类。   嵌套类可以有static,由于嵌套类对象的创建不需要外部类对象,所以嵌套类是无法通过Outer.this来连接到外部类对象的。所以根据[0x0012]中关于内部类访问访问外部类field和function的说明,在嵌套类中要访问外部类的field和function应该避免重名的现象发生。   static内部类表示这个 ...
  内部类的一个重要作用是隐藏继承或是对接口的实现,典型的形式是:内部类来继承或是实现接口,由外部类提供代理constructor方法。这些代理constructor方法一般都利用的向上转型,即不返回内部类对象,而是返回内部类继承的父类对象或是实现的接口对象。如: interface Intf {...} class Outer { class Inner implements Intf {...} public Intf createInner { return new Inner(); } } 而匿名内部类实际是对上述代码的简化,如: interfa ...
Global site tag (gtag.js) - Google Analytics