当前位置:编程学习 > JAVA >>

面相对象的进阶---内部类、匿名类、静态内部类

内部类

一个Java程序就是一个类的集合。程序中的类有两种排列结构。

Java程序

类1、类2、。。。类n

Java程序

外部类:内部类、、、、类k。。。在一个类中定义其它类

例如:class EnclosingClass{
                    ……

                    class ANestedClass{
                            ……
                     }

              }

内部类在外部类中有特权:内部类可以毫无限制地访问外部类的所有成员。

编译之后,内部类也可产生单独的.class文件,文件名为:外部类名$内部类名.class

例5.22 内部类使用示例。

public class OuterClass {

          private int x=10;

          class InnerClass{

                   int y=20;

     }

          public static void main (String[] args){

              OuterClass oc=new OuterClass();

              OuterClass.InnerClass ic=oc.new InnerClass();(内部类是外部类的一个成员,内部类对象不能单独存在,它必许依赖一个外部类对象

              System.out.println("Outer:x="+oc.x);

              System.out.println("InnerClass:y="+ic.y);

          }

}

使用内部类在编写事件处理驱动的程序时用起来很方便。

只有内部类才能够是私有的--安全机制,只有其外部类的方法才能够创建内部类对象。

如果只需要为内部类建立一个对象,甚至不必为该类指定一个名字,这种类被称为匿名内部类。

使用内部类时应注意:

一个内部类对象能够访问创建它的外部类对象的所有属性及方法(包括私有部分)。

对于同一包中的其它类来说,内部类能够隐藏起来(将内部类用private修饰即可)。

内部类也可以在方法或语句块中,成为局部内部类。局部内部类与成员类的基本特性相同,例如局部内部类实例必属于其外部类的一个实例,可通过OutClass.this引用其外部类实例等,但它只能使用方法虎语句块中的final常量。

 

内部类可以被定义为抽象类或接口,但必须被其他的内部类继承或实现。

非静态内部类不能声明static成员,只有静态的内部类可以声明static成员。

静态内部类和静态成员实例。

Class A{

Statid class B{

//如果这里不是一个static类,是不可以声明show方法的。

Static void show(){

System.out.println("class B");

}

}

}

Public class C{

Public static void main(String[] args){

A.B b=new A.B();

B.show();

}

}

 

匿名类:

      如果满足下面的一些条件,使用匿名内部类是比较合适的:

只用到类的一个实例

类在定义后马上用到

类非常小(推荐在4行代码以下)

给类命名并不会导致你的代码更容易被理解

class 类名 implements ActionListener{

           public void actionPerformed(ActionEvent e){…}

由于匿名内部类没有名称,因此创建匿名内部类对象时,new运算符后是超类或接口的名称,其后的{}内部为匿名类的定义(匿名类对象的创建和匿名类的声明是在一起的)。

 

new 类名();

new ActionListener(){
        public void actionPerformed(ActionEvent e){ … }
}; 

匿名类不能是抽象类,因为系统在创建匿名类的时候,会立即创建匿名类的对象。因此不允许将匿名类定义成抽象类。

匿名类不能有构造方法,因为匿名类没有类名,无法定义构造方法,但匿名类可以定义实例初始化块,通过实例初始化块来完成构造方法需要完成的事情。

匿名类不能定义任何静态成员、方法和类;

匿名类不能是public、protected、private、static;

只能创建匿名类的一个实例。

New 父类构造方法名([实力列表]) 实现的接口名(){

//匿名类的类体部分 www.zzzyk.com

}

从上面的定义中可以看出,匿名类必须继承一个父类,或实现一个接口。

关于匿名类还有如下两条规则:

匿名类不能是抽象类。系统在创建匿名类时,会立即创建匿名类的对象,因此不允许将了匿名类定义成抽象类。

匿名类不能定义构造方法(因为匿名类没有类名,所以无法定义构造方法),但它可以定义实例初始化块,通过实例初始化块来完成构造方法需要完成的事情。

 

静态内部类:

 

定义为static的内部类称为静态内部类。静态内部类没有父类,不能引用外部类实例成员或其他内部类成员。

 

注意:

静态内部类可访问外部类的任一静态字段或静态方法。

像静态方法或静态字段一样,静态内部类有public/private/default权限修饰符。

静态内部类不能与外部类重名。

像外部类的静态方法一样,并不能直接访问外部类的实例字段和实例方法。

静态内部类只能定义于外部类的顶层代码或外部类其他静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。

 

静态内部类的使用。

//StaticInnerClass,java

Public class StaticInnerClass{

Public static class Student{

Int studlD;

String name;

Static int count;

Public Student(int id,String na){

StudlD=id;

Name=na;

Count++;

}

Public void printStuDetails(){

System.out.println("序号:"+count+"学号:"+studlD+"姓名:"+name);

}

}

Public static void main(String[] args){

StaticInnerClass.Student stu1=new StaticInnerClass.Student(1001,"Jhon");

Stu1,printStuDetails();

StaticInnerClass.Student stu2=new StaticInnerClass.Student(1002,"Smith");

Stu2,printStuDetails();

StaticInnerClass.Student stu3=new StaticInnerClass.Student(1003,"Nancy");

Stu3,printStuDetails();

}

}

 

摘自  aijuans
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,