内部类
在Java中,允许在一个类的内部定义类,这样的类称作内部类,内部类所在的类称作外部类。在实际开发中,根据内部类的位置、修饰符和定义方式的不同,内部类可分为4种,分别是成员内部类、局部内部类、静态内部类、匿名内部类。
1.成员内部类
在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。成员内部类可以访问外部类的所有成员。
案例
class Outer {
int m=0;
// 下面的代码定义了一个成员方法,方法中访问内部类
void test1(){
System.out.println("外部类成员方法");
}
// 下面的代码定义了一个成员内部类
class Inner {
int n = 1;
void show1() {
System.out.println("外部成员变量m=" + m);
}
void show2() {
// 在成员内部类的方法中访问外部类的成员变量
System.out.println("内部成员方法");
}
}
void test2(){
Inner inner=new Inner();
System.out.println("内部成员变量n="+inner.n);
inner.show2();
}
}
public class Example20 {
public static void main(String[] args) {
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.show1();
outer.test2();
}
}
如果想通过外部类访问内部类,则需要通过外部类创建内部类对象,创建内部类对象的具体语法格式如下:
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
2.局部内部类
局部内部类,也叫作方法内部类,是指定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,有效范围只限于方法内部。
在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中变量和方法却只能在所属方法中访问
案例
public class Outer {
int m = 0;
void test1() {
System.out.println("外部类成员方法");
}
void test2(){
class Inner {
int n = 1;
void show() {
System.out.println("外部成员变量m=" + m);
test1();
}
}
Inner inner=new Inner();
System.out.println("局部成员变量n="+inner.n);
inner.show();
}
}
public class Example21 {
public static void main(String[] args) {
Outer outer=new Outer();
outer.test2();
}
}
3.静态内部类
所谓静态内部类,就是使用static关键字修饰的成员内部类。与成员内部类相比,在形式上,静态内部类只是在内部类前增加了static关键字,但在功能上,静态内部类只能访问外部类的静态成员,通过外部类访问静态内部类成员时,可以跳过外部类直接访问静态内部类。
创建静态内部类对象的基本语法格式如下:
外部类名.静态内部类名 变量名 = new 外部类名().静态内部类名();
案例
class Outer {
static int m = 0; // 定义类的成员变量
// 下面的代码定义了一个静态内部类
static class Inner {
int n = 1;
void show() {
// 在静态内部类的方法中访问外部类的成员变量
System.out.println("外部静态变量m = " + m);
}
}
}
public class Example22 {
public static void main(String[] args) {
Outer.Inner inner=new Outer.Inner();
inner.show();
}
}
4.匿名内部类
匿名内部类是没有名称的内部类。在Java中调用某个方法时,如果该方法的参数是接口类型,除了可以传入一个接口实现类,还可以使用实现接口的匿名内部类作为参数,在匿名内部类中直接完成方法的实现。
创建匿名内部类的基本语法格式如下:
new 父接口(){
//匿名内部类实现部分
}
案例
interface Animal {
void shout();
}
public class Example23 {
public static void main(String[] args) {
String name="小花";
animalShout (new Animal(){
public void shout(){
System.out.println(name+"喵喵。。。");
}
});
}
public static void animalShout(Animal an) {
an.shout();
}
}
匿名类的编写步骤:
(1)在调用animalShout()方法时,在方法的参数位置写上new Animal(){},这相当于创建了一个实例对象,并将对象作为参数传给animalShout()方法。在new Animal()后面有一对大括号,表示创建的对象为Animal的子类实例,该子类是匿名的。具体代码如下所示:
animalShout(new Animal(){});
(2)在大括号中编写匿名子类的实现代码,具体如下所示:
animalShout(new Animal() {
public void shout() {
System.out.println("喵喵……");
}
});