RSS
热门关键字:  数据挖掘  数据仓库  人工智能  搜索引擎  数据挖掘导论

内部类的研究

来源: 作者:unkonwn 时间:2006-01-14 点击:

Java内部类 数据挖掘研究院

本文将详细的解释内部类,希望和大家交流. 数据挖掘研究院

简单的内部类定义形如这样:

数据挖掘研究院

class A{

数据挖掘研究院

class B{}

}这样的类被称为内部类,又 被称为内隐类.

从简单到深入一步一步的分析内部类的特点. 数据挖掘研究院

  数据挖掘研究院

  数据挖掘研究院

class OuterClass

数据挖掘实验室

{   static class A //静态内部类 数据挖掘实验室

    {   public A( ) 

        { System.out.println("Test$A !"); }    }

    class B  //非静态内部类 数据挖掘研究院

    {    public B( )   

数据挖掘实验室

         { System.out.println("Test$B !"); }    }

数据挖掘研究院

   public void disp( ) 数据挖掘研究院

    {       数据挖掘实验室

        final int a=10;    int b;

数据挖掘研究院

         class C  //成员函数中的局部内部类 数据挖掘研究院

         {  public C( )

            {     System.out.println(“in class C a="+a); 数据挖掘研究院

                  //System.out.println(b);       数据挖掘研究院

              } 数据挖掘实验室

         } 数据挖掘研究院

         C c=new C( );

数据挖掘研究院

}   数据挖掘研究院

public class Test extends OuterClass 数据挖掘研究院

{

数据挖掘研究院

   public static void main(String args[]) 数据挖掘研究院

  {     OuterClass.A a=new OuterClass.A( );

数据挖掘研究院

    //建立静态内部类对象 数据挖掘研究院

 

  数据挖掘研究院

        B b=new OuterClass( ).new B( ); 数据挖掘研究院

  数据挖掘研究院

    //建立非静态内部类的对象

数据挖掘研究院

    //注意这个OuterClass().new B();相当于生成一个外部类的对象,然后在利用外部类对象生成内部类对象 数据挖掘研究院

  数据挖掘研究院

 

数据挖掘研究院

        OuterClass t=new OuterClass( ); 数据挖掘研究院

         t.disp( ); 数据挖掘实验室

    //通过外部对象调用一个对象方法的形式,新建立了对象C.

数据挖掘研究院

  }

}

数据挖掘研究院

 

注意在上面的b在运行时会为0,因为是类属性.

数据挖掘研究院

  数据挖掘研究院

class OuterClass 数据挖掘研究院

       { 

          static class A  {   } //静态内部类

数据挖掘研究院

               class B  {   } //非静态内部类

                 public void disp( ) 数据挖掘实验室

                 {

                    class C{ } //局部内部类 数据挖掘研究院

                 } 数据挖掘实验室

        } 数据挖掘研究院

  数据挖掘研究院

编译后的结果:

数据挖掘研究院

 

数据挖掘研究院

OuterClass.class

数据挖掘实验室

        OuterClass$A.class 数据挖掘研究院

        OutClass$B.class

       OuterClass$1$C.class

记住以下几句话:

 

1,一个内部类的对象能够访问创建它的外部类对象的所有属性及方法(包括私有部分)。 数据挖掘实验室

//可以闭上眼镜,把这个内部类等同于一个类的一个方法,当然就可以访问这个外部类的

数据挖掘实验室

//所有方法和属性,私有方法和属性是属于外部类的,当然也就等同于内部类的.

数据挖掘研究院

 

数据挖掘研究院

2,对于同一个包中的其它类来说,内部类能够隐藏起来。(将内部类用private修饰即可) 数据挖掘研究院

//只有在内部类中,才能定义一个为private类型的class,因为这时编译器已经把这个类看作这个类的成员了,但是在一般使用时,就是所谓的”顶级类时”,不能使用private,只能是public 或者是friendly.

如果要是想保证一个类不产生任何的对象,请在构造函数中,把构造函数声明成private.

3, 内部类可定义在方法中,称为局部内部类,但它只能使用方法中的final常量。

数据挖掘研究院

//定义在一个方法内的类,又被成为局部内部类,这个类只能使用在方法中的final常量,注意,这个常量是在一个方法中的,那么能否使用一个类中的常量呢?

数据挖掘研究院

当然是可以的,因为类中的常量在在一个方法中是可见的. 数据挖掘研究院

// 数据挖掘研究院

如果把一个类写在了一个if中,比如这样:

class A{

    int a = 10; 数据挖掘研究院

    if(a!=10){ 数据挖掘研究院

        class B{

数据挖掘研究院

            B(){

数据挖掘研究院

                System.out.println(a); 数据挖掘研究院

            } 数据挖掘研究院

        }

    }

数据挖掘研究院

} 数据挖掘实验室

在编译后会有几个错误呢? 数据挖掘实验室

首先那个a没有被定义为final,你有一次上了圈套. 数据挖掘研究院

B同样会被生成出来,只是离开了if域就失效了. 数据挖掘研究院

4,内部类可以被定义为抽象类

// abstract 类同样可以在内部类中

数据挖掘研究院

5, 非静态内部类不能声明本类的static成员 数据挖掘实验室

//只有一个静态的内部类,才可以声明一个static成员, 数据挖掘研究院

class A{

    static  class B{

数据挖掘研究院

  数据挖掘研究院

       //如果这里不是一个static类,是不可以被声明这个gg方法的.

       static void gg(){

       int a = 100; 数据挖掘研究院

       System.out.println(a);

数据挖掘研究院

       }

    }

数据挖掘实验室

} 数据挖掘实验室

  数据挖掘研究院

class aa{ 数据挖掘研究院

    public static void main(String args[]){

      

数据挖掘研究院

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

    hh.gg(); 数据挖掘研究院

    数据挖掘研究院

    数据挖掘研究院

      

    } 数据挖掘研究院

}

使用内部类可以非常方便的编写事件驱动程序

这个在写事件驱动时,会有很好的解释.

数据挖掘实验室

匿名内部类 数据挖掘研究院

在某些情况下,我们只需要内部类的一个对象,那么我们就没有必要给内部类命名,没有名字的内部类我们称为匿名内部类

public class A extends Applet 数据挖掘实验室

{     public void init( ) 数据挖掘研究院

      {  addMouseListener( new B( ) ); 数据挖掘研究院

      }

数据挖掘研究院

      class B extends MouseAdapter 数据挖掘研究院

      {      public void mousePressed(MouseEvent me) 数据挖掘研究院

             {       showStatus("Mouse Pressed.");         } 数据挖掘研究院

       } 数据挖掘研究院

} 数据挖掘研究院

用匿名内隐类修改: 数据挖掘研究院

 

数据挖掘研究院

import java.applet.*;

数据挖掘研究院

import java.awt.event.*; 数据挖掘研究院

import java.awt.*;

数据挖掘实验室

public class AnonymousInnerClassDemo extends Applet

数据挖掘实验室

{   public void init( ) 数据挖掘研究院

     {   addMouseListener( new MouseAdapter( ) 数据挖掘实验室

         {   public void mousePressed(MouseEvent me)

       {  showStatus("Mouse Pressed");   }     }    ); 数据挖掘研究院

    }

}

下面是一个think in java里的例子

数据挖掘研究院

public class Pr{ 数据挖掘研究院

    数据挖掘研究院

    public Concents cont(){

        return new Concents(){

           

数据挖掘实验室

            private int i= 11; 数据挖掘实验室

            public int value (){return i;} 数据挖掘研究院

        };//这里是有一个逗号

数据挖掘研究院

    }

数据挖掘研究院

}

数据挖掘研究院

这个Contents是通过默认的构造函数产生的,匿名类的产生也就是一个新类向上转型到父类的过程.

数据挖掘研究院

那么如果一个父类没有一个默认的构造函数,应该什么办呢?

那就只有调用一个super()了.

class noname{

数据挖掘实验室

    数据挖掘研究院

         Warpping wrap(int x){

        数据挖掘研究院

        return new Warpping(x){

数据挖掘研究院

            数据挖掘研究院

            public int value(){ 数据挖掘研究院

                数据挖掘研究院

                return super.value()*47; 数据挖掘研究院

            }

        };

    } 数据挖掘研究院

    public static void main(String s[]){

数据挖掘研究院

       

        noname p = new noname(); 数据挖掘研究院

        Warpping w = p.wrap(10);

    } 数据挖掘研究院

}

 

数据挖掘研究院

如果在匿名内部类中用到了外部对象 数据挖掘研究院

就必须保证这个外部对象是final的 数据挖掘研究院

public class PP{ 数据挖掘实验室

   

数据挖掘研究院

    public DD dest(final String dest, final float price){ 数据挖掘实验室

        数据挖掘实验室

        return new DD(){

数据挖掘实验室

            数据挖掘研究院

            private int cost;

            { 数据挖掘研究院

                cost = Math.round(price); 数据挖掘研究院

                if(cost>100)

数据挖掘研究院

                    System.out.println("Over budget");

数据挖掘研究院

            }

数据挖掘研究院

        };

数据挖掘研究院

    }

    publc static void main(String []arg){ 数据挖掘实验室

       

        PP h = new PP(); 数据挖掘实验室

        DD d = h.dest("haha",11.111); 数据挖掘研究院

        数据挖掘研究院

    } 数据挖掘研究院

}

好了,先写到这,我的邮箱是

数据挖掘研究院

flyboy1234@163.com 数据挖掘研究院

希望各位java爱好者和我联系,多多交流!

数据挖掘研究院

---------------------------------------------------flyboy1234 数据挖掘实验室

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?