知识大全 方法和作用域中的内部类

Posted

篇首语:博观而约取,厚积而薄发。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 方法和作用域中的内部类相关的知识,希望对你有一定的参考价值。

  至此 我们已基本理解了内部类的典型用途 对那些涉及内部类的代码 通常表达的都是 单纯 的内部类 非常简单 且极易理解 然而 内部类的设计非常全面 不可避免地会遇到它们的其他大量用法——假若我们在一个方法甚至一个任意的作用域内创建内部类 有两方面的原因促使我们这样做     ( ) 正如前面展示的那样 我们准备实现某种形式的接口 使自己能创建和返回一个句柄     ( ) 要解决一个复杂的问题 并希望创建一个类 用来辅助自己的程序方案 同时不愿意把它公开     在下面这个例子里 将修改前面的代码 以便使用     ( ) 在一个方法内定义的类    ( ) 在方法的一个作用域内定义的类    ( ) 一个匿名类 用于实现一个接口    ( ) 一个匿名类 用于扩展拥有非默认构建器的一个类    ( ) 一个匿名类 用于执行字段初始化    ( ) 一个匿名类 通过实例初始化进行构建(匿名内部类不可拥有构建器)    所有这些都在innerscopes包内发生 首先 来自前述代码的通用接口会在它们自己的文件里获得定义 使它们能在所有的例子里使用     //: Destination java  package c innerscopes;    interface Destination    String readLabel();   ///:~    由于我们已认为Contents可能是一个抽象类 所以可采取下面这种更自然的形式 就象一个接口那样     //: Contents java  package c innerscopes;    interface Contents    int value();   ///:~    尽管是含有具体实施细节的一个普通类 但Wrapping也作为它所有衍生类的一个通用 接口 使用     //: Wrapping java  package c innerscopes;    public class Wrapping    private int i;   public Wrapping(int x) i = x;    public int value() return i;    ///:~    在上面的代码中 我们注意到Wrapping有一个要求使用自变量的构建器 这就使情况变得更加有趣了     第一个例子展示了如何在一个方法的作用域(而不是另一个类的作用域)中创建一个完整的类     //: Parcel java  // Nesting a class within a method  package c innerscopes;    public class Parcel    public Destination dest(String s)     class PDestination      implements Destination      private String label;     private PDestination(String whereTo)       label = whereTo;          public String readLabel() return label;         return new PDestination(s);      public static void main(String[] args)     Parcel p = new Parcel ();    Destination d = p dest( Tanzania );      ///:~    PDestination类属于dest()的一部分 而不是Parcel 的一部分(同时注意可为相同目录内每个类内部的一个内部类使用类标识符PDestination 这样做不会发生命名的冲突) 因此 PDestination不可从dest()的外部访问 请注意在返回语句中发生的上溯造型——除了指向基础类Destination的一个句柄之外 没有任何东西超出dest()的边界之外 当然 不能由于类PDestination的名字置于dest()内部 就认为在dest()返回之后PDestination不是一个有效的对象     下面这个例子展示了如何在任意作用域内嵌套一个内部类     //: Parcel java  // Nesting a class within a scope  package c innerscopes;    public class Parcel    private void internalTracking(boolean b)     if(b)      class TrackingSlip       private String id;      TrackingSlip(String s)        id = s;            String getSlip() return id;           TrackingSlip ts = new TrackingSlip( slip );     String s = ts getSlip();        // Can t use it here! Out of scope:    //! TrackingSlip ts = new TrackingSlip( x );      public void track() internalTracking(true);    public static void main(String[] args)     Parcel p = new Parcel ();    p track();      ///:~    TrackingSlip类嵌套于一个if语句的作用域内 这并不意味着类是有条件创建的——它会随同其他所有东西得到编译 然而 在定义它的那个作用域之外 它是不可使用的 除这些以外 它看起来和一个普通类并没有什么区别     下面这个例子看起来有些奇怪     //: Parcel java  // A method that returns an anonymous inner class  package c innerscopes;    public class Parcel    public Contents cont()     return new Contents()      private int i = ;     public int value() return i;     ; // Semicolon required in this case      public static void main(String[] args)     Parcel p = new Parcel ();    Contents c = nt();      ///:~    cont()方法同时合并了返回值的创建代码 以及用于表示那个返回值的类 除此以外 这个类是匿名的——它没有名字 而且看起来似乎更让人摸不著头脑的是 我们准备创建一个Contents对象     return new Contents()    但在这之后 在遇到分号之前 我们又说 等一等 让我先在一个类定义里再耍一下花招     return new Contents()   private int i = ;  public int value() return i;   ;    这种奇怪的语法要表达的意思是 创建从Contents衍生出来的匿名类的一个对象 由new表达式返回的句柄会自动上溯造型成一个Contents句柄 匿名内部类的语法其实要表达的是     class MyContents extends Contents   private int i = ;  public int value() return i;     return new MyContents();    在匿名内部类中 Contents是用一个默认构建器创建的 下面这段代码展示了基础类需要含有自变量的一个构建器时做的事情     //: Parcel java  // An anonymous inner class that calls the   // base class constructor  package c innerscopes;    public class Parcel    public Wrapping wrap(int x)     // Base constructor call:    return new Wrapping(x)      public int value()       return super value() * ;         ; // Semicolon required      public static void main(String[] args)     Parcel p = new Parcel ();    Wrapping w = p wrap( );      ///:~    也就是说 我们将适当的自变量简单地传递给基础类构建器 在这儿表现为在 new Wrapping(x) 中传递x 匿名类不能拥有一个构建器 这和在调用super()时的常规做法不同     在前述的两个例子中 分号并不标志着类主体的结束(和C++不同) 相反 它标志着用于包含匿名类的那个表达式的结束 因此 它完全等价于在其他任何地方使用分号     若想对匿名内部类的一个对象进行某种形式的初始化 此时会出现什么情况呢?由于它是匿名的 没有名字赋给构建器 所以我们不能拥有一个构建器 然而 我们可在定义自己的字段时进行初始化     //: Parcel java  // An anonymous inner class that performs   // initialization A briefer version  // of Parcel java   package c innerscopes;    public class Parcel    // Argument must be final to use inside    // anonymous inner class:   public Destination dest(final String dest)     return new Destination()      private String label = dest;     public String readLabel() return label;     ;      public static void main(String[] args)     Parcel p = new Parcel ();    Destination d = p dest( Tanzania );      ///:~    若试图定义一个匿名内部类 并想使用在匿名内部类外部定义的一个对象 则编译器要求外部对象为final属性 这正是我们将dest()的自变量设为final的原因 如果忘记这样做 就会得到一条编译期出错提示     只要自己只是想分配一个字段 上述方法就肯定可行 但假如需要采取一些类似于构建器的行动 又应怎样操作呢?通过Java 的实例初始化 我们可以有效地为一个匿名内部类创建一个构建器     //: Parcel java  // Using instance initialization to perform   // construction on an anonymous inner class  package c innerscopes; cha138/Article/program/Java/hx/201311/27008

