-
内部类
在Java语言中,可以把一个类定义到另外一个类的内部,在类里面的这个类就叫做内部类,外面的类叫做外部类。在这种情况下,这个内部类可以被看成外部类的一个成员(与类的属性和方法类似)。还有一种类被称为顶层(Top-level)类,指的是类定义代码不嵌套在其他类定义中的类。
内部类主要有以下四种:静态内部类,成员内部类,局部内部类,匿名内部类。其定义方法如下:
class outerClass{
static class innerClass{}//静态内部类
}
静态内部类是指被声明为static的内部类。它可以不依赖于外部类实例而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类·的普通成员变量,只能访问外部类中的静态成员和静态方法(包括私有类型)
class outerClass{
class innerClass{}//成员内部类(普通内部类)
}
一个静态内部类,如果去掉static关键字,就成为成员内部类。成员内部类为非静态内部类,它可自由引用外部类的属性和方法,无论这些属性和方法是静态的和非静态的。但是它与一个实例绑在了一起,不可以定义静态的属性和方法。只有在外部的类被实例化后,这个内部类才能被实例化。注意:非静态内部类中不能有静态成员。
class outerClass{
public void memberFunction(){
class innerClass{}//局部内部类
}
}
局部内部类指的是定义在一个代码块内的类,其作用范围为其所在的代码块,是内部类中使用较少的一种类型。局部内部类像局部变量一样,不能被public,protected,private,static修饰,只能访问方法中定义为final类型的局部变量。
public class MyFrame extends Frame{
//外部类
public MyFrame(){
addWindowListener(new WindowAdapter()
{//匿名内部类
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
}
}
匿名内部类是一种没有类名的内部类,不使用关键字class,extends和implements,没有构造方法,它必须继承其他类或实现其他接口。匿名内部类的一般好处是使代码更加简洁紧凑,但易读性下降。一般应用于GUI(图形用户界面)编程中实现事件处理等。
-
Java程序初始化
在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
观察以下代码:
public class HelloB extends HelloA{
public HelloB(){
System.out.println("HelloB");
}
{
System.out.println("I'm class B");
}
static{
System.out.println("static B");
}
public static void main(String[] args) {
new HelloB();
}
}
class HelloA{
public HelloA(){
System.out.println("HelloA");
}
{
System.out.println("I'm class A");
}
static{
System.out.println("static A");
}
}
Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减):Java程序初始化工作可以在许多不同的代码块中完成(例如静态代码块,构造含数)他们执行的顺序如下:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块-,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数
- 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象只初始化一次,而非静态对象(变量)可能会初始化多次;
- 父类优先于子类进行初始化;
- 按照成员变量定义顺序进行初始化,即使变量定义散布于方法定义中,它们依然在任何方法(包括构造方法)被调用之前请初始化。、
综上:上述程序运行结果为