Java内部类

原创 2004年12月15日 13:46:00

Java内部类<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

本文将详细的解释内部类,希望和大家交流.

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

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

java内部类的四大作用

放在一个类的内部的类我们就叫内部类。 二、 作用 1.内部类可以很好的实现隐藏  一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所...
  • mid120
  • mid120
  • 2016年12月14日 19:25
  • 3459

java内部类常见面试题汇总

1.根据注释填写(1),(2),(3)处的代码 public class Test{ public static void main(String[] args){ /...
  • tomcat_2014
  • tomcat_2014
  • 2016年04月18日 17:13
  • 2813

Java 创建内部类实例

编程中需要访问内部类,写C习惯了Java方式多少有些生硬。 其实很简单: 1 拥有内部类的一个类 public class B{ public void showData() { ...
  • xiaoleiacm
  • xiaoleiacm
  • 2016年03月01日 15:28
  • 2800

java 四种内部类 使用细节(含代码)

一: 内部类     定义在类体部,方法体部,甚至比方法体更小的代码块内部的类(if 语句里面等)     1.静态内部类(内部类中最简单的形式)         1.声明在类体部,方法体外,并...
  • qq_33599978
  • qq_33599978
  • 2017年04月27日 23:28
  • 469

JAVA和C++内部类

JAVA和C++内部类的异同
  • qq78442761
  • qq78442761
  • 2016年11月21日 22:52
  • 475

java内部类解析及应用场景简介

转自:http://blog.csdn.net/historyasamirror/article/details/6049073 所谓内部类,就是一个类的定义放在了另一个类定义的内部,如: ...
  • oliveevilo
  • oliveevilo
  • 2012年07月13日 17:23
  • 1750

java中的内部类完全总结

一.内部类基础   在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就...
  • pangqiandou
  • pangqiandou
  • 2016年11月19日 21:57
  • 1821

java泛型,内部类,枚举类型

(1)泛型 JDK1.5之后增加的新功能,泛型可以解决数据类型的安全性问题,他主要的原理,是在类声明的时候通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。 格式:访问权限 clas...
  • Bubble1210
  • Bubble1210
  • 2016年02月22日 22:29
  • 942

Java 四种内部类

Java 内部类  分四种:成员内部类、局部内部类、静态内部类和匿名内部类。  1、成员内部类: 即作为外部类的一个成员存在,与外部类的属性、方法并列。 注意:成员内部类中不能定义静态变量,但可以访问...
  • superit401
  • superit401
  • 2016年07月30日 18:01
  • 4736

关于Java内部类的初始化

Java类的位置1、在同个Java文件中,但不是内部类public class Test {} class T{}
  • w1lgy
  • w1lgy
  • 2017年01月07日 11:18
  • 550
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java内部类
举报原因:
原因补充:

(最多只允许输入30个字)