1. 内部类
首先要了解什么是内部类,它是怎么定义的?查了一些资料,它是如下这么定义的。
定义:内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可以为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。
我认为使用内部类最主要的原因是:它可以提供继承多个具体的或抽象的类,有效的实现了“多重继承”。
根据位置的不同,java中的内部类分为四种:
<1>静态内部类<2>成员内部类
<3>局部内部类
<4>匿名内部类
【1】静态内部类
简单的说:将内部类申明为static,不能与外部类有相同的名字。
只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
静态内部类演示:
public class StaticInner {
int b = 5;
private static int a = 4;
// 静态内部类
public static class Inner {
public void test() {
// 静态内部类可以访问外部类的静态成员
// 并且它只能访问静态的
System.out.println(a);
//System.out.println(a + b);//编译异常
}
}
}
StaticInner.Inner inner = new StaticInner.Inner();
inner.test();
【2】成员
内部类
成员内部类作为外部的一个成员存在,与外部类的属性,方法并列,不用static修饰。
它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。
在外部类里面创建成员内部类的实例:
this.new Innerclass();
在外部类之外创建内部类的实例:
(new Outerclass()).new Innerclass();
在内部类里访问外部类的成员:
Outerclass.this.member
成员内部类演示:
public class Outer {
int b = 5;
private int a = 4;
// 静态内部类
public class Inner {
private int a = 8;
public void test() {
// 直接访问外部类对象
System.out.println(b);
System.out.println(a);// 直接访问a,则访问的是内部类里的a
// 如何访问到外部类里的a呢?
System.out.println(Outer.this.a);
}
}
}
//先创建外部类,再创建内部类
Outer.Inner inner = new Outer().new Inner();
inner.test();
输出结果:
5
4
8
【3】局部
内部类
局部内部类像局部变量一样,不能被public, protected, private和static修饰,只能访问方法中定义的final类型的局部变量。
public class Outer {
int a = 1;
public void doSomething() {
int b = 2;
final int c = 3;
// 定义一个局部内部类
class Inner3 {
public void test() {
System.out.println(a);
// 不可以访问非final的局部变量
// System.out.println(b);
// 可以访问final变量
System.out.println(c);
}
}
// 创建局部内部类的实例并调用方法
new Inner3().test();
}
}
【4】匿名
内部类
简单的说:匿名内部类就是没有名字的类。
使用匿名内部类的情况:
1、只用到类的一个实例
2、类在定义后马上用到
3、类非常小
使用匿名内部类的主要原则:
1、匿名内部类不能有构造方法
2、匿名内部类不能定义任何静态成员、方法和类
3、只能创建匿名内部类的一个实例
4、一个匿名内部类一定在new的后面
匿名内部类演示:
public class Test {
public static void main(String[] args) {
// 匿名内部类new Inner(){}是Inner的继承,并同时实例化
//类体中可以声明大部分类的功能
Inner inner = new Inner() {
public String toString() {
return "Hello World!";
}
};
System.out.println(inner);
}
}
class Inner {
}
匿名内部类可以继承(实现)抽象类、接口
public class Test {
public static void main(String[] args) {
final int a = 1212;
// 匿名类可以从类继承匿名类
// 还可以重抽象类,接口继承,实现匿名类
Inner inner = new Inner() {
@Override
public int add() {
// TODO Auto-generated method stub
return a + 2013;
}
};
System.out.println(inner.add());
}
}
interface Inner {
int add();
}
匿名内部类是一种特殊的局部内部类。