a- 12、内部类
- 定义:
- 将一个类定义在另一个类内部,里面的那个类就成为内部类。
- 访问特点:
- 内部类可以直接访问外部类中的成员,包括私有成员
- 外部类要访问内部类的成员必须建立内部类的对象
- 内部类的位置:
- 内部类定义在成员位置上,可以被private、 static成员修饰符修饰。 被static修饰的内部类只能访问外部类中
- 的静态成员。
-
- 如果内部类是静态的,内部类成员也是静态的,可以不用创建内部类对象,直接调用。
- 事实上,内部类含有静态成员时,内部类必须声明为静态类
- ————————————————————————————————————————————————————————————————————
- class InnerDemo{
- public static void main(String[] args) {
- new Outer().new Inner1().show();
- Outer.Inner.show();//内部类为静态,且成员也是静态时,可直接通过类名访问
- }
- }
- class Outer{
- private int num = 8;
- private static String str = "Outer static argument";
- public void show(){
- System.out.println("Outer show()");
- }
- class Inner1{ //内部类
- public void show(){
- System.out.println("Inner1 show(),num = "+num+".."+str);
- }public
- }
- static class Inner{ //有静态成员时,必须声明为静态类
- public static void show(){
- System.out.println("Inner static show(),num = "+str);
- }
- }
- }
- 输出结果:
- Inner1 show(),num = 8..Outer static argument
- Inner static show(),num = Outer static argument
- ————————————————————————————————————————————————————————————————————
- PS:
- 1、 如果内部类中定义了静态成员,该内部类也必须是静态的
- 2、 为什么内部类能直接访问外部类中的成员呢?
- 那是因为内部类持有了外部类的引用,外部类名.this。
- 3、 内部类定义在局部位置上,也可以直接访问外部类中的成员。
- 同时可以访问所在局部中的局部变量,但必须是被final修饰的。
- 加final后,局部变量变为常量,存储在常量池,生命周期不会再随方法调用结束而消失
- 所以可以被访问。
-
- 13、匿名内部类
- 定义:
- 就是内部类的简化写法。
- 前提:
- 内部类可以继承或实现一个外部类或者接口。
- 格式:
- new 外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。 )}
- 简单理解:
- 就是建立一个带内容的外部类或者接口的子类匿名对象。
- 什么时候使用匿名内部类呢?
- 通常使用方法是接口类型参数,并且该接口中的方法不超过三个,可以将匿名内部类作为参数传递。
- 好处:
- 增强阅读性。
-
- //匿名内部类
- interface Inter{
- public abstract void show();
- }
- class Outer{
- public void method(){
- Inter in = new Inter(){//变量in只是引用变量,指向了一个匿名的内部类实例
- @Override
- public void show() {
- System.out.println(".... show .....");
- }
- };
- in.show();
- }
- }
- public class InnerDemo{
- public static void main(String[] args) {
- new Outer().method();
- }
- }
- //输出结果:
- //.... show .....
复制代码
|
|