参考书籍:Java面向对象程序设计(第二版)–耿祥义 张跃平编著
前面我们知道类有两种重要的成员,即成员变量和方法,还有一种,即内部类
定义
Java支持在一个类中声明另一个类,这样的类称为内部类
而包含内部类的类称为内部类的外嵌类
关系:
- 内部类可以使用外嵌类的成员变量
- 内部类中的方法可以调用外嵌类的方法
- 内部类的类体中不可以声明类变量和类方法(即静态变量和静态方法,在4.6 static关键字有解释)
- 外嵌类的类体中可以用内部类声明对象作为外嵌类的成员
- 内部类仅仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象
A类
package p1;
public class A {
static String chy;
B b; //内部类声明对象
A(String a){ //外嵌类A带参数的构造方法
b=new B(10);
chy=a;
}
public void show(){
b.speak();
}
class B{ //内部类声明
int h;
B(int h){ //内部类B带参数的构造方法
this.h=h;
}
void speak(){
System.out.println(chy+“是”+h);
}
}
}
主类
package p1;
public class p1 {
public static void main(String args[]){
A a=new A(“chy”);
a.show();
a.b.speak(); //对象a可以使用 内部类声明的对象作为外嵌类的成员 调用的内部类的方法
}
}
//两个输出都是chy是10
注意:
(1)Java编译器生成的内部类的字节码文件的名字和通常的类不同
内部类对应的字节码文件的名字格式是“外嵌类$内部类名”,如上是:A$B.class
- 内部类可以被修饰为static内部类(非内部类不可以)
类是一种数据类型,那么static内部类就是外嵌类中的一种静态数据类型,这样在其他类就可以用内部类创建对象了(例子如下)
- static内部类不能操作外嵌类中的实例成员变量
A类
package p1;
public class A {
static String chy;
B b; //内部类声明对象
A(String a){ //外嵌类A带参数的构造方法
b=new B(10);
chy=a;
}
public void show(){
b.speak();
}
static class B{ //内部类声明为static,注意:非内部类不能是static
int h;
B(int h){ //内部类B带参数的构造方法
this.h=h;
}
void speak(){
System.out.println(chy+“是”+h);
}
}
}
主类
package p1;
public class p1 {
public static void main(String args[]){
A.B c=new A.B(20); //使用static内部类创建对象方式
c.speak();
}
}
//输出都是chy是20