直接将一个类定义在另一个类的内部称之为内部类,相对于外部类来说,内部类就是一个该外部类的成员类,成员类如同成员变量与成员方法一样,可以被继承,覆盖。创建一个内部类需要先有一个外部类的实例对象,也可以:外部类.内部类 引用名 = new 外部类().new 内部类();
内部类可以被所有成员修饰符修饰。
如果内部类内有静态成员,那么内部类必须也要用静态修饰。
普通内部类可以直接访问外部类的所有属性和方法,如果内部类与外部类有重名成员可以使用(外部名点)限定。
静态内部类可以访问外部类的所有静态成员。
静态内部类中想要访问外部类的普通方法须要有一个外部类的实例对象:new 外部类().func();
外部类的可以通过(内部类名点)直接访问静态内部类的静态成员。
外部类的普通函数想要访问内部类的普通成员时,需要创建一个内部类的实例对象:new 内部类().func();
外部类的静态函数想要访问内部类的普通成员时,需要创建一个自身的对象还有一个内部类的实例对象:new 外部类().new 内部类().func();
用一句简单的总结来说:从外界来看有一个非静态内部类实例必须有一个外部类实例,静态必须遵守静态调用静态的原则,
内部类也可以被定义在成员方法内,但是不可以被成员修饰符修饰。除了只能访问所在方法体内的常量以外,其它访问权限同所在方法体一样,
匿名内部类:
Java中还定义了一种内部类的简写格式,称之为匿名内部类,定义的匿名内部类必须extends一个class或implements一个interface。
new出基类在其后紧跟一对大括号,在大括号内可以覆写基类的方法或定义自己的特有功能,然后通过结束大括号后的点运算符调用相应的方法或数据。格式如下:
static void demoAnonymityClass(){
//得到一个匿名内部类的匿名对象,并调用他的特有方法
new Object(){
//特有方法
void func(){
System.out.println("匿名内部类!");
}
}.func();
//还可以为匿名内部类的对象起个名字,用基类引用指向它
Object objSub = new Object(){
//覆盖方法
public String toString() {
return "匿名内部类!";
}
};
//使用这个名字可以继续操作匿名内部类的唯一对象,而且出了本函数后,只要名字不消失,依然可以继续使用
System.err.println(objSub.toString());
//拿到这个对象对应的类的名字看看,哦my god 名字好奇怪
String str = objSub.getClass().getName();
System.out.println(str);
}