Java语言基础:内部类 java语言基础博客
创始人
2024-07-24 12:50:43
0

 

内部类,计算机面向对象程序设计概念。向对象程序设计中,可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型,即静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。

1. 普通内部类

普通内部类的一个最简单的例子:

 

 

  1. // 外部类     
  2. class OutterClass {     
  3.     // 内部类     
  4.     public class InnerClass {     
  5.         private int i = 0;     
  6.         public int getInt(){     
  7.             return i;     
  8.         }     
  9.     }     
  10.     public void proc(){     
  11.         InnerClass inClass = new InnerClass();     
  12.         System.out.println(inClass.getInt());     
  13.     }     
  14. }     
  15.       
  16. public class Main {         
  17.     public static void main(String[] args) {     
  18.         OutterClass outClass = new OutterClass();     
  19.         outClass.proc();     
  20.     }     
  21. }    

 

外部类可以访问内部类的私有成员,内部类也可以访问外部类的私有成员:

 

  1. // 外部类     
  2. class OutterClass {     
  3.     private int mOut = 10;     
  4.     // 内部类     
  5.     public class InnerClass {     
  6.         private int mIn = 0;     
  7.         public void printOutPrivate(){     
  8.             // 直接打印外部类的成员     
  9.             System.out.println(mOut);     
  10.         }     
  11.     }     
  12.     public void printInPrivate(){     
  13.         InnerClass inClass = new InnerClass();     
  14.         // 直接打印内部类的私有成员     
  15.         System.out.println(inClass.mIn);     
  16.     }     
  17.     public void printOutPrivate(){     
  18.         InnerClass inClass = new InnerClass();     
  19.         inClass.printOutPrivate();     
  20.     }     
  21. }     
  22.       
  23. public class Main {         
  24.     public static void main(String[] args) {     
  25.         OutterClass outClass = new OutterClass();     
  26.         outClass.printInPrivate();     
  27.         outClass.printOutPrivate();     
  28.     }     
  29. }    

 

如果外部类的成员变量与内部类的成员变量名字相同,当内部类要访问外部类的该成员时,可以使用“OutClass.this.mem”来区分:

 

  1. // 外部类     
  2. class OutterClass {     
  3.     private int mMem = 10;     
  4.     // 内部类     
  5.     public class InnerClass {     
  6.         private int mMem = 0;     
  7.         public void printOutPrivate(){     
  8.             // 直接打印外部类的成员     
  9.             System.out.println(OutterClass.this.mMem);     
  10.         }     
  11.     }     
  12. }  

 

要创建普通内部类,必须先创建相应的外部类:

 

  1. // 外部类     
  2. class OutterClass {     
  3.     private int mMem = 10;     
  4.     // 内部类     
  5.     public class InnerClass {     
  6.         private int mMem = 0;     
  7.         public void printOutPrivate(){     
  8.             // 直接打印外部类的成员     
  9.             System.out.println(OutterClass.this.mMem);     
  10.         }     
  11.     }     
  12. }     
  13.       
  14. public class Main {         
  15.     public static void main(String[] args) {     
  16.         OutterClass outClass = new OutterClass();     
  17.        OutterClass.InnerClass inClass = outClass.new InnerClass();     
  18.         inClass.printOutPrivate();     
  19.     }     
  20. }    

 

也可以用下面的方式:

 

  1. // 外部类     
  2. class OutterClass {     
  3.     private int mMem = 10;     
  4.     // 内部类     
  5.     public class InnerClass {     
  6.         private int mMem = 0;     
  7.         public void printOutPrivate(){     
  8.             // 直接打印外部类的成员     
  9.             System.out.println(OutterClass.this.mMem);     
  10.         }     
  11.     }     
  12.     public InnerClass newInnerClass() {     
  13.         return new InnerClass();     
  14.     }     
  15. }     
  16.       
  17. public class Main {         
  18.     public static void main(String[] args) {     
  19.         OutterClass outClass = new OutterClass();     
  20.        OutterClass.InnerClass inClass = outClass.newInnerClass();     
  21.         inClass.printOutPrivate();     
  22.     }     
  23. }    

 

2. 静态内部类

普通内部类前面加上static修饰符,就成为静态内部类,静态内部类类似于C++的嵌套类,与普通内部类相比有如下区别:

静态内部类没有指向外部类的引用,外部类对于它来说更像一个名字空间。

