zoukankan      html  css  js  c++  java
  • Java 在方法和作用域内的内部类

    通常,如果所读写 的代码包含了内部类,那么它们都是"平凡的"内部类,简单并且容易理解,然而,内部类的语法覆盖了大量其它的更加难以理解的计数,例如可以在一个方法里或者在任意的作用域里定义内部类.这么做有两个理由

    1)如前所述,你实现了某类型的接口,于是可以创建并返回对其的引用

    2)你要创建一个复杂的问题,想创建一个类来辅助你的解决方案,但是又不希望这个类是公共可用的.

    在后面的例子中前面的代码将被修改,以用来实现:

    1)一个定义在方法中的类

    2)一个定义在作用域内的类,此作用域在方法的内部

    3)一个实现了接口的匿名类

    4)一个匿名类,它扩展了有非默认构造器的类

    5)一个匿名类,它执行字段初始化

    6)一个匿名类,它通过实例初始化实现构造(匿名类不可以能有过构造器)

    //: innerclasses/Destination.java
    package object;
    public interface Destination {
      String readLabel();
    } ///:~
    //: innerclasses/Parcel5.java
    // Nesting a class within a method.
    package object;
    public class Parcel5 {
      public Destination destination(String s) {
        class PDestination implements Destination {//在destination方法之外不可使用类,可以通过Destination使用
          private String label;                   //PDestination类的public方法
    private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new PDestination(s); } class PDestination //可以定义和PDestination重名的类,但最好不这样做  { } public static void main(String[] args) { Parcel5 p = new Parcel5(); Destination d = p.destination("Tasmania"); } } ///:~
    //: innerclasses/Parcel6.java
    // Nesting a class within a scope.
    package object;
    public class Parcel6 {
      private void internalTracking(boolean b) {
        if(b) {
          class TrackingSlip { //在if域之外类TrackingSlip不可用,可以通过internalTracking方法调用,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) {
        Parcel6 p = new Parcel6();
        p.track();
      }
    } ///:~
  • 相关阅读:
    关于Windows版本的redis启动报错:Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
    03 验证线程是数据共享的
    01 线程的两种创建方式
    33 线程的创建 验证线程之间数据共享 守护线程
    10 进程池的回调函数
    09 进程池的异步方法
    07 进程池的同步方法和异步方法
    08 进程池同步方法
    05 进程池map方法
    06 测试多进程的时间
  • 原文地址:https://www.cnblogs.com/jiangfeilong/p/10223232.html
Copyright © 2011-2022 走看看