![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 59
iteye_1299
这个作者很懒,什么都没留下…
展开
-
[#0x0001] initializer
A block-formed initializer can be appended after the fields declared. If the fields are static, the initializer can also be static too, which means it's only executed once. If the initializer is n...2009-03-17 02:29:52 · 78 阅读 · 0 评论 -
[#0x0016] 代理
前文多次提到了代理(Proxy),那么到底什么才是代理呢? 类和类之间有3种关系:组合、继承和代理。 组合即是一个类包含另一个类的对象作为自己的一个field,如:class A{ class B b = new B() ; ......} 继承就不多说了。如果把接口看作abstract class的延伸的话,那么对接口的实现也可以看作继承。 ...原创 2009-04-07 16:50:46 · 56 阅读 · 0 评论 -
[#0x0018] 对内部类的继承
首先我们要搞清楚关于closure这个单词的逻辑关系。如果说内部类是一个closure,那么外部类就是enclosing class,because OuterClass encloses InnerClass。 如果一个一般类来继承内部类,需要在构造器中使用特殊的语法。class Outer{ class Inner {}}public class ExtInner ex...原创 2009-04-07 20:39:23 · 83 阅读 · 0 评论 -
[#0x0019] 关于继承的新认识:导出类调用基类方法其实是向上转型
前面对继承的理解常常用到了这么一用表述:Base的代码会被复制到Ext中。其实这么理解欠妥,看代码:class Base{ private String inf = "Here is Base"; public String getInf() { return inf; }}class Ext extends Base{ public static void ma...原创 2009-04-07 23:04:45 · 85 阅读 · 0 评论 -
[#0x002A] a simple delegation example
如有下列代码:public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException{ doGet(req, resp);}则称doPost() delegates to doGet()。delegate可以简单理解为give powe...原创 2009-10-31 02:49:07 · 109 阅读 · 0 评论 -
[#0x0029] 当接口方法有声明throws Exception时,实现方法可以选择不throws
RT。不信自己去试。原创 2009-10-31 10:28:32 · 381 阅读 · 0 评论 -
[#0x004A] Java多线程:Runnable接口 v.s. Thread类
public class Runner implements Runnable { @Override public void run() { for(int i = 0; i < 100; i++) { System.out.println("Runner runs to --> " + i); } }} public class Mult...原创 2010-10-04 18:39:17 · 121 阅读 · 0 评论 -
[#0x004B] Java多线程:终止线程的方法
虽说Thread类提供了stop()和suspend()方法,但这两种方法过于粗暴,如果线程占用了一些资源(如打开了一个文件,建立了一个数据库连接什么的),直接stop()或是suspend()是会产生问题的。 要终止Thread,最好的方法就是让run()方法正常运行完毕,不过有的run()方法里面直接是一个while (true),这时就要使用一些特殊的手段。 1. 使...原创 2010-10-04 21:09:01 · 88 阅读 · 0 评论 -
[#0x004C] Java多线程:synchronized
首先明确一点,同步方法本质上也是一个同步控制块(仅针对于锁定this的情况,如果同步控制块锁定的不是this,那么它是不能直接改写为同步方法的),区别在于同步方法的粒度是整个方法,而同步控制块的粒度可以是方法的一部分。// 同步方法示例public class Counter { int count; static int classCount; public syn...原创 2010-10-05 19:54:35 · 106 阅读 · 0 评论 -
[#0x0037] clover测试servlet
使用clover-for-eclipse,发现测试一个简单的Dynamic Web Project时,servlet总是显示不出来,提示找不到类com_cenqua_clover/CoverageRecorder。 解决办法是下载一个clover-for-ant,把lib里的clover.jar放到项目的lib下即可。...2010-02-23 15:14:10 · 75 阅读 · 0 评论 -
[#0x001B] Arrays.asList()
Arrays和Collections包含的都是static方法,可以将其视为工具类。Arrays.asList()这个方法有点特殊,这里记录一下。 首先,Arrays.asList()返回的是一个List (List是一个接口,返回List实际是返回List接口的一个实现),这个List在底层是有数组实现的,所以size是fixed的。所以,下面的代码是不可以的:List<In...原创 2009-07-28 18:02:15 · 72 阅读 · 0 评论 -
[#0x001C] foreach与Iterable
Iterable是一个接口,它只有一个方法iterator(),要求返回一个Iterator。package java.lang;public interface Iterable<T>{ Iterator<T> iterator();} 而Iterator本身也是个接口,它有hasNext()、next()、remove三个方法。...原创 2009-07-30 15:30:35 · 110 阅读 · 0 评论 -
[#0x001D] first catch
try块里有异常抛出时,程序会进入第一个异常类型匹配的catch块执行,其他的catch块不执行。 注意这里说的“第一个匹配的异常类型”。我们知道,所有的异常类型都是extends Exception,所以catch (Exception e)可以catch所有的异常;也就是说,这里说的“异常类型匹配”包括向上转型。 同时,对基类异常的catch块会屏蔽其后的对其导出类异常的cat...原创 2009-07-31 11:27:25 · 126 阅读 · 0 评论 -
[#0x001F] finally总是会被执行
finally总是会被执行,即使try中有break、continue、return这样的语句,如:public class FinallyTest{ public static void main(String[] args) { int i; for (i = 0; ;i++) { try { if (i == 0) ...原创 2009-08-03 11:03:50 · 143 阅读 · 0 评论 -
[#0x0020] 涉及继承的异常声明及捕捉
当有继承发生时,会伴随着重载、覆写(包括接口方法的实现)、构造器的重写等行为。此时,如果基类或是接口的方法存在异常声明,那么导出类或是接口的实现类的对应方法该如何声明异常?同时对这些方法的调用该如何捕捉异常?下面就这2个问题进行探讨,你会看到,针对覆写和构造器的重写是2种完全不同的处理方式(针对重载则没有任何限制)。代码如下://@file Example1.javaclass E...原创 2009-08-04 09:53:24 · 140 阅读 · 0 评论 -
[#0x0021] throw的屏蔽作用
在其所在的块内(即{}之内,如方法body、if {...}等)(只是单纯的一对{}不能称为块),throw语句可以屏蔽其后的语句(即在块内,该throw语句后面不能再写其他语句),但在块之外,还是可以写其他的语句的。如:public class ExceptionTest{ private static void func() throws Exception { th...原创 2009-08-04 16:28:17 · 126 阅读 · 0 评论 -
[#0x0023] class loading: further discussion involving steps of instance creation
本文对[#0x0001]、[#0x0008]、[#0x000B]做统一归纳。 一个类在能够被程序使用之前,必须经历三个准备工作(以下统称为类的执行): -> 1. loading -> 2. linking --> 2.1 verification --> 2.2 preparation --> 2...原创 2009-09-04 15:23:46 · 76 阅读 · 0 评论 -
[#0x003B] UML类图之关联、聚合、组合、依赖
一直没有搞清楚这几个概念,这里做总结。来自《大话设计模式》。 1. 关联(association) 仅仅表示对象A“知道”对象B,对象A并不“拥有”对象B(这里的“知道”和“拥有”并不一定是从业务逻辑上判断,应该宽泛到从常识上判断)。如下图: 企鹅“知道”气候,但并不“拥有”气候,在代码上反映为:class Penguin extends Bird { p...2010-05-05 01:10:45 · 144 阅读 · 0 评论 -
[#0x0015] static内部类(i.e. 嵌套类)
一般的内部类是不能有static (data/field/function)的,因为普通的内部类必须创建对象,不需要有static只属于内部类本身,所以static对普通内部类来说是没有意义也是不允许的。同样,嵌套类也是static,所以一般的内部类中也不能有嵌套类。 嵌套类可以有static,由于嵌套类对象的创建不需要外部类对象,所以嵌套类是无法通过Outer.this来连接到外部类对...原创 2009-04-05 21:40:50 · 68 阅读 · 0 评论 -
[#0x0014] 匿名内部类:简化形式及自动向上转型
内部类的一个重要作用是隐藏继承或是对接口的实现,典型的形式是:内部类来继承或是实现接口,由外部类提供代理constructor方法。这些代理constructor方法一般都利用的向上转型,即不返回内部类对象,而是返回内部类继承的父类对象或是实现的接口对象。如:interface Intf {...}class Outer{ class Inner implements In...原创 2009-04-05 19:04:53 · 253 阅读 · 0 评论 -
[#0x0013] 局部内部类
如果把{}中的代码段称为“域”,那么方法body明显是一个域,方法body中的if {}或是for {}之类的也是域。在方法body或是方法body中其他域里定义的类就是局部内部类。 局部内部类只能在定义它的域中使用。且局部内部类的编译不受域执行与否的影响,即比如在if {}中定义了一个局部内部类,即使这个if不执行,这个局部内部类也照常编译。...原创 2009-04-05 15:45:37 · 67 阅读 · 0 评论 -
[#0x0000] static
1. static member/field/function 每new一个object即相当于申请了一块内存,用来存放这个object的member/field/function。两个object的member/field不尽相同,同时也许因为如此,导致两个object的function不尽相同,从而这两个object要占据两块内存,而且它们之间没有共享member/field/fu...2009-03-18 01:19:01 · 58 阅读 · 0 评论 -
[#0x0002] constructor其实是一个static,且返回void
姑且称包含main方法的类为main class。 在main方法里,若想直接调用main class的其他方法,必须将该方法设为static。换言之,main方法只能直接调用main class的static方法,non-static方法不能直接调用(原因很简单,因为main方法此时没有创建main class对象)。 同理,main方法对main class的field的直接访问也...2009-03-18 01:19:31 · 77 阅读 · 0 评论 -
[#0x0003] array: reference and initialization
1. array reference 可以用这么一种观点审视数组:数组其实是一个特殊的类,我们在声明数组时得到的是数组对象的引用。 例如说:int[] a;//得到的a即是int[]对象的一个引用 此时int[]对象还没有初始化,我们只得到一个引用而已,所以int[]对象的length不确定,所以Java禁止类似这样的写法:int[5] a;//syntax error...2009-03-18 14:37:53 · 96 阅读 · 0 评论 -
[#0x0004] 关于class和class member的访问权限
1. class的访问权限 class的访问权限只有public和package两种,不存在private和protected(内部类是特例)。 每一个编译单元(即.java文件)至多只能有一个public class,且如果有的话,该public class名必须与文件名相同。 class访问权限是member访问权限的基础。 2. member的访问权限 当一个cla...2009-03-19 22:05:47 · 188 阅读 · 0 评论 -
[#0x0005] overload and override: 重载与覆写
overload: 重载,指在同一个class中有多个同名function的现象。 override: 覆写,指ext class中重写base class中的同签名function的行为。 注意,如果ext class继承了base class——假设base class中一个非private非final的work(arg list 1)方法——ext class中同样也会有work(a...原创 2009-03-23 21:30:54 · 64 阅读 · 0 评论 -
[#0x0006] private、package权限字段不可继承
base class的private member是不可继承的(详细请参见[0x0004]),所以在ext class中也不会有这些member。 可以这样理解:ext class隐式包含一个base class,base class根据member的访问权限决定是否将member暴露给ext class。 不过ext class可以通过base class的非private ge...原创 2009-03-23 22:29:10 · 111 阅读 · 0 评论 -
[#0x0007] final
1. final data (基本数据类型) 相当于const 2. final reference 意味着该引用被绑定到一个具体对象,即该引用不能再指向另外一个对象。 但这个被指向的对象本身是可以发生变化的。 P.S. final data和final reference必须在定义处或是构造器中初始化(注意:这里说的“必须在定义处或是构造器中...原创 2009-03-25 22:42:22 · 68 阅读 · 0 评论 -
[#0x0008] class loading: an example
class loading是一个比较复杂的过程。一般说来,类是在其static member被访问时被加载的。在加载时会做的一件事是:初始化static member和static代码段(static block, i.e. static {......}),当然,static是只会被执行only once的。 以下是一个例子(adapted from Chapter 7, Thinki...原创 2009-03-25 23:58:07 · 74 阅读 · 0 评论 -
[#0x0009] 多态
1. 向上转型(upcast) 一个ext class的object可以用base class的reference来指向,即ext class的object reference可以升级为base class的object reference。 如:Base b = new Ext(); 2. 动态绑定(dynamic binding) 一般说来,将一个方法调用和一个方法主体关联起来叫做绑...原创 2009-03-27 01:23:44 · 78 阅读 · 0 评论 -
[#0x000A] 关于覆写方法的return type
在[#0x0005]里面提到过,如果在base class中有一个可继承的方法,在ext class中添加一个同签名的方法则是覆写行为。其实,覆写对return type还是有要求的。 一般说来,覆写方法要求除了签名相同外,return type也要相同。 另外,Java SE 5新推出了“协变返回类型(covariant return type)”,即覆写方法的return type...原创 2009-03-27 14:39:06 · 84 阅读 · 0 评论 -
[#0x000B] warning: 在构造器中请谨慎使用被覆写方法
先上代码(adapted from Chapter 8, Thinking in Java, Fourth Edition):class Glyph{ void draw() { System.out.println("Glyph.draw()"); } Glyph() { System.out.println("Glyph construct...原创 2009-03-27 15:46:05 · 145 阅读 · 0 评论 -
[#0x000C] 有关向下转型的必要性和动态绑定的细节
在[#0x0009]里面说过,“除了static方法和final方法(final包含private)外,Java对其他所有的方法都采用dynamic binding”(P151, Chapter 8, Thinking in Java, Fourth Edition),不过下面的这个例子也许会让人有点吃惊(adapted from Chapter 8, Thinking in Java, Fo...原创 2009-03-27 20:45:51 · 74 阅读 · 0 评论 -
[#0x000D] abstract
abstract的真正含义是“阻止产生对象”(针对类)或是“禁止被对象所拥有”(针对方法,类似static)。 一个abstract class是不能产生object的。(P.S. 抽象类可以声明引用,不可实例化;类似在使用多态时,我们可以声明一个接口的引用,实际指向一个实现类对象) abstract function只有方法声明,没有方法body。 拥有abstract func...原创 2009-04-02 20:35:51 · 153 阅读 · 0 评论 -
[#0x000E] 关于覆写方法的访问权限
覆写方法的访问权限不得低于被覆写方法的访问权限(或者说覆写方法不能拥有比被覆写方法更严格的访问权限)。 public > protected > package (default) > private (private最严格,public最宽松)...原创 2009-04-02 20:59:03 · 115 阅读 · 0 评论 -
[#0x0010] interface
我们大可将interface视为abstract class的延伸。 首先,interface默认具有abstract属性,所以你不能new一个interface。 其次,interface中的方法默认为public。由[#0x000E]可知,如果一个imp class实现了一个interface(相当于一个ext class继承了一个base class),那么imp cla...原创 2009-04-02 21:41:08 · 96 阅读 · 0 评论 -
[#0x0011] extends interface
一个imp class可以同时实现多个interface,格式如下:class Impl implements Intf1, Intf2, ..., IntfN; 如果一个class又有继承又有实现,那么应该先extends再implements,如:class ImplExt extends Base implements Intf; Java中不支持c...原创 2009-04-03 01:01:42 · 103 阅读 · 0 评论 -
[#0x0012] 内部类:对外部类的访问及.this和.new
先上代码: class Outer { public class Inner { public String getInnerClassName() { return Inner.this.getClass().toString(); //'Inner' can be omitted here } public String ...原创 2009-04-05 02:18:31 · 96 阅读 · 0 评论 -
[#0x003F] Java的值传递
所谓的值传递(pass-by-value)指的是:传递给方法的是参数值的一个copy。Java方法使用的永远是值传递(很多地方说到的“引用传递”其实也可以看做是值传递,概念搞多了反而还不好理解,干脆说死一点,Java就只使用值传递)。 通过例子来看:public class Test { public static void change(String s) { s ...2010-07-04 18:30:08 · 196 阅读 · 0 评论