我们为什么需要内部类?
我基本没接触到内部类的实际使用,是我孤陋寡闻了。据说匿名内部类在Android开发中用的比较多。但既然是Java支持的基础编程语法,还是要先了解一下的,万一哪天就用上了,或者是去做安卓开发了呢。
我对内部类的研究甚少,这篇文章目前只对四中内部类做了应用实例,关于java内部类详解,可以阅读该文章:《Java内部类详解》。我的这篇文章会在我对内部类有了更深的、自己的理解后,进行更新。
实例内部类
直接定义在类中的一个类,在类前无修饰符。且在内部类当中,不能有静态成员。基本概念就不多说了,直接通过实例,了解一下用法:
class Outter{
private int a = 10; // 注意,是private
public class Inner{
int a = 20;
void show() {
int a = 30;
System.out.println("访问外部类的a:"+Outter.this.a); // 内部类可以直接访问外部类的private成员
System.out.println("访问内部类的a:"+this.a);
System.out.println("访问局部变量的a:"+a);
}
}
}
public class Test{
public static void main(String[] args) {
Outter outter = new Outter();
Outter.Inner inner = outter.new Inner(); // 内部类依赖于外部类,需要通过外部类创建
inner.show();
}
}
-----------------------------------------------------
输出结果:
访问外部类的a:10
访问内部类的a:20
访问局部变量的a:30
静态内部类
用static修饰的内部类,称为静态内部类。要理解静态内部类,首先得理解《static关键字》
来个实例:
class Outter{
private int a = 10;
static class Inner{
int a = 20;
void show() {
int a = 30;
//System.out.println("访问外部类的a:"+Outter.this.a); // 内部类是静态的,有静态内部类实例时并不一定有外部类变量实例,所以静态内部类不能访问外部类。
System.out.println("访问内部类的a:"+this.a);
System.out.println("访问局部变量的a:"+a);
}
}
}
public class Test{
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner(); // 静态static,就可以直接通过类名使用
inner.show();
}
}
---------------------------------------------------------------
输出结果:
访问内部类的a:20
访问局部变量的a:30
局部内部类
定义在方法中的内部类,称为局部内部类。来个实例:
class Outter{
private int a = 10;
void show(){
int a = 20;
System.out.println("Outter");
System.out.println("访问外部类的局部变量的a:"+a);
class Inner{ // 定义在方法中的内部类,作用域只在show方法中
int a = 30;
void show(){
int a = 40;
System.out.println("Inner");
System.out.println("访问外部类的a:"+Outter.this.a);
System.out.println("访问内部类的a:"+this.a);
System.out.println("访问内部类的局部变量的a:"+a);
}
}
Inner inner = new Inner(); // 在外部类的show方法中创建局部内部类
inner.show();
}
}
public class Test{
public static void main(String[] args) {
Outter outter = new Outter(); // 只能创建外部内,无法在这里创建内部类
outter.show();
}
}
--------------------------------------------------------------------------
输出结果:
Outter
访问外部类的局部变量的a:20
Inner
访问外部类的a:10
访问内部类的a:30
访问内部类的局部变量的a:40
匿名内部类
匿名内部类是一种特殊的局部内部类,没有构造器。来个实例:
interface A {
void test();
}
class B {
public void test(A a) {
a.test(); // 调用传入的,匿名内部类的实例化对象,的test方法
System.out.println("Word");
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.test(new A() { // A 是一个接口,不能直接new,这里就是定义了一个匿名类,得以new出实例化对象
@Override
public void test() {
System.out.println("Hello");
}
});
}
}
----------------------------------------------------------
输出结果:
Hello
Word