`
student_lp
  • 浏览: 429146 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

       内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可以是静态static的,也可用public,default,protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类。

一、内部类的作用

      典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。

二、内部类的访问方式


程序编译过后会产生两个.class文件,分别是Out.class和Out$In.class。其中$代表了上面程序中Out.In中的那个 .

      Out.In in = new Out().new In()可以用来生成内部类的对象,这种方法存在两个小知识点需要注意

  1.开头的Out是为了标明需要生成的内部类对象在哪个外部类当中

  2.必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量

三、内部类的访问控制

     内部类的访问控制包括public、protected、default、private。而普通类(非内部类)的访问控制仅仅有public和友好类型。有关访问控制方面的内容,请看第二篇中的java访问控制。

四、内部类按作用域分类

1、成员内部类

       成员内部类,就是作为外部类的成员,与外部类的属性、方法并列。可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
       要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。

注意:①成员内部类中,不能定义静态成员
②成员内部类中,可以访问外部类的所有成员
③内部类和外部类的实例变量可以共存,但在内部类中访问外部类中与内部类同名的实例变量用外部类名.this.变量名
④在内部类中访问内部类自己的变量直接用变量名
⑤在内部类中访问内部类自己的变量也可以用this.变量名
⑥如果内部类中没有与外部类同名的变量,则可以直接用变量名访问外部类变量
⑦外部类的非静态方法和静态方法访问成员内部类一样,都需要根据外部类对象建立内部类对象
⑧除非你已经有了外围类的一个对象,否则不可能生成内部类的对象。因为此内部类的对象会悄悄地链接到创建它的外围类的对象
 2、局部内部类
       在方法中定义的内部类称为局部内部类。与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。

 注意:①如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
②可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的
③如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量
④用this.变量名访问的也是内部类变量
⑤用外部类名.this.内部类变量名访问的是外部类变量
3、静态内部类(嵌套类)
      如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:
       1. 要创建嵌套类的对象,并不需要其外围类的对象。
  2. 不能从嵌套类的对象中访问非静态的外围类对象。

 注意:①静态内部类可以用public,protected,private修饰
②静态内部类中可以定义静态或者非静态的成员
③静态内部类只能访问外部类的静态成员(包括静态变量和静态方法)
④静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)
⑤外部类访问内部类的静态成员:内部类.静态成员
⑥外部类访问内部类的非静态成员:实例化内部类即可
⑦因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)
 4、匿名内部类
     简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
  ·只用到类的一个实例。
  ·类在定义后马上用到。
  ·类非常小(SUN推荐是在4行代码以下)
  ·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
  ·匿名内部类不能有构造方法。
  ·匿名内部类不能定义任何静态成员、方法和类。
  ·匿名内部类不能是public,protected,private,static。
  ·只能创建匿名内部类的一个实例。
      ·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
  ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

 注意:①留意外部类的方法的形参,当所在的方法的形参需要被内部类里面使用时,该形参必须为final。这里可以看到形参name已经定义为final了,而形参city 没有被使用则不用定义为final。(具体原因比较复杂呢,需要了解java的编译机制,可以参考:http://android.blog.51cto.com/268543/384844/)
②匿名内部类,没名字,是用默认的构造函数的,无参数的,那如果需要参数呢?匿名内部类通过实例初始化(实际就是采用普通初始化块的方式),可以达到类似构造器的效果。
五、内部类的继承问题
      因为内部类的构造器要用到其外围类对象的引用,所以在你继承一个内部类的时候,事情变得有点复杂。问题在于,那个“秘密的”外围类对象的引用必须被初始化,而在被继承的类中并不存在要联接的缺省对象。要解决这个问题,需使用专门的语法来明确说清它们之间的关联:

 可以看到子类的构造函数里面要使用父类的外部类对象.super();而这个对象需要从外面创建并传给形参。

五、总结

内部类在java web编程中很少使用,但是在swt编程中使用较多。因此我们还是需要认证查看一下内部类的有关知识。

六、参考

1、think in java 4th

2、http://blog.sina.com.cn/s/blog_56898c310100a3i3.html

3、http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html

4、http://android.blog.51cto.com/268543/384844/

  • 大小: 17.4 KB
  • 大小: 18.3 KB
  • 大小: 15.7 KB
  • 大小: 11.7 KB
  • 大小: 16.6 KB
  • 大小: 12.4 KB
分享到:
评论

相关推荐

    探讨Java内部类的可见性

    这里需要探讨的是,外部类以及其他类的对象可以如何访问到某个内部类对象,即内部类的可见性问题。  下面是一个示例程序Out.java,其中包含了4个不同访问权限的内部类(private,default,protected,public),...

    java8 探讨与分析匿名内部类、lambda表达式、方法引用的底层实现的测试用例

    这是原文中用到的测试用例,注意改一下包名。包括了test1~test4。

    Java:深入探讨Iterator模式

    java.util包中包含了一系列重要的集合类。本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕。

    java核心技术卷Ⅰ (高清中文版)

    第6章解释了接口和内部类;第7章概述了图形用户界面程序设计知识;第8章讨论AWT的事件模型;第9章探讨了SwingGUI工具箱;第10章讲解如何部署自己的应用程序或applet;第11章讨论异常处理;第12章概要介绍泛型程序...

    Java类加载内幕

    类加载是java语言提供的最强大的机制之一。...然后深入探讨java虚拟机(JVM)是怎么利用类加载器读取代码,及java中类加载器的主要类型。接着用一个类加载的基本算法看一下类加载器怎么加载一个内部类。本文的下一节演

    JAVA基础课程讲义

    内部类(innerclasses) 88 字符串(java.lang.String类)的使用 90 字符串相等的判断 92 思考作业 93 上机作业 94 第四章 异常机制 95 导引问题 95 异常(Exception)的概念 96 异常分类 96 Error 97 Error和...

    Java零基础-static关键字.md

    此外,还将探讨静态代码块和静态内部类的概念及其使用场景。 能学到什么: 理解Java中static关键字的含义和作用。 掌握静态成员变量和静态方法的定义和使用方法。 了解静态成员和实例成员之间的区别。 熟悉使用...

    Java核心技术 卷1 基础知识 原书第9版

    第6章解释了接口和内部类;第7章概述了图形用户界面程序设计知识;第8章讨论AWT的事件模型;第9章探讨了SwingGUI工具箱;第10章讲解如何部署自己的应用程序或applet;第11章讨论异常处理;第12章概要介绍泛型程序...

    JAVA垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再...

    Java核心技术卷一-完整书签-pdf

    第6章解释了接口和内部类;第7章概述了图形用户界面程序设计知识;第8章讨论AWT的事件模型;第9章探讨了SwingGUI工具箱;第10章讲解如何部署自己的应用程序或applet;第11章讨论异常处理;第12章概要介绍泛型程序...

    Java核心技术 卷1 基础知识 原书第10版--中文版

    第6章解释了接口和内部类;第7章概述了图形用户界面程序设计知识;第8章讨论AWT的事件模型;第9章探讨了SwingGUI工具箱;第10章讲解如何部署自己的应用程序或applet;第11章讨论异常处理;第12章概要介绍泛型程序...

    java classload教程

    然后深入探讨java虚拟机(JVM)是如何利用类加载器读取代码,以及java中类加载器的主要类型。接着用一个类加载的基本算法看一下类加载器如何加载一个内部类。本文的下一节演示一段代码来说明扩展和开发属于自己的类...

    一种基于Java企业内部及时通讯软件设计.doc

    (3) 在本系统设计采用UDP通信协议时,基于UDP的Socket编程技术,Java.net中提供了两个 类DatagramSoeket和DatagramPacket用来支持数据报通信。Datagramsocket用来在程序 之间建立传送数据报的通信连接是数据报...

    java导入.sql文件到数据库程序

    自己写的java导入.sql文件到数据库,部署项目时可直接调用。内部包含源码。共享给大家,如有疑问,发邮件到 yichangjiang@sina.com 可与大家共同探讨。程序及说明在runjar目录下。

    计算机软件开发中JAVA编程语言的应用探讨.pdf

    随着信息技术的飞速发展,计算机在人们日常生活中...文中从java编程语言的内部结构出发,对java程序设计语言的独特特点进行了深入的分析和研究,并对java编程语言在软件开发中的应用进行了详细的分析,以为相关工作者...

    Java零基础-this关键字.md

    读者将学习什么是this关键字以及它在实例方法、构造方法和内部类中的具体应用。此外,还将探讨this关键字与静态成员、方法参数和方法重载之间的关系。 能学到什么: 理解Java中this关键字的含义和作用。 掌握this...

    Java课堂笔记、代码、java核心知识点梳理、java笔试面试资料.zip

    本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用,都做了深入的探讨和总结。具体内容包括: Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心...

    Java interview-高级Java面试题2023.zip

    本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用,都做了深入的探讨和总结。具体内容包括: Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。.zip

    本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用,都做了深入的探讨和总结。具体内容包括: Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心...

    『Java八股文』Java面试套路,Java进阶学习,打破内卷拿大厂Offer,升职加薪!.zip

    本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用,都做了深入的探讨和总结。具体内容包括: Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心...

Global site tag (gtag.js) - Google Analytics