内部类
一,成员内部类
写在成员位置的,属于外部类的成员
获取成员内部类对象的两种方式
一,当成员内部类被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的子类对象
可以写在成员位置,也可以写在局部位置
使用场景
当方法的参数是接口或者是类时,
以接口为例,可以传递这个接口的实现类对象,
如果实现类只使用一次,就可以用匿名内部类简化代码。