内部类、匿名类

内部类即类或者方法内定义的类,根据位置的不同可分为成员内部类、局部内部类

成员内部类

定义于类中

Class A{
  //这里B就是成员内部类   Class B{   } }

如何访问成员内部类?

格式: 外部类名.内部类名 对象名= 外部对象.内部对象

这里即: A.B b= new A().B()

实际使用中常将内部类设为私有,通过外部类来间接调用/访问内部类的方法和变量。

Class A{
  Private Class B{
    public void show(){
      System.out.println("B");
    }
  }
//间接
public void visitB(){ B b= new B(); b.show(); } } public class aaa { public static void main(String[]args) { A a=new A(); a.visitB(); } }

当成员内部类为静态

注意: 静态成员内部类访问访问外部类成员时,只能访问静态成员(方法和变量)

关于内部类与外部有同名变量时的访问问题

class Outer {
    public int num = 10;
    class Inner {
        public int num = 20;
        public void show() {
            int num = 30;
            //三个变量对应的变量名相同
            //访问的是本方法中的num变量,满足就近原则
            System.out.println(num);
            //通过this变量,访问方法外,本类中的变量,this代表Inner类对象
            //这里Inner.this同this            
System.out.println(this.num); //通过外部类名加this,返回外部类对象,访问对象外部类的num System.out.println(Outer.this.num); } } } public class niming { public static void main(String[]args) { Outer.Inner inner=new Outer().new Inner(); inner.show(); } }

------------------------------------------------------------------------------------------------------------------------------------------------

局部内部类

定义于方法或作用域中的类

备注: 局部内部类当然也是处于某个类或接口中,因为方法得处于类或接口中。

特性: 局部内部类可访问final或static类型的外部类成员

详情可见: https://blog.csdn.net/u014745069/article/details/80210288

------------------------------------------------------------------------------------------------------------------------------------------------

另外,与定义位置无关,有种特殊的内部类,称为:

匿名内部类

定义: 继承了某个类或实现了某接口的匿名类,用 new 类名 或 new 接口名 的格式创建

备注: 我们创建匿名类的同时也创建了一个匿名类实例,不需要class关键字。

特性: 

1.  匿名类不能是abstract

2. 匿名类隐式final

3. 匿名类不能是static

eg: 

A hello = new A() {  
    public void run() {  
        System.out.println("hello");  
    }  
};

个人理解:本质上就是创建A的实例并覆盖、实现其中的方法

访问权限:

1. 访问外层Class里面的字段。
2. 不能访问外层方法中的本地变量。除非变量是final。
3. 如果内部类的名称和外面能访问的名称相同,则会把名称覆盖掉。
4. 不能定义静态初始化代码块
5. 不能在匿名类里面定义接口
6. 不能在匿名类中定义构造函数