`
文章列表
  如果把{}中的代码段称为“域”,那么方法body明显是一个域,方法body中的if {}或是for {}之类的也是域。在方法body或是方法body中其他域里定义的类就是局部内部类。   局部内部类只能在定义它的域中使用。且局部内部类的编译不受域执行与否的影响,即比如在if {}中定义了一个局部内部类,即使这个if不执行,这个局部内部类也照常编译。
  先上代码:  class Outer { public class Inner { public String getInnerClassName() { return Inner.this.getClass().toString(); //'Inner' can be omitted here } public String getOuterClassName() { return Outer.this.getClass().toString(); //'Outer' CANNOT be omitted h ...
  一个imp class可以同时实现多个interface,格式如下: class Impl implements Intf1, Intf2, ..., IntfN;      如果一个class又有继承又有实现,那么应该先extends再implements,如: class ImplExt extends Base implements Intf;      Java中不支持class的多重继承,但interface可以,如: class Ext extends Base1, Base2, ..., BaseN; //syntax error interface ExtI ...

[#0x0010] interface

    博客分类:
  • Java
  我们大可将interface视为abstract class的延伸。   首先,interface默认具有abstract属性,所以你不能new一个interface。   其次,interface中的方法默认为public。由[#0x000E] 可知,如果一个imp class实现了一个interface(相当于一个ext class继承了一个base class),那么imp class中对interface中声明方法的实现(相当于是覆写方法)也必须是public。   再次,interface中的field默认为public + static + final,但不能为blank ...
  覆写方法的访问权限不得低于被覆写方法的访问权限(或者说覆写方法不能拥有比被覆写方法更严格的访问权限)。   public > protected > package (default) > private (private最严格,public最宽松)

[#0x000D] abstract

    博客分类:
  • Java
  abstract的真正含义是“阻止产生对象”(针对类)或是“禁止被对象所拥有”(针对方法,类似static)。   一个abstract class是不能产生object的。(P.S. 抽象类可以声明引用,不可实例化;类似在使用多态时,我们可以声明一个接口的引用,实际指向一个实现类对象)   abstract function只有方法声明,没有方法body。   拥有abstract function的class必须声明为abstract class,否则会编译报错(abstract function不能被对象所拥有,那么包含该abstract function的class自然不能产生对象, ...
  在[#0x0009]里面说过,“除了static方法和final方法(final包含private)外,Java对其他所有的方法都采用dynamic binding”(P151, Chapter 8, Thinking in Java, Fourth Edition),不过下面的这个例子也许会让人有点吃惊(adapted from Chapter 8, Thinking in Java, Fourth Edition): //@file RTTI.java //RTTI: Run-Time Type Identification class Useful { public ...
  先上代码(adapted from Chapter 8, Thinking in Java, Fourth Edition): class Glyph { void draw() { System.out.println("Glyph.draw()"); } Glyph() { System.out.println("Glyph constructor"); draw(); } } class RoundGlyph extends Glyph { private int radi ...
  在[#0x0005]里面提到过,如果在base class中有一个可继承的方法,在ext class中添加一个同签名的方法则是覆写行为。其实,覆写对return type还是有要求的。   一般说来,覆写方法要求除了签名相同外,return type也要相同。   另外,Java SE 5新推出了“协变返回类型(covariant return type)”,即覆写方法的return type可以是被覆写方法return type的ext class,如: class BaseReturnType { } class ExtReturnType extends BaseReturnType ...

[#0x0009] 多态

    博客分类:
  • Java
1. 向上转型(upcast)  一个ext class的object可以用base class的reference来指向,即ext class的object reference可以升级为base class的object reference。  如:Base b = new Ext();   2. 动态绑定(dynamic binding)  一般说来,将一个方法调用和一个方法主体关联起来叫做绑定。也可以理解为将方法名和方法body(方法代码段)关联起来叫做绑定。除了static方法和final方法(final包含private)外,Java对其他所有的方法都采用dynamic binding ...
  class loading是一个比较复杂的过程。一般说来,类是在其static member被访问时被加载的。在加载时会做的一件事是:初始化static member和static代码段(static block, i.e. static {......}),当然,static是只会被执行only once的。   以下是 ...

[#0x0007] final

    博客分类:
  • Java
1. final data (基本数据类型)   相当于const   2. final reference   意味着该引用被绑定到一个具体对象,即该引用不能再指向另外一个对象。   但这个被指向的对象本身是可以发生变化的。   P.S. final data和final reference必须在定义处或是构造器中初始化(注意:这里说的“必须在定义处或是构造器中初始化”指的是类的final member,即final成员。如果在方法中定义final data或final reference,则没有这个限制)。所谓blank final (我谓之dynamic ...
  base class的private member是不可继承的(详细请参见[0x0004]),所以在ext class中也不会有这些member。   可以这样理解:ext class隐式包含一个base class,base class根据member的访问权限决定是否将member暴露给ext class。   不过ext class可以通过base class的非private getter来access这些private member。     package权限字段不可继承的理由同。
  overload: 重载,指在同一个class中有多个同名function的现象。  override: 覆写,指ext class中重写base class中的同签名function的行为。  注意,如果ext class继承了base class——假设base class中一个非private非final的work(arg list 1)方法— ...
1. class的访问权限     class的访问权限只有public和package两种,不存在private和protected(内部类是特例)。   每一个编译单元(即.java文件)至多只能有一个public class,且如果有的话,该public class名必须与文件名相同。   class访问权限是member访问权限的基础。 2. member的访问权限   当一个class是可访问的时候,member的访问权限才有意义。   private、package、protected、public,具体的就不详细说了。   protected包含package权限。   ...
Global site tag (gtag.js) - Google Analytics