当前位置: 技术问答>java相关
Think in Java 大讨论一 ( 关于 Inner class )
来源: 互联网 发布时间:2017-03-23
本文导语: 我熟悉 C++ , 对面向对象编程也有相当的了解, 近日通过Think in Java 学习Java 感到对 Inner class 不是很理解: 在P267说 : 如果你定义了某个匿名的 inner class , 并且希望用到定义于匿名 inner class ...
我熟悉 C++ , 对面向对象编程也有相当的了解, 近日通过Think in Java 学习Java
感到对 Inner class 不是很理解:
在P267说 :
如果你定义了某个匿名的 inner class , 并且希望用到定义于匿名 inner
class 之外的某个对象, 编译器会限制该外部对象必须为 final.
我想问, 为什么要限制对象为 final.
感到对 Inner class 不是很理解:
在P267说 :
如果你定义了某个匿名的 inner class , 并且希望用到定义于匿名 inner
class 之外的某个对象, 编译器会限制该外部对象必须为 final.
我想问, 为什么要限制对象为 final.
|
《Thinking in java》我没仔细看过,感觉不是一本初级Java书,所以Java语言的很多细节没有讲清楚。
Java里的class跟C++比要丰富的多,分类标准多样,但按照规范,总可以分为顶层类和嵌套类(nested class,指定义在其它类的body里)两种。嵌套类又可以细分为两种:成员类(member class)和本地类(local class,定义在代码块中);成员类分为静态德和非静态的,特性区别很大,非静态成员类真正称为内部类(inner class),但现在内部类被滥用了,所有嵌套类都叫成inner class了!本地类可分为匿名类和非匿名类,本地类被限制为不能访问所在代码块有效范围里的非final变量。呵呵,明白了吗?举个例子:
public class TopLevelClass {
static class StaticMemberClass {};
class InnerClass {};
void f(final int a, int b) {
final int c;
int d;
class NonAnonymousClass {
void f() {
//可以访问a,c;b,d不可见
}
};
new NonAnonymousClass() {//匿名类,继承了NonAnonymousClass
void f() {//覆盖其f()方法
//
}
}.f();
}
}
Java里的class跟C++比要丰富的多,分类标准多样,但按照规范,总可以分为顶层类和嵌套类(nested class,指定义在其它类的body里)两种。嵌套类又可以细分为两种:成员类(member class)和本地类(local class,定义在代码块中);成员类分为静态德和非静态的,特性区别很大,非静态成员类真正称为内部类(inner class),但现在内部类被滥用了,所有嵌套类都叫成inner class了!本地类可分为匿名类和非匿名类,本地类被限制为不能访问所在代码块有效范围里的非final变量。呵呵,明白了吗?举个例子:
public class TopLevelClass {
static class StaticMemberClass {};
class InnerClass {};
void f(final int a, int b) {
final int c;
int d;
class NonAnonymousClass {
void f() {
//可以访问a,c;b,d不可见
}
};
new NonAnonymousClass() {//匿名类,继承了NonAnonymousClass
void f() {//覆盖其f()方法
//
}
}.f();
}
}