当前位置: 首页 > Thinking in Java > 正文
第10章–内部类_方法和作用域内的内部类_定义在方法中的内部类( 局部内部类 )
Jul112013
作者:边城网事 发布:2013-07-11 16:17 分类:Thinking in Java 阅读:733 抢沙发
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 | 边城网事