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

【接口内部类】
接口中也可以定义内部类,必须为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. MongoDB Compass管理工具下载、安装和使用

    内容来自:https://jingyan.baidu.com/article/925f8cb884f6f8c0dce0565a.html ,https://blog.csdn.net/bg101775 ...

  2. Flask之路由相关

    1.装饰器中的参数 @app.route("/info", methods=["GET", "POST"]) def student_inf ...

  3. Keyguard分析

      从Android 6.0开始,位于frameworks/bases/packages/Keyguard的Keyguard开始被编译为一个jar包,被SystemUI静态导入,相当于SystemUI ...

  4. OC+RAC(六) 核心方法bind

    -(void)_test6{ RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> ...

  5. 2017ICPC沈阳网络赛 HDU 6205 -- card card card(最大子段和)

    card card card Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. centos7中yum安装lamp环境

    一.准备工作 1.1 环境 操作系统:centos7(CentOS-7-x86_64-Minimal-1708) 硬件:(这个根据项目运行和配置建议设置,一般我先配个1核1G) 1.2 关闭selin ...

  7. 阿里云code上传代码

    1-从官网下载git,然后安装,这一步可以百度. 2-在阿里云上面创建project,如图 3-回到本地,进入本地代码文件目录,右击打开git 4-输入git init 在文件夹下面会出现.git文件 ...

  8. python tensorflow windows环境搭建体验

    1. 需先安装python3.7,anaconda包管理器(类似java的maven),tensorflow,pycharm开发工具.文末附件下载地址. 2. 安装tensorflow,开始-Anac ...

  9. Js定义一个表单并提交

    Js定义一个表单 var form = $("<form>"); //定义一个form表单 form.attr('style', 'display:none'); // ...

  10. Python笔记(二十)_多态、组合

    多态 对于函数中的变量,我们只需要知道它这个变量是什么类,无需确切地知道它的子类型,就可以放心地调用类的方法,而具体调用的这个方法是作用在父类对象还是子类对象上,由运行时该对象的确切类型决定,这就是多 ...