内部类基础
成员内部类
public class demo{
int sign = 0;
class A{
}
}
例如,demo和A这两个类,A称为demo的成员内部类,demo为A的外部类
-
在成员内部类中,可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
-
如果成员内部类拥有和外部类相同名称的方法或是变量时,将会发生隐匿现象,即成员内部类使用的是自己的方法或者变量,如果要使用外部类的方法或者变量,必须使用
类名.this.方法名
或者
类名.this.变量名
- 如果外部类想要访问成员内部类的方法,并不能够直接调用,而是要先创建一个成员内部类的对象,用对象去引用
public class test {
int sign = 2;
private A getA(){
return new A();
}
public static void main(String[] args) {
test t = new test();
t.getA().test();
}
class A{
public void test(){
System.out.println(sign);
}
}
}
- 这里又涉及到外部类创建内部类对象的问题
其中一种方法是上面代码所示的创建方法
另一种如下:
test t = new test();
test.A a = t.new A();
- 内部成员类可以拥有private、protected、public
如果成员内部类A用private修饰,则只能在外部类的内部访问,
如果用public修饰,则任何地方都能访问;
如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;
如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。
局部内部类
class A{
}
public class demo{
public A getA(){ //内部类
class B extends A{
int word = 0;
}
return new B();
}
}
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
匿名内部类
匿名内部类用来写监听
scan_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
- 同样的,匿名内部类也是不能有访问修饰符和static修饰符的
- 匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法
内部类的好处
- 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
- 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
- 方便编写事件驱动程序
- 方便编写线程代码