内部类

概述

内部类是定义在另一个类中的类。

为什么使用内部类

  • 内部类方法可以访问该类定义所在的作用域的数据,包括私有的数据。
  • 内部类可以对同一个包中的其它类隐藏起来。
  • 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

公有/私有内部类

  • 内部类可以访问创建它的外围类对象的数据域
  • 内部类可以声明为私有的
  • 内部类中声明的所有静态域都必须是final
  • 非静态内部类中不可以有静态变量和静态方法。(因为静态方法只能访问外围类的静态域和方法,得不偿失)
  • OuterClass.this用来屏蔽内部类和外部相同的变量名

语法

public Class Main
{
  // methods and data
  public Class InnerClass
 { 
   // methods and data
 }

 private Class InnerClassPrivate
 { 
   // methods and data
 }
}

局部内部类

当一个内部类只在一个方法中创建对象,可以在这个方法中定义局部类代替。

  • 局部类不能有public和private访问说明进行声明,它的作用域被限定在声明这个局部类的块中。
  • 除了该方法外,没有任何方法知道该类的存在。
  • 可以使用该方法的局部变量。

语法

public Class Main
{
  // methods and data
  public void Start()
 { 
   Class InnerClass
   {
    // methods and data
   }
   InnerClass innerClass = new InnerClass();
 }
}

匿名内部类

将局部类的使用再深入一步,假设只创建该类的一个对象,就不必命名了。这种类被称为匿名内部类。

  • 匿名类没有构造器,构造参数可以传递给超类的构造器
  • 事件监听和回调最好还是用lamda表达式

语法

public Class Main
{
  // methods and data
  public void Start()
 { 
   // 继承超类
    SuperClass superClass = new SuperType(construction parameters)
    {
       inner class methods and data
    };
    // 实现接口
    InterfaceClass interfaceClass = new InterfaceType()
    {
      methods and data
    };
 }
}

静态内部类

如果只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类对象,那么可以将内部类声明为static。

  • 可以有静态域和方法

语法

public Class Main
{
  // methods and data
  public staic Class InnerStaticClass
 { 
   // methods and data
 }

 private static Class InnerStaticClassPrivate
 { 
   // methods and data
 }
}
posted @ 2020-11-22 16:45  迷思t无  阅读(108)  评论(0)    收藏  举报