java内部类总结
一.内部类的种类
1.成员内部类
是最普通的内部类,定义在另一个类的内部。如下所示:
class
Outer{
int
i=
0
;
public
Outer(
int
i) {
this
.i= i;
}
class
Inner{
//内部类
public
void
doSomething() {
System.out.println(
"doSomething"
);
}
}
}
class
Outer{
private int
i=
0
;
public static int j=0;
public
Outer(
int
i) {
this
.i= i;
}
class
Inner{
//内部类
public
void
doSomething() {
System.out.println(
i
);
System.out.println(
j
);
}
}
}
当内部类和外部类拥有相同名称的方法或变量时,默认使用的是内部类当中的,要使用外部类的成员需要用:Outer.this.i这种形式。在外部类如果想要访问内部类的成员,必须先创建一个内部类对象,再通过这个对象来进行访问。
成员内部类依托于外部类,所以创建成员内部类对象必须先创建外部类,如下所示:
Outter outter =
new
Outter();
Outter.Inner inner = outter.
new
Inner();
成员内部类可以想其它成员属性一样拥有四种访问权限。
2.局部内部类
定义在方法当中或者某个作用域内,和成员内部类的不同是其访问权限也仅限于此方法或作用域中。如下所示:
class
People{
public
People() {
}
}
class
Man{
public
Man(){
}
public
People getWoman(){
class
Woman
extends
People{
//局部内部类
int
age =
0
;
}
return
new
Woman();
}
}
3.匿名内部类
没有名称的内部类,需要特别注意的地方有:
(1)匿名内部类没有访问修饰符。
(2)匿名内部类必须继承一个抽象类或者实现一个接口。
(3)匿名内部类不能存在任何的静态成员和方法。
(4)因为没有名称,所以没有构造方法。
以下为匿名内部类的示例:
public class Button {
public void onClick(){
new ClickListener() {
@Override
public void Action() {
// TODO Auto-generated method stub
System.out.println("调用button按钮");
}
}.Action();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Button bt = new Button();
bt.onClick();
}
public interface ClickListener{
public void Action();
}
}
4.静态内部类
在内部类前加一个static修饰就是静态内部类,和普通内部类不同的是,静态内部类和静态属性,静态方法一样不需要依赖外部类。并且静态内部类不能使用外部类的非静态变量或方法,因为静态内部类创建不需要外部类,而非静态变量或方法创建则需要外部类,所以在没有创建外部类的情况下,静态内部类就不能使用外部类的非静态变量或方法。
二.内部类使用场景和好处
1.内部类可以独立继承接口,无论外部类是否继承某一个接口。
2.更好的封装,只有外部类能够访问内部类。
3.方便写事件驱动程序和线程。