当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服 务,那么这个整个内部的完整结构最好使用内部类。在 Java 中,可以将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
实例内部类
1. 如何获取 实例内部类的对象 OuterClass.InnerClass innerClass = outerClass.new InnerClass(); 2. 实例内部类当中 不能有静态的成员变量. 非要定义,那么只能是被static final修饰的 因为static是类加载的时候加载的,实例内部类是需要外部类的引用 3. 在实例内部类当中,如何访问外部类当中,相同的成员变量? 在实例内部类当中 获取外部类的this : OuterClass.this.data1
class OuterClass {
public int data1 = 1 ;
int data2 = 2;
public static int data3 = 3;
class InnerClass {
public int data1 = 111;
public int data4 = 4;
int data5 = 5;
public static final int data6 = 6; //error
public void func() {
System.out.println("InnerClass::func()");
System.out.println(OuterClass.this.data1);
System.out.println(this.data1);
System.out.println(data2);
System.out.println(data3);
System.out.println(data4);
System.out.println(data5);
System.out.println(data5);
System.out.println(data6);
}
}
public void test() {
//static final int c = 0;
System.out.println("OuterClass::test()");
InnerClass innerClass = new InnerClass();
innerClass.func();
//final int SIZE = 10;//定义常量,常量是在程序编译的时候
// 确定的,一旦初始化 就不能进行修改了。
//SIZE = 20;
}
}
public class Test5 {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.func();
}
}
【总结】
1.外部类中的任何成员都可以在实例内部类方法中直接访问
2.实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束
3.在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,那么必须:外部类名称.this.同名成员来访问
4.实例内部类对象必须在先有外部类对象前提下才能创建
5.实例内部类的非静态方法中包含了一个指向外部类对象的引用
6.外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象
静态内部类
如果不想依靠外部类对象来实例内部类对象,就可以定义为静态内部类
1. 如何获取静态内部类对象? OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2(); 2. 静态内部类当中,不能访问外部类的非静态成员。外部类的非静态成员, 需要通过外部类的对象的引用才能访问。 非要访问: OuterClass2 outerClass = new OuterClass2(); System.out.println(outerClass.data1);
class OuterClass2 {
public int data1 = 1;
int data2 = 2;
public static int data3 = 3;
public void test() {
System.out.println("out::test()");
}
static class InnerClass2 {
public int data4 = 4;
int data5 = 5;
public static int data6 = 6;
public void func() {
System.out.println("out::func()");
OuterClass2 outerClass = new OuterClass2();
System.out.println(outerClass.data1);
/*System.out.println(data1);
System.out.println(data2);*/
System.out.println(data3);
System.out.println(data4);
System.out.println(data5);
System.out.println(data5);
System.out.println(data6);
}
}
}
public class Test5 {
public static void main(String[] args) {
OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();
}
}
匿名内部类
class Person {
public int age;
public String name;
}
public class Test5 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.age);
System.out.println(person.name);
new Person();
System.out.println(new Person().age);//匿名对象
System.out.println(new Person().name);//匿名对象 只能使用一次
//匿名内部类
new Person(){
};
}
}