概念
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
注意:
1. 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部
2. 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件
分类
实例内部类
即未被static修饰的成员内部类。
class OuterClass{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
class InnerClass{
public int data4 = 4;
private int data5 = 5;
//public static int data6 = 6;
public InnerClass(){
System.out.println("实例内部类的构造方法!");
}
public void innerFunc(){
System.out.println("实例内部类的普通方法");
System.out.println(this.data1);
System.out.println("外部类的"+OuterClass.this.data1);
}
}
}
public class test {
public static void main(String[] args) {
OuterClass out = new OuterClass();
OuterClass.InnerClass innerClass = out.new InnerClass();
}
}
如何实例化内部类?
如果按照先学的知识,实例化因该是“InnerClass innerClass = new InnerClass();”会报错。那要怎么做呢?首先内部类要被调用必须先实例化外部类。先要有外部类的对象再用外部类的对象来调用内部类,就可以实例化了。即为“外部类类名.内部类 变量 = 外部类引用.new 内部类”很多教材会把我上述的两行写成一行:OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();是一样的,不过我个人觉得两行表示更清楚。
实例内部类当中,不能定义静态的成员方法?
其实也可以定义。不过这个静态的成员因该是final修饰的。如上面第九行代码因改为public static final int data6 = 6;
实例内部类当中,不能定义静态的成员变量?
真的不行。不要问为什么,语法。
如何访问实力内部类和外部类的同名的成员变量?
“外部类类名.this.成员“来进行访问。你可以理解为:实例内部类当中,包含外部类的this。所以他不仅仅有内部类的this,还有外部类的this。所以直接用“this.外部类的成员变量”是行不通的。(如果是静态的直接用外部类类名来访问)(同名的情况下在实例内部类方法中访问同名的成员时,优先访问自己的 )
外部类中的任何成员都可以被在实例内部类方法中直接访问 。
静态内部类
即被static修饰的内部成员类称为静态内部类。
public class OutClass {
private int a;
static int b;
public void methodA(){
a = 10;
System.out.println(a);
}
public static void methodB(){
System.out.println(b);
}
static class InnerClass{
public void methodInner(){
b =200;
methodB();
}
}
public static void main(String[] args) {
OutClass.InnerClass innerClass = new OutClass.InnerClass();
innerClass.methodInner();
}
}
如何拿到静态内部类的对象?
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();他不需要外部类对象的引用。能比实例内部类少一个外部类对象。
不能在静态内部类中,直接访问外部类非静态的数据成员
就是不能只能访问静态的。如果你非要访问就在内部类实例化个对象呗。
匿名内部类
后序讲接口时给大家详细介绍。
局部内部类
定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少