内部类以及方法的重载
1)内部类
1.内部类:定义在类里面的一个类
public class TestInnerClass {
public int a = 5;
//内部类
private class InnerClass {
private int f = 3;
private void test() {
private class InnerClass01 {
private void test() {
new InnerClass().test();
}
}
public void foo() {
InnerClass innerClass = new InnerClass();
innerClass.f = 4;
innerClass.test();
}
}
//普通的外部类
class C3 extends TestInnerClass{
}
2.关于内部类的一些说明
(1)内部类没有对外部类没有任何隐藏,也就是说,当内部类声明为private的访问控制权限时,它的外部类及其此类中另外的外部类,也可以调用其私有属性。
(2)内部类可以直接调用外部类的内容,但当外部类调用内部类的内容时,就必须先创建其对象。就好比,有外部类对象但是没有内部类对象,当内部类调用外部类的属性时,外部类则肯定有对象(看后面的外部类与内部类创建对象时的内存空间)。
(3)内部类与外部类是所属级别关系,内部类是外部类的所属。动态内部类创建对象和继承创建对象非常相似。先创建外部类对象再创建内部类对象,在上述public void foo() 方法中没有创建外部对象就直接创建内部对象是因为,上述方法是一个动态方法,动态方法有一个特点,是:动态方法调用的前提,就是此对象一定存在。
(4)当创建两个TestInnerClass的对象时,再分别创建两个InnerClass的对象时,两个InnerClass不是同一个类的对象,就是来自不同的类, 所以这两个类的类型就不一样。
(5)不能单独创建内部类对象,比如:InnerClass innerClass = new InnerClass(); 因为没有外部对象时,就不能知道内部类的内存有多大,无法划分内存。内部类是存在与对象之中的
(4)当创建外部类时,是利用外部类的模板创建的外部类,此时内部类还是一个模板。所以创建两个外部类对象时,两个内部类的对象来自不同的模板,所以两个内部类的类型不同。
反射的创建对象的过程:
Class<TestInnerClass> c = TestInnerClass.class;
TestInnerClass t = c.newInstancec();模板.新建一个实例()
其中TestInnerClass是自己创建的对象,第一句的意思是创建一个自己定义类的类模板对象,
第二句是调用类模板对 象创建出自己定义类的对象并开辟内存。
上图中,TestInnerClass.class 与InnerClass.class 分别是外部类与内部类的模板。
(5)当将内部类用static声明时,只要创建外部对象,就将内部类的模板引入。所以定义的方法为:外部类.内部类 对象名 = new 外部类.内部类(); 现在不创建外部类对象也能创建内部类对象,上述中的 new 是为内部类对象开辟内存空间。
下图为创建静态内部类对象的过程,与外部类对象没有任何关系。
(6)当内部类用static声明时,创建两个外部类对象,再用两个外部类分别创建内部类对象,这时两个内部类对象都来自于方法区的元数据区中的同一模板,所以这时这两个内部类对象为同一类型。