相关参考

知识大全 浅析Java内部类在GUI设计中的作用(2)

浅析Java内部类在GUI设计中的作用(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  四方

知识大全 C#学习之——认识C#的内部类

C#学习之——认识C#的内部类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#中的内部类能够

知识大全 为什么匿名内部类参数必须为final类型

   在线文档阅读开发手记(一)) 从程序设计语言的理论上局部内部类(即定义在方法中的内部类)由于本身就是在方法内部(可出现在形式参数定义处或者方法体处)因而访

内因和外因作为同时存在的内部和外部的联系,对事物的发展起着相同的作用

内因和外因作为同时存在的内部和外部的联系,对事物的发展起着相同的作用。_____答案:错误解析:事物的产生、发展和灭亡都是内因外因共同作用的结果,但是二者在事物发展中的地位和作用是不同的。外因是事物变

治疗类化妆品的种类及作用是什么?

治疗类化妆品含有某种药物成分,主要用于问题皮肤。其特点是针对性强,通过化妆品的配合使用与身体内部调理,使问题皮肤患处得到改善和治疗。常用的治疗类化妆品有去斑霜、粉刺霜、抑汗霜、抑汗粉、祛臭霜、祛臭粉、

知识大全 java的内部类和匿名类剖析

   Java通过对Java语言规范进行修改显著简化了一些实用结构的实现在那些修改中最引人注目的就是内部类和匿名类如运用得当它们可使程序更易理解和维护本文介绍内部类和匿名

知识大全 内部类和上溯造型

  迄今为止内部类看起来仍然没什么特别的地方毕竟用它实现隐藏显得有些大题小做Java已经有一个非常优秀的隐藏机制——只允许类成为友好的(只在一个包内可见)而不是把它创建成一个内部类    然而当我们准

知识大全 将内部类进行到底

  总结了一下内部类的一下特性和容易出错的地方给大家看看~~  有什么错误望指正~~~    (一)  Java以后版本添加了嵌套类(InnerClass嵌套类内部类)嵌套类定义在类(外部类)里面  

内部行政行为是指行政机关作用于行政系统内部或行政机关内部的行政行为,内部行政行为不属于人民法院行政诉讼的受案范围,行政机

内部行政行为是指行政机关作用于行政系统内部或行政机关内部的行政行为,内部行政行为不属于人民法院行政诉讼的受案范围,行政机关工作人员对这类决定不服产生的争议,应当向该行政机关或监察、人事机关提出处理。下

知识大全 会计信息化在企业发展中的作用

会计信息化在企业发展中的作用?????一、企业信息化的概念一、企业信息化是指企业广泛利用现代信息技术,充分开发和利用企业内部或外部的,企业可能得到和利用的,并与企业生产经营活动有关的各种信息,以便及时