【定义】
内部类:定义在其它类内部的类。
外部类:包含内部类的类,也称 宿主类。
局部内部类:定义在方法里的内部类。

【接口内部类】
接口中也可以定义内部类,必须为public static修饰(自动添加),接口内部类只能时静态内部类。
【接口的内部接口】
接口的内部接口为接口成员,必须为public static(自动)。

【与外部类关系】
1,成员内部类是类成员。
     成员内部类:静态内部类、非静态内部类
2,局部内部类和匿名内部类不是类成员。

【内部类的作用】
1,内部类提供了更好的封装,其隐藏在外部类之内,不允许同一个包中的其他类访问该类。
2,内部类成员可以直接访问外部类的私有数据,因为内部类被当成为外部类的成员,同一个类的成员间可以相互访问。
     但外部类不能访问内部类的实现细节,例如内部类的成员变量。
3,匿名内部类适合用于创建那些仅需要一次使用的类。

【内部类与外部类定义时的区别】
1,内部类比外部类可以多使用三个修饰符:private、protected、static ——外部类不可以使用这三个修饰符。
2,为外部类定义子类,子类创建一个与父类的内部类同名的内部类不是重写,而是重新创建了一个新的属于子类的内部类。因为它们的命名空间不同。
     内部类的类名不是简单地由内部类的类名组成,而是还把外部类的类名作为一个命名空间,作为内部类类名的限制。

【内部类和外部类的作用域】
1,外部类:
同一个包内----默认(default)
任何位置------public
2,内部类:
同一个类----private
同一个包----default
同一个包的其他类和外部类的子类------protected
任何位置----public

【非静态内部类】
1,非静态内部类对象里,保存了一个它所寄生的外部类对象的引用,即
     当调用非静态内部类的实例方法时,必须有一个非静态内部类实例,非静态内部类实例必须寄生在外部类实例中。
2,外部类实例:OutterClass.this.
     内部类实例:this.
3,如果外部类要访问非静态内部类的成员,必须显示创建非静态内部类对象来调用访问其实例成员。
4,非静态内部类不能拥有静态成员。
5,不能在外部类的静态成员中直接使用非静态内部类。
6,非静态内部类的子类不一定是内部类,它可以是一个外部类。
     但对于非静态内部类的子类实例一样保留了一个引用,该引用指向其父类所在外部类的对象。
   如果有一个内部类的子类存在,则一定存在与之对应的外部类对象。

【静态内部类】
1,静态内部类属于外部类本身,不属于外部类的某个对象。也称 类内部类。
2,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
3,静态内部类的实例方法也不能访问外部类的是实例成员,只能访问外部类的静态成员。
4,外部类不可直接访问静态内部类成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,
     使用静态内部类的对象作为调用者来访问静态内部类的实例成员。

【局部内部类】

【匿名内部类】
定义:
new 实现接口() | 父类构造器(实参列表)
{
  //匿名内部类的类体部分
}

特点:
1,适用于创建只需要一次使用的类。
2,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。
3,匿名内部类必须继承一个父类或实现一个接口,但最多只能继承一个父类,实现一个接口。
4,匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。
5,匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器。
     匿名内部类可以定义初始化块,通过实例初始化块来完成构造器完成的事情。

匿名内部类的实现:
1,通过实现接口
匿名内部类不能显式创建构造器,因此匿名内部类只有一个隐式的无参数构造器,故new接口名后的括号里不能传入参数值。
2,通过继承父类
匿名内部类将拥有和父类相似的构造器,此处的相似指拥有相同的形参列表。

【Java8增强的匿名内部类】
1,从Java8以前,匿名内部类、局部内部类访问的局部变量必须用final修饰。
从Java8开始,匿名内部类、局部内部类允许访问非final的局部变量。
2,如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰。
3,Java8将这个功能称为"effectively final",它的意思是对于被匿名内部类访问的局部变量,可以用final修饰,也可以不用final修饰,
     但必按照有final修饰的方法来用——也就是一次赋值后,以后不能重新赋值。

例子:
class Demo
{
  public static void main(String[] args) {

    int age = 8;
    /* 
    age = 2; //报错

    Demo.java:11: 错误: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
    System.out.println(age);
    ^
    1 个错误

    定义age时指定了初值,后又对其赋值,导致Java8无法自动使用final修饰age局部变量,因此编译器会报错。
    (被匿名内部类访问的局部变量必须被final修饰)
    */
    A a = new A() {
      public void test() {
      //在Java8以前下面语句将提示错误:age必须使用final修饰
      //从Java8开始,匿名内部类、局部内部类允许访问非final的局部变量
      System.out.println(age);
      }
    };
    a.test(); //输出:8
  }
}

