1.内部类
1.内部类的访问规则:
内部类可以直接访问外部类中的成员,包括私有。
外部类要访问内部类必须建立内部类对象。
2.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象(知道即可):外部类.内部类 变量名=new 外部类().new 内部类();
3.有同名变量在外部类,内部类,内部类函数中,那么在内部类函数中,直接访问的是函数中的变量,this.变量名访问的是内部类中的同名变量,外部类.this.变量名,访问的是外部类中的变量。
4.当内部类在成员位置上时可以被成员修饰符所修饰:比如private,将内部类在外部类中进行封装。还有static修饰:内部类就具备了静态的特性,当内部类被静态修饰后只能直接访问外部类中的static成员,出现了访问局限。
5.外部类的其他类怎么直接访问static内部类的非静态成员呢?
new 外部类名.内部类().成员();相当于先创建一个对象:对象.成员。
外部类的其他类,如何直接访问static内部类的静态成员呢?
外部类.内部类.成员();
6.当内部类中定义了静态成员,该内部类必须为static的。当外部类中的静态方法访问内部类方法时,内部类方法也必须是静态的。
7.当描述事物时。事物的内部还有事物,那么该事物用内部类来描述,因为内部事物在使用外部事物的内容。
8.如果内部类定义在外部类的局部上,那么内部类中的函数不能被static修饰(因为如果被static修饰,那儿内部类也被static修饰,但static不能修饰局部)
9.定义在局部的内部类不可以被成员修饰符修饰,可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量(如内部类定义在一个函数中,然后函数中定义了内部类,函数中还有一个局部变量),只能访问被final修饰的局部变量。
2.匿名内部类
1.匿名内部类其实就是内部类的简写格式。
2.定义匿名内部类的前提:
内部类必须是继承一个类或者实现接口。(如果没有父类没有接口还能使用匿名内部类吗?答案是可以。因为还有默认继承object,但是不能建立多态引用,因为object中不一定有你要调用的方法)
3.匿名内部类的格式:new 父类或者接口(){定义子类的内容,实现父类方法}。(这个格式为父类型的子类对象,是一个对象,对象,对象)
4.其实匿名内部类就是一个匿名子类对象。所以调用子类对象的方法为:new 父类或者接口(){定义子类的内容,实现父类方法}.方法名();(且一个匿名对象只能调用一个方法)。
5.若要调用多个方法,那么我们用多态来实现:父类 对象名=new 父类或者接口(){定义子类的内容,实现父类方法};对象名.方法名();注意:因为多态的存在,所以对象名不能调用父类中没有的方法,编译失败。
6.匿名内部类中定义的方法最好不要超过3个,1个或者2个。
7.8.什么时候使用匿名内部类?当你需要调用一个方法,这个方法的参数类型是一个接口类型,该接口内的方法不超过3个的时候,那么可以定义一个匿名内部类,将该匿名内部类作为一个参数传递进去。