【面试题】内部类有哪些

在Java语言中,可以把一个类定义到另一个类的内部,在类里面的这个类就叫做内部类,外面的类叫做外部类。在这种情况下,这个内部类可以被看作外部类的一个成员(与类的属性和方法类似)。还有一种类被称为顶层(top-level)类,指的是类定义代码不嵌套在其他定义中的类。

需要注意的是,嵌套类(Nested Class)与内部类(Inner Class)类似,只是嵌套类是C++的说法,而内部类是Java的说法而已。内部类可以分为很多种,主要有以下4种:

  • 静态内部类(static inner class)
  • 成员内部类(member inner class)
  • 局部内部类(local inner class)
  • 匿名内部类(anonymous inner class)

它们的定义如下:

class outerClass{
	static class innerClass{}	//静态内部类
}
class outerClass{
	class innerClass{}	//成员内部类(普通内部类)
}
class outerClass{
	public void memberFunction(){
		class innerClass{}	//局部内部类
	}
}
public class MyFrame extends Frame {	//外部类
	public MyFrame(){
		addWindowListener(new WindowAdapter(){	//匿名内部类
			public void windowClosing(WindowEvent e){
				dispose();
				System.exit(0);
			}
		});
	}
}

静态内部类是指被声明为static的内部类,它可以不依赖于外部类实例而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员变量和静态方法(包括私有类型)。

一个静态内部类,如果去掉“static”关键字,就成为成员内部类。成员内部类为非静态内部类,它可以自由地引用外部类的属性和方法,无论这些属性和方法是静态的还是非静态的。但是它与一个实例绑定在了一起,不可以定义静态的属性和方法。只有在外部的类被实例化后,这个内部类才能被实例化。需要注意的是,非静态内部类中不能有静态成员。

局部内部类指的是定义在一个代码块内的类,它的作用范围为其所在的代码块,是内部类中最少使用到的一种类型。局部内部类像局部变量一样,不能被public、protected、private以及static修饰,只能访问方法中定义为final类型的局部变量。对一个静态内部类,去掉其声明中的“static”关键字,将其定义移入其外部类的静态方法或静态初始化代码段中,就成为了局部静态内部类。对一个成员类,将其定义移入其外部类的实例方法或实例初始化代码中,就成为了局部内部类。局部静态内部类与静态内部类的基本特性相同。局部内部类与内部类的基本特性相同。

匿名内部类是一种没有类名的内部类,不使用关键字class、extends、implements,没有构造函数,它必须继承其他类或实现其它接口。匿名内部类的好处是代码更加简洁、紧凑,但带来的问题是易读性下降。它一般应用于GUI(Graphical User Interface,图形用户界面)编程中实现时间处理等。在使用匿名内部类时,需要牢记以下几个原则:

  • 匿名内部类不能有构造函数;
  • 匿名内部类不能定义静态成员、方法和类;
  • 匿名内部类不能是public、protected、private、static。
  • 只能创建匿名内部类的一个实例;
  • 一个匿名内部类一定是在new的后面,这个匿名内部类必须继承一个父类或实现一个接口。
  • 因为匿名内部类为局部内部类,所以局部内部类的所有限制对其生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值