内部类概述
内部类:就是在一个A类中定义一个B类,那么类B就被称为内部类
格式:
public class 类名{
修饰符 class 类名{}
}
范例:
public class Outer{
public class Inter{
}
}
内部类访问特点
- 内部类可以直接访问外部类成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
按照内部类在类中定义的位置不同,可以分为如下两种形式
-
在类的成员位置:成员内部类
-
在类的局部位置:局部内部类
成员内部类
1、public修饰内部类(不常见)
- 在外部类(A类)里面可以直接创建内部类(B类)的对象
- 在外部类(A类)外面创建内部类(B类)对象需要使用格式:
外部类名.内部类名 对象名 = 外部类对象.内部类对象
范例:Outer.Inter io =new Outer().new Inter();
2、private修饰内部类
一般情况下,定义内部类是不想外界可以访问到,所以内部类一般都用private修饰,那么上面定义对象的访问方法就很少用到了,所以一般会在内部类中定义一个方法去访问内部类,然后通过创建外部类的对象去调用方法来访问内部类,达到间接访问的目的。
局部内部类
局部内部类就是在方法中定义的类,所以外界是无法直接使用的,需要在方法内部创建对象并使用该类可有直接访问到外部类的成员,也可以访问方法内的局部变量
匿名内部类(局部内部类的一种形式)
前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类
格式:
new 类名或者接口名(){
重写方法;
};
范例:
new inter(){
public void show(){
}
};
new的作用是创建对象,但是这个对象是没有名字的,所以叫匿名,那么匿名内部类的本质就是一个继承了该类或者实现了该接口的子类匿名对象
那么前面说到接口、抽象类不能被实例化,这里为什么又可以了呢?
不能被实例化的主要原因是由于其被定义为抽象,但是在这里我们重写这个抽象的方法,使其可以被实例化。
至于抽象类,由于其本身可以包含抽象方法和非抽象方法,但是我们在重写的时候必须重写所有的抽象方法后才能实例化。
这里我联想到了前面的继承、多态,如果继承一个抽象类的话需要对其进行重写操作,这样才能使用这个类进行对象的创建,而这里的只不过是把继承的这一步省略了,直接对其进行重写,来使用。