内部类:把一个类定义到另外一个类的内部,在类里面的这个类就叫内部类,外面的类就叫外部类。
作用:
1.封装性:隐藏你不想让别人知道的操作
2.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
3.方便编写事件驱动程序
4.方便编写线程代码
5.在能实现功能的情况下,为了节省编译后产生的字节码(内部类可以减少字节码文件,即java文件编译后的.class文件)
内部类:静态内部类,成员内部类,局部内部类,匿名内部类
1.静态内部类
指被声明为static的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外部类,从而实例化。静态内部类不可以有与外部类有相 同的类名。不能访问外部类的普通成员变量,但是可以访问静态成员变量和静态方法(包括私有类型)
2.成员内部类
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员
public class OutClass {
public void test1() { }
class InnerClass {
//成员内部类
private String testStrInner = "";
private void testInner() {
test1(); //成员内部类可以访问外部类所有的属性和方法。静态方法直接访问。
}
}
}
3.局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
public class Animal {
public static void bellow() {
String bellowStr = "动物吼叫";
System.out.println(bellowStr);
final class Dog {
//局部内部类
String dogBellowStr = bellowStr + ";狗 :汪汪汪";
public void dogBellow() {
System.out.println(dogBellowStr);
}
}
}
}
4.匿名内部类
匿名内部类就是没有名字的内部类
//父类 Animal
public class Animal {
public void bellow() {
//动物吼叫的类型
System.out.println("动物吼叫");
}
}
class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
demo.getDogBellow(new Animal(){
//匿名内部类,重写父类方法。当然接口也是一样
@Override
public void bellow() {
System.out.println("狗 汪汪汪。。。。");
}
});
}
public void getDogBellow(Animal animal){
animal.bellow();
}
}