当前位置: 首页 > Thinking in Java > 正文

第10章–内部类_方法和作用域内的内部类_定义在方法中的内部类( 局部内部类 )

public interface Destination
{
  String readLabel();
}
public class Parcel5
{
  
  
  public Destination destination(String s)
  {
    
    //定义在方法内部的内部类(又叫 局部内部类 )
    
    /**
     * 局部内部类之前 不能有 private  public protected修饰,
     * 只能有 final 或者 abstract,或者什么都不加
     * 因为局部类的作用域 仅限于 定义它的 作用域之类,
     * 没必要加 private  public 和 protected 来修饰,
     * 
     * p196页说:"在destination()方法中定义了内部类PDestination,
     * 并不意味着一旦destination()方法执行完毕,PDestination就不可用了."
     * 
     * 这句的表述让人非常困惑,初学时,完全不能理解.
     * 貌似这句说的有错,因为局部内部类
     * 只有在它的作用域范围内可用,方法返回的只能是用局部内部类实现的接口(用到了向上转型).
     * 也就是说,只有接口方法才可用.
     * 并且PDestination这个类也只有在定义它的destination()方法内部可用
     * (Test()方法就只能在destination()方法内部使用,因为只有在destination()方法内部才能实例化一个纯粹的PDestination对象),
     * 这个destination()方法返回的也仅仅是Destination接口,
     * 就是说返回的对象只能使用Destination接口的方法.
     * 
     * 还有一句,初学时也是一头雾水,就是p196的这句:
     * "你可以在同一个子目录下的任意类中,对某个内部类使用类标识符PDestination,这并不会有命名冲突."
     * 由上面的说明,这句就好理解的,因为上面定义的局部内部类的范围仅限于destination()方法内部,
     * 如果你在别的地方destination()之外,再定义一个类,名字也叫PDestination是可行的,不会造成
     * 命名冲突.
     * 
     */
    class PDestination implements Destination
    {
      private String label;

      private PDestination(String whereTo)
      {
        label = whereTo ;
      }

      public String readLabel()
      {
        return label;
      }
      
      public String Test()
      {
        return "Test";
      }
    }
    
    return new PDestination(s); //有向上转型
  }
  
  
  public static void main(String[] args)
  {
    Parcel5 p = new Parcel5();
    Destination d = p.destination("Tasmania");
    
  }
}
/**
* if条件中的 局部内部类,只能在if后面的{}中使用
*/
public class Parcel6
{
  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();
    }
    // ! TrackingSlip ts = new TrackingSlip("x"); //变量的作用域 只限制于包含变量的最小的一对大括号内
  }

  public void track()
  {
    internalTracking(true);
  }

  public static void main(String[] args)
  {
    Parcel6 p = new Parcel6();
    p.track();
  }
}

 

赞 赏

   微信赞赏  支付宝赞赏


本文固定链接: https://www.jack-yin.com/coding/thinking-in-java/2383.html | 边城网事

该日志由 边城网事 于2013年07月11日发表在 Thinking in Java 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 第10章–内部类_方法和作用域内的内部类_定义在方法中的内部类( 局部内部类 ) | 边城网事
关键字: ,

第10章–内部类_方法和作用域内的内部类_定义在方法中的内部类( 局部内部类 ) 暂无评论

发表评论

快捷键:Ctrl+Enter