内部类
内部类的作用:
1.内部类提供了更好的封装,可以吧内部类隐藏在外部类里面,不允许同一个包中的其他类访问该类;
2.内部类可以直接访问外部类的私有数据,但外部类不能访问内部类的实现细节;
内部类的分类
1.非静态内部类(无static修饰)
1.非静态内部类中不可以定义静态属性,静态方法,静态代码块;
2.若要在非静态内部类中查找一个变量,查找的顺序是:
该内部类的方法内是否存在----->该内部类中是否存在----->该内部类的外部类中是否存在;
3.如果非静态内部类的变量名和外部类一样,可以用this作为区分;
4.外部类不允许直接访问非静态内部类成员,必须要创建非静态内部类对象来调用其要访问的成员(内部类对象必须寄存在外部类对象中);
5.不允许在外部类的静态成员中使用非静态内部类(静态成员不可以访问非静态成员)
6.非静态内部类可以使用任意的访问控制符。
2.静态内部类(有static修饰)
1.静态内部类中可以定义静态属性,静态方法,静态代码块和非静态成员;
2.静态内部类只能访问外部类的静态方法,即使是静态内部类的实例方法,也不可以访问外部类的非静态成员;
3.外部类不允许直接访问静态内部类成员,但可以使用静态内部类名来调用其内部静态成员或者使用静态内部类对象来调用其内部非静态成员;
public class OutClass{
//这是一个静态内部类
static class InClass{
private int i=9;
private static int j=6;
}
//这是外部类的一个方法
public void test(){
//调用静态内部类的静态方法
System.out.println(InClass().j);
//调用静态内部类的非静态方法
System.out.println(new InClass().j);
}
4.接口中的内部类只能是静态内部类;
3.局部内部类(把内部类放在方法中定义)
1.局部内部类只在外部类的方法中有效,不能使用访问控制符和static修饰;
2.注意局部内部类的适用范围;
public class OutClass{
public static void main (String[] args){
//这是一个局部内部类
class InClass{
int i;
}
//创建局部内部类对象
InClass in = new InClass();
in.i = 3;
System.out.println(in.i);
}
}
4.匿名内部类(适用于只使用一次的类)
1.基本定义:匿名内部类必须继承一个父类或者实现一个接口,但二者只能选其一;
2.匿名内部类无需class关键字而是在定义匿名内部类时直接定义它的对象;
3.匿名内部类不能显示的创建构造器,但可以有构造代码块;
基本代码如下:
//定义一个接口
public interface Fruit{
public String getName();
}
public class OutClass{
public void Test(Fruit f){
System.out.println(f.getName());
public static void main (String[] args){
//创建这个类的对象
OutClass ot = new OutClass();
//调用这个类中的方法,并创建一个匿名内部类
ot.Test(new Fruit(){
public String getName(){
return "苹果";
});
}
}
在以上的代码中
new Fruit(){
public String getName(){
return “苹果”;
}
就是一个匿名内部类,由于匿名内部类不可以是抽象的,所以接口中的方法要全部实现,如果继承的父类是抽象的,那么也要实现父类所有的抽象方法。