注意事项一:在内部类中可以随意使用外部类的成员方法以及成员变量。

   众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止其他类的访问。如在成员变量或者成员方法前面,加上Private 关键字,则其他类就无法调用这个类中的成员方法或则和成员变量。但是,如果这个类有成员内部类,则不受这方面的限制。也就是说,在成员内部类中可以随意引 用外部类的成员方法以及成员变量,即使这些类成员方法或者成员变量被修饰了private。如在成员外部类中定义了一个i变量,并且利用private关 键字来修饰。此时在其他类中是不能够引用这个私有成员变量的。但是这个类的成员内部类的方法中,则不仅可以引用这个外部类的私有变量,而且还可以对其进行 赋值等操作。这个赋值操作对于外部类也是有效的。即成员内部类可以更改外部类中私有变量的值。

  注意事项二:要在外部类中实例化内部类对象的引用。

   如果一个类定义在另外一个类中,成为成员内部类,此时一定要注意,内部类的实例一定要绑定在外部类的实例上。也就是说,要从外部类中初始化一个内部类的 对象,此时内部类的对象就会绑定在外部类的对象上。这跟普通的类有所不同。普通的类,创建完之后,不一定马上需要实例化。在需要用到这个对象的时候,再进 行实例化即可。但是,如果一个类成为另外一个类的成员内部类,则就不同了。必须要在外部类中实例化内部类对象的引用,以实现将内部类的实例绑定在外部类的 实例上。简单的说,就是在定义外部类的时候,如果有成员内部类,那么就不要望了在外部类中利用new关键字来实例化内部类对象的引用。而对于外部类来说, 则可以在需要的时候再进行实例化。如此就可以保证,利用外部类创建对象的同时创建了内部类的对象。从而可以保证内部类的实例绑定在外部类的实例上。

  注意事项三:成员内部类中成员方法与成员变量的私有性。

   作为成员内部类,可以随意引用外部类中的成员变量与成员方法。那么在成员内部类中定义的成员变量,外部类是否也可以随意访问呢?答案是否定的。内部类可 以访问它外部类的成员,但是内部类的成员(如成员变量或者成员方法)只有在内部类的范围之内是可知的,不能够被外部类直接引用。如现在在外部类中定义了一 个变量i,在内部类中定义了另一个变量ii。此时在成员内部类中,可以直接引用这个外部类中的变量i,也可以对其直接进行赋值,如i=5等等。但是在外部 类中,则不能够直接引用内部类中的成员变量。如在外部类中,利用ii=5的赋值语句改变这个变量的值,就属于语法错误,在编译的时候就会出现错误。如果外 部类真的要引用内部类的成员,那也不是不可以。只是不能够进行直接的引用,而是要使用内部类对象引用的方法才能够调用内部类的成员变量。这一点程序开发人 员需要切记。成员内部类与外部类相互访问彼此的成员方法限制是不同的。特别需要注意的是,如果在外部类和非静态方法之外实例化内部对象,则需要使用外部 类.内部类的形式来制定这个对象的类型。这非常的麻烦。为此要尽量避免在外部类和非静态方法之外实例化内部类对象。再者,内部类对象会依赖于外部类对象, 除非已经存在一个外部类对象,否则类中不会出现内部类对象。简单的说,内部类对象与外部类对象之间的关系非常的紧密。有时候即像一对父子(成员内部类可以 随意使用外部类的成员),有时候又像是陌生人(外部类不能够直接使用内部类中的成员)。作为一个出现的程序开发人员,必须要深入了解外部类对象与内部类对 象的关系。因为在实际工作中,在外部类中定义成员内部类还是很常见的。只有了解他们彼此之间的关系,在编写应用程序中,才可以把控好他们。

  注意实现四:使用this关键字获取内部类与外部类对象的引用。

   在外部类和成员内部类中,都可以定义变量。成员内部类可以随意访问外部类中的变量,而外部类不能够直接访问内部类中的变量,只有通过使用内部类对象来引 用内部类的成员变量。不过需要注意的是,在外部类中定义的变量与内部类中定义的变量名字可以相同。也就是说,在外部类中可以定义一个变量i,在内部类中也 可以定义一个变量i。此时新的问题就出来了。由于在内部类中可以随意访问外部类中成员方法与成员变量。但是此时成员内部类与外部类的变量名相同,那么如果 要在内部类使用这个变量i,编译器怎么知道现在需要调用外部类的变量i,还是内部类的变量i呢?

   在实际工作中,应该尽量避免这种情况。即在定义变量名字的时候,内部类中的变量名字尽量不要与外部类中的变量名字相同。但是如果真的发生这种情况的 话,Java编译器还是有手段可以解决这个变量名字的冲突问题。如果在类中的成员内部类中遇到成员变量名字与外部类中的成员变量名字相同,则可以通过使用 this关键字来加以区别。如现在有一个类名字叫做student。而在这个类中又创建了一个成员内部类,名字叫做age。现在在这两个类中各自定义了一 个成员变量i,用来做循环之用。此时如果在成员内部类中调用这个变量,该如何进行区分呢?通常情况下,如果使用this.i 的方式来调用变量,则表示这个变量是成员内部类中定义的变量。而通过使用student.this.i的形式调用变量时表示此时引用的是外部类的成员变 量。也就是说,如果内部类中引用外部类中同名的成员,需要通过外部类迷名字.this.外部类成员名字的方式加以引用。而且,在引用成员内部类自己的定义 的成员时也需要使用this关键字,以加以区别。显然这非常的麻烦。为此笔者仍然要强调一遍,除非有非常特殊的必要,否则的话要尽量避两外部类与成员内部 类中成员变量或者成员方法采用相同的名字。否则的话,会给后续的引用带来很大的麻烦。

   从以上的总结中可以看出,成员内部类与外部类之间的关系确实很复杂。作为一个Java程序开发人员,必须要了解内部类与外部类成员相互之间引用的准则、 内部类对象与外部类对象的关系。在编写代码的时候,尽量避免内部类与外部类中成员变量与成员方法的命名冲突。如果真的发生重名的话,要学会利用this关 键字来消除这个冲突。笔者上面谈的一些注意实现也是一些比较抽象的内容,需要开发人员在实际工作中去领悟。

