先提纲挈领地来个总结:

内部类(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. MyEclipse6.5安装SVN插件方法

    MyEclipse6.5安装SVN插件,掌握了几种方法,本节就像大家介绍一下MyEclipse6.5安装SVN插件的三种方法,看完本文你肯定有不少收获,希望本文能教会你更多东西. 一.安装方法: My ...

  2. SQLSTATE[HY000] [2002] 乱码

    string(59) "SQLSTATE[HY000] [2002] ����Ŀ����������ܾ����޷����ӡ� " 实际意思是:SQLSTATE[HY000] [20 ...

  3. Spring学习:程序的耦合和解耦的思路分析

    程序的耦合 耦合:程序间的依赖关系 包括: 类之间的依赖 方法间的依赖 解耦: 降低程序间的依赖关系 在实际开发中: 应该做到,编译期不依赖,运行时才依赖 解耦思路: 第一步:使用反射来创建对象,而避 ...

  4. numpy使用中的疑惑

    numpy中有一些常用的用来产生随机数的函数,randn就是其中一个,randn函数位于numpy.random中,函数原型如下: numpy.random.randn(d0, d1, ..., dn ...

  5. Leetcode89. Gray Code格雷编码

    给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - ...

  6. Django项目:CRM(客户关系管理系统)--50--41PerfectCRM实现全局账号密码修改

    # gbacc_urls.py # ————————38PerfectCRM实现全局账号登录注销———————— from django.conf.urls import url from gbacc ...

  7. js构造函数+原型

    注:普通对象与函数对象 var o1 = {}; var o2 =new Object(); var o3 = new f1(); function f1(){}; var f2 = function ...

  8. MyEclipse使用总结——MyEclipse10.6 下添加jadClipse反编译插件[转]

    jad是一个使用比较广泛的Java反编译软件,jadClipse是jad在eclipse下的插件,下面像大家介绍下如何将jadclipse加入到MyEclipse10.X,9.X,8.X,6.X等各版 ...

  9. Ubuntu18.04 修改IP地址、查看网关、防火墙

    1. Ubuntu18.04 修改IP地址 修改 sudo vim /etc/netplan/50-cloud-init.yaml文件 # This file is generated from in ...

  10. python实例 列表

    #! /usr/bin/python # -*- coding: utf8 -*- #列表类似Javascript的数组,方便易用 #定义元组 word=['a','b','c','d','e','f ...