------- android培训、java培训、期待与您交流! ----------
内部类,顾名思义就是在内部的类。它的定义是:一个类的定义放在另一个类的内部,这个类就叫做内部类。你觉得呢。
For instance:
- public class First {
- public class Contents{
- public void f(){
- System.out.println("In Class First's inner Class Contents method f()");
- }
- }
- }
2-6行定义的就是内部类。
那么内部类有什么特性呢?
1 程序中创建外部类对象是并没有创建内部类的对象;
2 内部类对象可以访问其外部类的任何成员
3 内部类对其他外部是不可见的
内部类是Java语言一个重要的基本特性,在Java开发的许多领域都会经常用到。内部类的定义说简单一点就是将一个类定义在另外一个类的内部。内部类允许你把一些逻辑相关的类组织在一起,控制内部类代码的可视性,它和类的组合是完全不同的概念。内部类主要还有有以下比较关键的特性:
1. 普通的非内部类不能被声明为private或protected,否则就失去了创建该类的意义。但是内部类通常可以被声明为private或protected类型,因为这样可以防止他人对该内部类实现的功能进行修改,达到隐藏实现细节的目的。例如:
class Fruit {
private class Weight {
private String i;
private Weight(String j) {
i = j;
}
public String read() {
return i;
}
}
}
class test {
public static void main(String[] args) {
Fruit f = new Fruit();
f.Weight w = f.new Weight(); //不能访问private类,如果Weight为protected类型则可以
}
}
2. 在方法或某控制语句(if/for/while等)的作用域内定义内部类,将只能在该范围内调用内部类的方法和成员变量。
3. 匿名内部类是一种特殊的内部类,如果希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。
public class Fruit {
public Tea cont(final int j) {
return new Tea() {
private int i = j;
public int read() {
return i;
}
}; //注意这里的分号
}
public static void main(String[] args) {
Fruit f = new Fruit();
Tea t = f.cont;
}
}
而当方法cont(final int j)中的参数j只是被传递到匿名类中的构造器时,可以不用被声明为final类型,如return new Tea(j)。这里提到了匿名内部类的构造器,那么它是怎么被初始化的呢?
public class Fruit {
public Tea cont(int j) {
return new Tea(j) {
System.out.println(j);
};
}
}
还可以这样初始化匿名内部类:
public class Fruit {
public Tea cont(final int j) {
return new Tea(j) {
int i;
// 初始化匿名内部类
{
i = j;
System.out.print(i);
}
};
}
}
方法cont()可以被称为实例初始化方法,使得匿名内部类通过构造器而被初始化,在实际应用中,我们不能重载实例初始化方法,因为匿名内部类只能有一个构造方法。
如何?