在机械工业出版社出的《JAVA 编程思想》中,一句关于内部类的话不理解? A,在一个类的内部({}内)定义的类是内部内。除此之外都是外部类。B,在方法里使用内部类,可以只定义类型为“内部类名”。但如果那个方法是STATIC方法,必须类型设为“外部类名.内部类名”. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 A、内部类就是在一个类里面的类,除了内部类就是外部类了;B、也就是如果一个内部只有在它所属于的外部类的静态方法里可以直接引用,除此之外其它地方要引用必须先实例化化外部类,再实例化内部类,即new Parcel2().new Contents(); A:如上高手所诉.B:有static的内部类调用方法和static变量一样. 要彻底理解这写概念,你先得彻底搞清楚内部类的相关知识。我以前看《JAVA编程思想》的这部分时仔细查阅了相关文档,并做了笔记如下:<由“为什么non-static inner class不可以包含静态成员数据”谈起>可以声明两种类型的类:top-level class 和 nested class。nested class 是任何声明在其他类或接口中的类。而nested class又包括member class、local class、anonymous class和nested top-level class(static inner class),也可以分为inner class(non-static inner class)和static nested class(static inner class)。inner class不可以包含静态成员数据,这主要是因为static是top-level实体,而inner class不是top-level的。原因是inner class必须在封装类的实例下实例化后使用,这样就不可以使用top-level实体的static。而static inner class由于间接的也是一个top-level class,因此它可以包含静态成员数据。但注意inner class可以有compile-time constant fileds。Member interfaces总是默认static的。要注意local class和anonymous class不可以使用它定义所在方法(范围)内的非final成员变量。因为方法结束时这些成员变量将要销毁,而你在inner class中创建的内部对象却可能仍就存活着。由以上笔记可以看出,你提到的内部类就是指inner class,而外部类应该是指inner class和static nested class(static inner class)之外的类,就是top-level class。想要创建一个内部类的实例对象,只有两种途径:1、内部类所在的外部类的非static方法内直接用内部类类名声明:public void ship(String dest) { Contents c = cont(); Destination d = to(dest); System.out.println(d.readLabel()); } 2、在除内部类所在的外部类之外的外部类里创建,声明时还要在内部类前加上内部类所在的外部类的类名(即外部类名.内部类名):Parcel2.Contents c = q.cont(); Parcel2.Destination d = q.to("Borneo");另外:static方法不可以访问非static字段和方法,所以自然就不可以访问inner class(你这里提到的内部类)了,更别提创建它的对象。 1 内部类外边的类, 一般是 toplevel 的2 就是说,只有 外部类 的实例方法(instrance method)能够直接用 innerclassname 来访问,e.g: public Destination to(String s) { return new Destination(s); } 其他的地方 ,如 外部类的 static 方法,和其它的类,只能用 outer.inner来访问呀 !! 平时使用的一些JAVA包其实都是外部类 Java中的所有类型转换 double和Interger的比较? java中类继承的问题 关于内部类 如何将一个image对象转换成inputstream 这个加密好象是MD5的,2bfa566053924ff162382924b19ffa58,谁能帮我把它变成1234的加密 关于java2的两个问题 为什么用字节流读取写入文件会造成文件大小不一致? 为什么??? Image pImg[]; 的用法。(skyyoung(路人甲)) 大家认为Java是否有必要加入模版呢? 请教大侠下面的代码为什么不能生成packone子目录?
B、也就是如果一个内部只有在它所属于的外部类的静态方法里可以直接引用,除此之外其它地方要引用必须先实例化化外部类,再实例化内部类,
即new Parcel2().new Contents();
B:有static的内部类调用方法和static变量一样.
<由“为什么non-static inner class不可以包含静态成员数据”谈起>
可以声明两种类型的类:top-level class 和 nested class。nested class 是任何声明在其他类或接口中的类。而nested class又包括member class、local class、anonymous class和nested top-level class(static inner class),也可以分为inner class(non-static inner class)和static nested class(static inner class)。inner class不可以包含静态成员数据,这主要是因为static是top-level实体,而inner class不是top-level的。原因是inner class必须在封装类的实例下实例化后使用,这样就不可以使用top-level实体的static。而static inner class由于间接的也是一个top-level class,因此它可以包含静态成员数据。但注意inner class可以有compile-time constant fileds。Member interfaces总是默认static的。要注意local class和anonymous class不可以使用它定义所在方法(范围)内的非final成员变量。因为方法结束时这些成员变量将要销毁,而你在inner class中创建的内部对象却可能仍就存活着。由以上笔记可以看出,你提到的内部类就是指inner class,而外部类应该是指inner class和static nested class(static inner class)之外的类,就是top-level class。想要创建一个内部类的实例对象,只有两种途径:
1、内部类所在的外部类的非static方法内直接用内部类类名声明:
public void ship(String dest) {
Contents c = cont();
Destination d = to(dest);
System.out.println(d.readLabel());
}
2、在除内部类所在的外部类之外的外部类里创建,声明时还要在内部类前加上内部类所在的外部类的类名(即外部类名.内部类名):
Parcel2.Contents c = q.cont();
Parcel2.Destination d = q.to("Borneo");另外:static方法不可以访问非static字段和方法,所以自然就不可以访问inner class(你这里提到的内部类)了,更别提创建它的对象。
2 就是说,只有 外部类 的实例方法(instrance method)能够直接用 innerclassname 来访问,e.g:
public Destination to(String s) {
return new Destination(s);
}
其他的地方 ,如 外部类的 static 方法,和其它的类,只能用 outer.inner
来访问呀 !!