内部类、匿名内部类、静态内部类
一、内部类(内置类、嵌套类)
1、内部类的访问规则:内部类可以直接访问外部类的成员,包括私有(private)。
之所以内部类可以直接访问外部类的成员,是应为内部类中持有了一个外部类的引用:外部类名.this
2、外部类要访问内部类就必须要建立内部类对象。
3、其他类要访问内部类中的方法有两种方式:
1)、当外部类能访问到内部类的时候,使用外部类的对象名进行访问。
2)、new一个内部类的对象:外部类名.内部类名 x = new 外部类名().new 内部类名()
4、内部类定义在外部类的成员位置上,就可以被成员修饰符所修饰:private、static、等。
1)、被private修饰: 此内部类就只能被其外部类建立对象 和 访问(在外部类中进行了封装)。
2)、被static修饰:就成为了静态内部类(下文详讲)。
二、静态内部类(被static修饰)
1、当内部类被static修饰后,就只能访问外部类中的静态成员了。
2、其他类如何访问静态类:
1)、当要访问静态类中的非静态成员时:new 外部类名.内部类名().内部方法名()
new Outer.Inner().function()
2)、当要访问静态类中的静态成员时 :外部类名.内部类名.内部方法名()
Outer.Inner.function()
注意:当内部类中定义了静态(static )成员,那么 该内部类就必须是静态(static)的。
当外部类中的静态(static)方法访问内部类时, 内部类也必须是静态(static )的。
三、使用条件
当我们要描述的事物内部还有事物的时候,该事物用内部类来形容。 因为该内部事物在使用外部事物的内容。
四、当内部类定义在局部时
1、因为不是在成员位置上,所以不能被成员修饰符所修饰(static、public等)
2、还是可以直接访问外部类的成员,因为他还是持有外部类中的引用 : 外部类名.this
但是他不能访问他所在局部的局部变量,但是可以被final修饰的局部变量。
五、匿名内部类:
1、匿名内部类其实就是内部类的简写格式。
2、定义匿名内部类的前提:
内部类必须是继承一个类,或者实现接口。 (内部类可以继承外部其它类或者实现外部的接口)
(举例:人的类里有一个人的心脏的类,人的心脏类可以继承自一个动物的心脏的抽象类)
3、直接new一个以其父类或者接口名() 加大括号 复写其方法 的 子类对象, 后面直接加 . 来调用其方法
父类或者接口名(){复写的子类内容}.复写的方法
(直接在每个调用方法中做这个定义并调用,每次定义只能实现一次性调用)
总结:匿名内部类其实就是一个匿名的子类的对象。
4、匿名内部类中的方法不要超过3个,否则阅读性会比较差。
匿名内部类中最好只要复写父类方法,不要定义新的方法,此举一般无意义
因为:如果要给匿名内部类命名,就只能命一个父类的名字,因为多态的原因,其不能调用子类方法(无法定义子类名)。