interface A
{
  void test();
}

Java疯狂讲义笔记——内部类的更多相关文章

  1. Java疯狂讲义笔记——枚举类

    枚举类 ——Java5[基础知识]1,定义枚举类——关键字 enum (地位与class.interface相同).2,枚举类是一个特殊的类,可以有成员变量.方法,实现一个或多个接口,定义自己的构造器 ...

  2. Java疯狂讲义笔记——Lambda表达式

    Java8新增的Lambda表达式 [特性]支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例. [组成部分]1,形参列表 ...

  3. java8--类加载机制与反射(java疯狂讲义3复习笔记)

    本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...

  4. 参考《Java疯狂讲义》

    参考<Java疯狂讲义>Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例 1. Lambda ...

  5. java8--NIO(java疯狂讲义3复习笔记)

    NIO采用内存映射文件的方式处理输入输出,NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了(这种方式模拟了操作系统上的虚拟内存的概念),通过这种方式来进行输入输出比传统的 ...

  6. 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制

    内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...

  7. 《Java疯狂讲义》(第3版)学习笔记 1 - 如何学习Java

    1.Java是一种面向对象语言,不要简单当做脚本使用.从基础学起,不要从Spring.J2EE.Hibernate和EJB开始学. 2.不要浮躁,应该扎扎实实先学好Java语言,然后按Java本身的学 ...

  8. java8--网络编程(java疯狂讲义3复习笔记)

    重点复习一下网络通信和代理 java的网络通信很简单,服务器端通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信. 需要重点看的工具类:I ...

  9. java8--异常处理(java疯狂讲义3复习笔记)

    try,catch,finally,throw,throws java将异常分为两种,Checked异常和Runtime异常. IndexOutOfBoundsException NumberForm ...

随机推荐

  1. 关于memset

    memset填充的是一个字节,比方下面的一段程序: #include <cstdio> #include <cstring> using namespace std; ]; i ...

  2. Jmeter BeanShell前置处理器、取样器、后置处理器

    前置处理器:BeanShell PreProcessor取样器 :BeanShell Sampler后置处理器:BeanShell PostProcessor 1.前置 import org.apac ...

  3. Flask学习笔记02之配置文件

    1. Flask默认的配置 Flask实例中包含了它的配置信息 #实例化一个Flask对象 app = Flask(__name__) # 打印默认配置信息 print(app.config) 打印结 ...

  4. 玩转MaxCompute studio SQL编辑器

    SQL因其简单易学的特点,是用户与MaxCompute服务交互的主要手段.如何帮助用户高效愉快的编写SQL是MaxCompute studio的核心使命,下面就让我们来一探究竟: 忘记语法 相信大家都 ...

  5. 16 :IDEA快速键

    ctrol+z ctrol+shift+z  重做 复制,粘贴,删除,(行操作,光标放在那里就可以操作,不要全选择) 注:特别:查询出来,文件是可以直接编辑的 crtol+F double +shif ...

  6. 实现网页qq在线咨询功能

    在自己的网页中实现qq在线咨询,给图片或链接添加地址为:tencent://message/?uin=你的qq号码!就可以了. <a href="tencent://message/? ...

  7. python 文件读写操作打开模式

    ‘r’:只读.该文件必须已存在. ‘r+’:可读可写.该文件必须已存在,写为追加在文件内容末尾. ‘rb’:表示以二进制方式读取文件.该文件必须已存在. ‘w’:只写.打开即默认创建一个新文件,如果文 ...

  8. 《Javascript设计模式与开发实践》关于设计模式典型代码的整理:单例模式、策略模式、代理模式、迭代器模式、发布-订阅模式、命令模式、组合模式

    1.单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 使用闭包封装私有变量// 使用闭包创建单例var user = (function () { var _name = 'sven' ...

  9. pycharm默认的模板修改python script

    #!/usr/bin/env python # encoding: utf-8 #set( $SITE = "https://www.cnblogs.com/c-x-a" ) &q ...

  10. IDEA设置Ctrl+滚轮调整字体大小(转载)

    按Ctrl+Shift+A,出现搜索框 输入mouse: 点击打开这个设置:勾选 点击ok,之后就可以通过Ctrl+滚轮 调整字体大小了. 转载自:http://www.cnblogs.com/LUA ...