当前位置: 技术问答>java相关
在机械工业出版社出的《JAVA 编程思想》中,一句关于内部类的话不理解?
来源: 互联网 发布时间:2015-10-17
本文导语: 在机械工业出版社出的《JAVA 编程思想》第160页,有这么一句话: 更典型的一种情况是,一个外部类(不明白处A)拥有一个特殊的方法,它会返回指向一个内部类的句柄,就象下面这样: public class Parcel2 { clas...
在机械工业出版社出的《JAVA 编程思想》第160页,有这么一句话:
更典型的一种情况是,一个外部类(不明白处A)拥有一个特殊的方法,它会返回指向一个内部类的句柄,就象下面这样:
public class Parcel2 {
class Contents {
private int i = 11;
public int value() { return i; }
}
class Destination {
private String label;
Destination(String whereTo) {
label = whereTo;
}
String readLabel() { return label; }
}
public Destination to(String s) {
return new Destination(s);
}
public Contents cont() {
return new Contents();
}
public void ship(String dest) {
Contents c = cont();
Destination d = to(dest);
System.out.println(d.readLabel());
}
public static void main(String[] args) {
Parcel2 p = new Parcel2();
p.ship("Tanzania");
Parcel2 q = new Parcel2();
// Defining references to inner classes:
Parcel2.Contents c = q.cont();
Parcel2.Destination d = q.to("Borneo");
}
}
如果想在除外部类非static方法内部之外的任何地方(不明白处B)生成内部类的一个对象,必须将那个对象的类型设为“外部类名.内部类名”,就象main中展示的那样。
不明白之处:
A:外部类怎么理解?
B:除外部类非static方法内部之外的任何地方怎么理解?
更典型的一种情况是,一个外部类(不明白处A)拥有一个特殊的方法,它会返回指向一个内部类的句柄,就象下面这样:
public class Parcel2 {
class Contents {
private int i = 11;
public int value() { return i; }
}
class Destination {
private String label;
Destination(String whereTo) {
label = whereTo;
}
String readLabel() { return label; }
}
public Destination to(String s) {
return new Destination(s);
}
public Contents cont() {
return new Contents();
}
public void ship(String dest) {
Contents c = cont();
Destination d = to(dest);
System.out.println(d.readLabel());
}
public static void main(String[] args) {
Parcel2 p = new Parcel2();
p.ship("Tanzania");
Parcel2 q = new Parcel2();
// Defining references to inner classes:
Parcel2.Contents c = q.cont();
Parcel2.Destination d = q.to("Borneo");
}
}
如果想在除外部类非static方法内部之外的任何地方(不明白处B)生成内部类的一个对象,必须将那个对象的类型设为“外部类名.内部类名”,就象main中展示的那样。
不明白之处:
A:外部类怎么理解?
B:除外部类非static方法内部之外的任何地方怎么理解?
|
要彻底理解这写概念,你先得彻底搞清楚内部类的相关知识。我以前看《JAVA编程思想》的这部分时仔细查阅了相关文档,并做了笔记如下:
可以声明两种类型的类: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(你这里提到的内部类)了,更别提创建它的对象。
可以声明两种类型的类: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(你这里提到的内部类)了,更别提创建它的对象。
|
A,在一个类的内部({}内)定义的类是内部内。除此之外都是外部类。
B,在方法里使用内部类,可以只定义类型为“内部类名”。但如果那个方法是STATIC方法,必须类型设为“外部类名.内部类名”.
B,在方法里使用内部类,可以只定义类型为“内部类名”。但如果那个方法是STATIC方法,必须类型设为“外部类名.内部类名”.
|
A、内部类就是在一个类里面的类,除了内部类就是外部类了;
B、也就是如果一个内部只有在它所属于的外部类的静态方法里可以直接引用,除此之外其它地方要引用必须先实例化化外部类,再实例化内部类,
即new Parcel2().new Contents();
B、也就是如果一个内部只有在它所属于的外部类的静态方法里可以直接引用,除此之外其它地方要引用必须先实例化化外部类,再实例化内部类,
即new Parcel2().new Contents();
|
1 内部类外边的类, 一般是 toplevel 的
2 就是说,只有 外部类 的实例方法(instrance method)能够直接用 innerclassname 来访问,e.g:
public Destination to(String s) {
return new Destination(s);
}
其他的地方 ,如 外部类的 static 方法,和其它的类,只能用 outer.inner
来访问呀 !!
2 就是说,只有 外部类 的实例方法(instrance method)能够直接用 innerclassname 来访问,e.g:
public Destination to(String s) {
return new Destination(s);
}
其他的地方 ,如 外部类的 static 方法,和其它的类,只能用 outer.inner
来访问呀 !!
|
A:如上高手所诉.
B:有static的内部类调用方法和static变量一样.
B:有static的内部类调用方法和static变量一样.
|
平时使用的一些JAVA包其实都是外部类