java:内部类与外部类的区别和联系的更多相关文章

  1. java内部类 和外部类的区别

    java 内部类和静态内部类的区别  详细连接https://www.cnblogs.com/aademeng/articles/6192954.html 下面说一说内部类(Inner Class)和 ...

  2. java 内部类与外部类的区别

    最近在看Java相关知识的时候发现Java中同时存在内部类以及非公有类概念,而且这两个类都可以不需要单独的文件编写,可以与其他类共用一个文件.现根据个人总结将两者的异同点总结如下,如有什么不当地方,欢 ...

  3. Java内部类与外部类的那些事

    昨天去笔试的时候遇到了Java的内部类的创建方式与访问权限的问题,我不懂,没写,故今天起来特意去试验一下,就有了这篇总结性的文章. Java中的内部类又分为非静态内部类(匿名内部类也是非静态的内部类) ...

  4. Java内部类和外部类的通信探索

    1.内部类访问外部类的成员和方法 在内部类中,可以无障碍地访问外部类的所有成员和方法. 在下面的实验代码中,可以看到,内部类sl可以访问外部类的私有成员:sz 和 cur. 同时可以访问私有方法:pr ...

  5. java内部类和外部类

    1.使用static可以声明一个内部类, 可以直接在外部调用 class Outer{ // 定义外部类 private static String info = "hello world& ...

  6. Java内部类与外部类

    错误提示: 没有任何类型 TestThread 的外层实例可访问.必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配. pu ...

  7. Java内部类持有外部类的引用详细分析与解决方案

    在Java中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收. GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法),内部类在生命 ...

  8. 从字节码的角度看Java内部类与外部类的互相访问

    Java中non-static内部类为何可以访问外部类的变量?Java中外部类又为何可以访问内部类的private变量?这两个问题困扰过我一段时间,查了一些网上的答案,大多从“闭包”概念入手,理解起来 ...

  9. Java内部类引用外部类中的局部变量为何必须是final问题解析

    今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方 ...

随机推荐

  1. 封装getElementsByClassName

    function getElementsByClassName(oEle,sClass,sEle){ if(oEle.getElementsByClassName){ return oEle.getE ...

  2. 老式浏览器兼容HTML5和CSS3的问题

      1.让老式浏览器支持HTML5   HTML5能为我们做的事儿很多,最为可口的就是语义化标签的应用,如果你已经在Chrome或者其他支持HTML5的浏览器上用过它的牛x,那这篇文章对你一定有用,因 ...

  3. 《PHP和MySQL Web开发》精彩的地方收录

    1.用SESSION来做的购物车,做成数组,用isbn对应书的数量作为二维数组保存 $new GET传值加入购物车,submit是修改数量,提交后的表单,通过历遍原来的数组,对应isbn修改最新的数量 ...

  4. 基于Redis主从复制读写分离架构的Session共享

    1.搭建主从复制 第一步:将Redis拷贝到虚拟机上的指定文件夹内,此Redis作为主服务 第二步:将Redis拷贝到本机的指定文件夹内,此Redis作为从服务 第三步:修改主服务的配置文件(redi ...

  5. SpringUtil

    /** SpringUtil.java {{IS_NOTE Purpose: Description: History: Thu Jun 1 13:53:53 2006, Created by hen ...

  6. PAT 字符串-02 删除字符串中的子串

    /* 2 *PAT 字符串-02 删除字符串中的子串 3 *2015-08-09 4 作者:flx413 5 */ #include<stdio.h> #include<string ...

  7. Error NO.2013 Lost connection to Mysql server during query

    系统:[root@hank-yoon ~]# cat /etc/redhat-release CentOS release 6.3 (Final) DB版本:mysql> select @@ve ...

  8. Linux内核学习方法

    Makefile不是Make Love 从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了 ...

  9. JAVA类与对象(一)----基础概念理解

    面向对象基本概念 面向对象是一种新兴的程序设计方法,或者说是一种新的程序设计规范,其基本思想是使用对象.类.继承.封装.消息等基本概念来进行程序设计.它是从现实世界客观存在的事物(即对象)出发来构造软 ...

  10. Django 学习笔记之三 数据库输入数据

    假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...