先提纲挈领地来个总结:

内部类(Inner Class)有四种:

  1. member inner class,即成员内部类。可以访问外部类所有方法与成员变量。生成成员内部类对象的方法:OuterClass.InnerClass inner = new OuterClass().new InnerClass();
  2. static inner class,即静态内部类。只能访问外部类的静态方法与静态成员变量,生成静态内部类对象的方法:OuterClass.InnerClass inner = new OuterClass.InnerClass();
  3. Local Inner Class,即局部内部类。定义在方法中,只能访问方法中声明的final 类型的变量(如果作为构造体参数,则不必是final)。
  4. Anonymous Inner Class,即匿名内部类。匿名内部类会隐式地继承一个父类或实现一个接口。

个人认为,内部类最常见的应用场景是:在方法中返回匿名内部类对象。


Remember the advice: Prefer classes to interfaces. If your design demands an interface, you'll know it. Otherwise, don't put it in ultil you are forced to.

  • It's possible to place a class definition within another class definition. This is called an inner class.
  • when you create an inner class, an object of that inner class has a link to the enclosing object that made it, and so it can access the members of that enclosing object--without any special qualifications. In addition, inner classes have access rights to all the elements(include private member) in the enclosing class. How can this happen? The inner class secretly captures a reference to the particular object of the enclosing class that was responsible for creating it. Then, when you refer to a member of the enclosing class, the reference is used to select that member. Fortunately, the compiler takes care of all these details for you.
  • 在内部类中通过外部类名.this 可以拿到外部类对象的引用。
  • 外部类对象.new 语法可以用于创建外部类的内部类对象。
  • It's not possible to create an object of the inner class unless you already have an object of the outer class. This is because the object of the inner class is quietly connected to the object of the outer class that is was made from. However, if you make a nested class(a static inner class), then it doesn't need a reference to the out-class object.
  • Normal(non-inner) classes cannot be made private or protected; they may only be given public or package access.
  • Inner classes can be created within a method or even an arbitrary scope. There are two reasons for doing this: 1. You're implementing an interface of some kind so that you can create and return a reference. 2. You're solving a complicated problem and you want to create a class to aid in your solution, but you don't want it publicly available.
  • Anonymous inner classes are somewhat limited compared to regular inheritance, because they can either extend a class or implement an interface, but not both. And if you do implement an interface, you can only implement one.
  • To understand the meaning of static when applied to inner classes, you must remember that the object of an ordinary inner class implicitly keeps a reference to the object of the enclosing class that created it. This is not true, however, when you say an inner class is static. A static inner class means: 1. You don't need an outer-class object in order to create an object of a nested class. 2. You can't access a non-static outer-class object from an object of a static inner class.
  • Ordinary inner classes cannot have static data, static fields, or static inner classes. However, static inner classes can have all of these.
  • As you've see earlier, in an ordinary(non-static) inner class, the link to the outer-class object is achieved with a special this reference. A static inner class does not have a special this reference, which makes it analogous to a static method.

TIJ——Chapter Ten:Inner Classes的更多相关文章

  1. TIJ——Chapter Seven:Reusing Classes

    Reusing Classes 有两种常用方式实现类的重用,组件(在新类中创建存在类的对象)和继承. Composition syntax Every non-primitive object has ...

  2. Journal entry of the eighth chapter to chapter ten

    Chapter eight: 当我们做一个项目的时候,一开始可能会信息满满,或者说是通过一些调查分析后觉得自己的团队能完全实现用户所提出的所有要求,但是,往往在很自信的时候,我们都会处处碰壁,因为组内 ...

  3. TIJ——Chapter One:Introduction to Objects

    ///:~容我对这个系列美其名曰"读书笔记",其实shi在练习英文哈:-) Introduction to Objects Object-oriented programming( ...

  4. TIJ——Chapter Eleven:Holding Your Objects

    Java Provides a number of ways to hold objects: An array associates numerical indexes to objects. It ...

  5. TIJ——Chapter Two:Everything Is an Object

    If we spoke a different language, we would perceive a somewhat different world. Ludwig Wittgenstein( ...

  6. Chapter 3 Discovering Classes and Object

    Chatper 3 Discovering Classes and Object Exercises: 1.What is a class? A class is a template for man ...

  7. TIJ——Chapter Fourteen:Type Information

    Runtime type information(RTTI) allows you to discover and use type information while a program is ru ...

  8. TIJ——Chapter Twelve:Error Handling with Exception

    Exception guidelines Use exceptions to: Handle problems at the appropriate level.(Avoid catching exc ...

  9. TIJ——Chapter Nine:Interfaces

    A class containing abstract methods is called an abstract class. If a class Contains one of more abs ...

随机推荐

  1. spring源码学习之容器的扩展(一)

    在前面的章节,我们一直以BeanFactory接口以及它的默认实现XmlBeanFactory为例进行解析,但是,spring还提供了另一个接口ApplicationContext,用于扩展BeanF ...

  2. TZ_16_Vue定义全局组件和局部组件

    1.定义全局组件 我们通过Vue的component方法来定义一个全局组件. <div id="app"> <!--使用定义好的全局组件--> <co ...

  3. TZ_13_Eureka的高可用

    1.Eureka Server即服务的注册中心,在刚才上一篇中,我们只有一个EurekaServer,事实上EurekaServer也可以是一个集群,形成高可用的Eureka中心. 目的:多个Eure ...

  4. float示例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. http请求生命周期流程

    https://mp.weixin.qq.com/s/fpA2CThk2L-YBw6z0k4rtw HTTP 请求/相应 1.客户端连接到Web服务器 一个HTTP客户端,通常是浏览器,与Web服务器 ...

  6. 文件上传之Java篇

    最近做了一个下载文档的功能,于是联想到了上传功能,于是自己研究了一下后台语言是java的情况下怎样实现将文件上传到指定的目录,以下是项目的语言: 1.后台用jfinal框架 2.前台用jquery提交 ...

  7. c#的DateTime的各种字符串格式

    今天看到工程里有关DateTime的有关知识,之前了解一些用法,比如怎么获取年月日,当前系统时间等等,但是,感觉还是有好多不知道,于是上网搜罗了一下,找到很多有关知识,现在与大家分享下:     Da ...

  8. linux目录结构详细说明

    Linux各目录及每个目录的详细介绍 [常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所 ...

  9. Python科学计算生态圈--Pandas

  10. 微信小程序--flex常用的属性

    Flex布局 display:flex 指定当前盒子为伸缩盒 flex-direction:column 把盒子内容垂直从上往下排列 row 把盒子内容垂直从左往右排列 flex-wrap: wrap ...