第9章 管理类别档案 内部类别 package simport
第9章 • 管理类别档案 – 内部类别 – package与import
成员内部类别、区域内部类别 成员内部类别,基本上是在一个类别中直 接宣告另一个类别 public class outerclass i //内部类别 private class InnerClass i // 所产生的文件名为「外部类别名称$内部类 别名称cass
成员内部类别、区域内部类别 • 成员内部类别,基本上是在一个类别中直 接宣告另一个类别 • 所产生的文件名为「外部类别名称$内部类 别名称.class」 public class OuterClass { //内部类别 private class InnerClass { // .... } }
成员内部类别、区域内部类别 区域内部类别定义于一个方法中,类别的 可视范围与生成之对象仅止于该方法之中 内部类别还可以被宣告为" static“ 由于是“ static”,它不能存取外部类别的方 法,而必须透过外部类别所生成的对象来 进行呼叫
成员内部类别、区域内部类别 • 区域内部类别定义于一个方法中,类别的 可视范围与生成之对象仅止于该方法之中 • 内部类别还可以被宣告为"static“ • 由于是“static”,它不能存取外部类别的方 法,而必须透过外部类别所生成的对象来 进行呼叫
成员内部类别、区域内部类别 被宣告为 static的内部类别,事实上也可以 看作是另一种名称空间的管理方式 public class outer public static class Inner i Outer Inner inner new Outer Inner(
成员内部类别、区域内部类别 • 被宣告为static的内部类别,事实上也可以 看作是另一种名称空间的管理方式 public class Outer { public static class Inner { .... } .... } Outer.Inner inner = new Outer.Inner();
匿名内部类别 内部匿名类别可以是继承某个类别或是实 作某个接口 new[类别或接口()]{ //实作 Object obj new Object() i public string tostring()(//重新定义 tostring() return"匿名类别物件" System. out. println(obj)
匿名内部类别 • 内部匿名类别可以是继承某个类别或是实 作某个接口 new[类别或接口()] { //实作 } Object obj = new Object() { public String toString() { //重新定义toString() return"匿名类别物件"; } }; System.out.println(obj);
匿名内部类别 注意如果要在内部匿名类别中使用外部的 局部变量,变量在宣告时必须為"fna" public void someMethod()( finalist x=10;//宣告fina1 Object obj new Object ( public string tostring() return string. valueof(x);//x可在匿名类别中使用 System. out. println(obj)i
匿名内部类别 • 注意如果要在内部匿名类别中使用外部的 局部变量,变量在宣告时必须為"final" .... public void someMethod() { finalint x = 10; //宣告final Object obj = new Object() { public String toString() { return String.valueOf(x); //x可在匿名类别中使用 } }; System.out.println(obj); }
匿名内部类别 局部变量ⅹ并不是真正被拿来于内部匿名类 别中使用 会被匿名类别复制作为数据成员来使用 编译程序会要求您加上“fina"矢键词,这 样您就知道不能在内部匿名类别中改变X的 值 内部匿名类别在编译完成之后会产生「外 部类别名称$编号cass」,编号为1、2 3.n,每个编号n的档案对应于第n个匿名 类别
匿名内部类别 • 局部变量x并不是真正被拿来于内部匿名类 别中使用 • x会被匿名类别复制作为数据成员来使用 • 编译程序会要求您加上“final”关键词,这 样您就知道不能在内部匿名类别中改变x的 值 • 内部匿名类别在编译完成之后会产生「外 部类别名称$编号.class」,编号为1、2、 3...n,每个编号n的档案对应于第n个匿名 类别
设定包( package) 包被设计与文件系统结构相对应 为了要能建立与包相对应的文件系统结构 您在编译时可以加入"d"参数,并指定产生 的类别档案要储存在哪一个目录之下 package onlyfun caterpillar public class PackageDemo I public static void main (string[] args) System. out. println("Hello! World!")i
设定包(package) • 包被设计与文件系统结构相对应 • 为了要能建立与包相对应的文件系统结构, 您在编译时可以加入"-d"参数,并指定产生 的类别档案要储存在哪一个目录之下 package onlyfun.caterpillar; public class PackageDemo { public static void main(String[] args) { System.out.println("Hello! World!"); } }
设定包( package) javac-d. UsePackage java 在目前的工作位置中会出现 onlyfun目录 之下会有个 caterpillar目录,而当中有個 Package Demo class档案 ¨ package的设定会成为类别名称的一部 完整类别名 onlyfun. caterpillar. PackageDemo java onlyfun. caterpillar. PackageDemo
设定包(package) • javac -d . UsePackage.java • 在目前的工作位置中会出现onlyfun目录, 之下会有个caterpillar目录,而当中有個 PackageDemo.class档案 • “package”的设定会成为类别名称的一部 份 – 完整类别名onlyfun.caterpillar.PackageDemo – java onlyfun.caterpillar.PackageDemo
设定包( package) °「完全描」( Fullyqualified)名称 一完整的指出「包加类别」名称 onlyfun. caterpillar Point2D pl =new onlyfun. caterpillar Point2D(10, 20) 最后编译完成的.cass栏案必须放在 onlyfun 目录的 caterpillar目录下 bad class file: .Point2D. classclass file contains wrong class: onlyfun. caterpillar. Point2DPlease remove or make sure it appears in the correct subdirectory of the classpath Point2D p1 new Point2D(10, 20) A1 error
设定包(package) • 「完全描述」(Fullyqualified)名称 – 完整的指出「包加类别」名称 • 最后编译完成的.class档案必须放在onlyfun 目录的caterpillar目录下 onlyfun.caterpillar.Point2D p1 = new onlyfun.caterpillar.Point2D(10, 20); bad class file: .\Point2D.classclass file contains wrong class: onlyfun.caterpillar.Point2DPlease remove or make sure it appears in the correct subdirectory of the classpath. Point2D p1 = new Point2D(10, 20); ^1 error