实际开发过程中,经常使用到内部类。每次遇到也没有及时的总结,导致不断的遗忘。为此记录下Java内部类相关知识。
疑问列表:
- 什么是内部类?
- 内部类分为几种?每种内部类的形式特点?如何使用?
- 内部类有什么优点?为什么要使用内部类?
- 内部类相关的几个问题。
一、内部类定义:
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。
二、内部类分类:
1、成员内部类
成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:
public class Canvas {
private String size;
private int color;
public Canvas(String size) {
this.size = size;
}
private void setColor(int color) {
this.color = color;
}
class Paint {// 成员内部类
private String size;
public void printSize() {
// 调用外部类 成员变量
System.out.println(color);
// 调用外部类 同名成员变量
System.out.println(Canvas.this.size);
// 调用外部类 成员方法
setColor(2);
}
}
}
使用方式:
public static void main(String[] args) {
Canvas canvas = new Canvas("12");
Canvas.Paint paint = canvas.new Paint();
}
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。我个人是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。
2、局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
class People{
public People() {
}
}
class Man{
public Man(){
}
public People getWoman(){
class Woman extends People{ //局部内部类
int age =0;
}
return new Woman();
}
}
局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的
3、匿名内部类
匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。
scan_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
history_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
使用到的匿名内部类
new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
}
4、静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner();
}
}
class Outter {
public Outter() {
}
static class Inner {
public Inner() {
}
}
}
1、创建静态内部类对象的一般形式为: 外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()
2、创建成员内部类对象的一般形式为: 外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()
三、内部类的优点
- 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
- 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
- 方便编写事件驱动程序
- 方便编写线程代码
参考文档:
https://www.cnblogs.com/dolphin0520/p/3811445.html