内部类的研究

本文将详细的解释内部类,希望和大家交流.
简单的内部类定义形如这样:
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);
       
    }
}
好了,先写到这,我的邮箱是
希望各位java爱好者和我联系,多多交流!
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值