代码小白第一天

79 阅读2分钟

内部类

一,成员内部类

写在成员位置的,属于外部类的成员

获取成员内部类对象的两种方式

一,当成员内部类被private修饰时。

在外部类编写方法,对外提供内部类对象

public class Outer{
  private class Inner{}
  public Inner getInstance(){
  return new Inner();
  }
}

在测试类用方法获取

Outer o = new Outer();
System.out.println(o.getInstance());
二当成员内部类被非私有修饰时。直接创建对象
Outer.Inner oi=new Outer().new Inner();

外部类成员变量和内部类成员变量重名是,在内部类如何访问

System.out.println(Outer.this.变量名);

二,静态内部类

静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象

创建静态内部类对象的格式: 外部类名.内部类名 对象名=new 外部类名.内部类名();

调用非静态方法的格式: 先创建对象,用对象调用

调用静态方法的格式: 外部类名.内部类名.方法名();

三,局部内部类

1.将内部类定义再方法里面的就叫做局部内部类,类似于方法里面的局部变量。(和局部变量类似,可以加final,但是不能用public)

public class Outer{
       public void  show(){
       public int a=10;
       class Inner{
       }
       }
}

2.外界无法直接使用局部内部类,需要在方法内部创建对象并使用。

3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

四,匿名内部类

本质是隐藏了名字的内部类

格式:
       new  类名或者接口名(){
       重写方法;
       };
new  Inter(){
    public void show(){
    重写方法
}
}

整体是大括号内没有名字类的对象,没有名字的类继承了Inter类,整体是Inter的子类对象

可以写在成员位置,也可以写在局部位置

使用场景

当方法的参数是接口或者是类时,

以接口为例,可以传递这个接口的实现类对象,

如果实现类只使用一次,就可以用匿名内部类简化代码。