普通内部类不能有静态成员,静态方法,或另一个静态内部类;而静态内部类可以有这一切。

静态内部类可以直接创建,不必先创建外部类:

 

  1. // 外部类     
  2. class OutterClass {     
  3.     private int mMem = 0;     
  4.     // 静态内部类     
  5.     static public class InnerClass {     
  6.         private int mMem = 0;     
  7.         public void printOutPrivate(){     
  8.             // 这是错误的     
  9.             // System.out.println(OutterClass.this.mMem);     
  10.         }     
  11.     }     
  12.     public void printInPrivate() {     
  13.         InnerClass inClass = new InnerClass();     
  14.         // 可以直接访问静态内部类的成员     
  15.         System.out.println(inClass.mMem);     
  16.     }     
  17. }     
  18. public class Main {         
  19.     public static void main(String[] args) {     
  20.         // 直接创建静态内部类     
  21.         OutterClass.InnerClass inClass = new OutterClass.InnerClass();     
  22.         inClass.printOutPrivate();     
  23.     }     
  24. }    

 

从上面描述可以看出,静态内部类与一般类没有太大区别,只不过它是放在一个类的里面,这个类相当于它的名字空间,可以防止命名冲突。

3. 局部内部类

Java可以把一个类定义在一个方法里面,甚至是一个{}块里面,它的作用域就在这个块里面:

 

  1. // 外部类     
  2. class OutterClass {     
  3.     public void testLocalInner() {     
  4.         if (true)     
  5.         {     
  6.             class LocalInner {     
  7.                 public void proc() {     
  8.                     System.out.println("hello");     
  9.                 }     
  10.             }     
  11.             // 可以创建使用     
  12.             LocalInner localInner = new LocalInner();     
  13.             localInner.proc();     
  14.         }     
  15.         // 错误:超出类定义的作用域     
  16.         LocalInner localInner = new LocalInner();     
  17.         localInner.proc();     
  18.     }     
  19. }    

 

局部内部类的一般用途是实现某个接口,并作为这个接口传出方法被使用:

 

  1. // 接口     
  2. interface Talker {     
  3.     public void Talk();     
  4. }     
  5.       
  6. // 外部类     
  7. class OutterClass {     
  8.     public Talker getTalker() {     
  9.         // 现实该接口的局部内部类     
  10.         class SomeTalker implements Talker {     
  11.             public void Talk() {     
  12.                 System.out.println("hello");     
  13.             }     
  14.         }     
  15.         // 创建类实例并作为Talker返回     
  16.         SomeTalker talker = new SomeTalker();     
  17.         return talker;     
  18.     }     
  19. }     
  20.       
  21. public class Main {         
  22.     public static void main(String[] args) {     
  23.         OutterClass outClass = new OutterClass();     
  24.         Talker talker = outClass.getTalker();     
  25.         talker.Talk();     
  26.     }     
  27. }    

 

4. 匿名内部类

匿名内部类的语法如下:

 

  1. new InterfaceName(){......}; 或 new SuperclassName(){......};   

 

它被认为是InterfaceName的实现者,或是SuperclassName的继承类,匿名内部类没有构建函数,如果SuperclassName有带参数的构造函数,必须在创建匿名内部类时带上这些参数,下面是匿名内部类最常见的使用场合:

 

  1. // 接口     
  2. interface Talker {     
  3.     public void Talk();     
  4. }     
  5.       
  6. // 外部类     
  7. class OutterClass {     
  8.     public void Talk(Talker talker) {     
  9.         talker.Talk();     
  10.     }     
  11. }     
  12.       
  13. public class Main {         
  14.     public static void main(String[] args) {     
  15.         OutterClass outClass = new OutterClass();     
  16.         // 直接生成一个匿名内部类     
  17.         outClass.Talk(new Talker(){     
  18.             public void Talk() {     
  19.                 System.out.println("hello");     
  20.             }     
  21.         });     
  22.     }     
  23. }    

 

原文出处:http://blog.csdn.net/linzhengqun/archive/2011/03/24/6275586.aspx 

【编辑推荐】

  1. Java的局部内部类以及final类型的参数和变量
  2. 没有原生数据类型,Java会更好吗?
  3. 20个开发人员非常有用的Java功能代码
  4. 走进Java 7中的模块系统
  5. 2009年十大Java技术解决方案

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...