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

【接口内部类】
接口中也可以定义内部类,必须为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. [洛谷P2459] SDOI2011 消耗战

    问题描述 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望.已知 ...

  2. Access分页语句

    一.双TOP法高效率的Access分页的SQL语句,语法格式: SELECT * FROM (SELECT TOP "&pagesize&" * FROM (SEL ...

  3. Android逆向之旅---静态分析技术来破解Apk

    一.前言 从这篇文章开始我们开始我们的破解之路,之前的几篇文章中我们是如何讲解怎么加固我们的Apk,防止被别人破解,那么现在我们要开始破解我们的Apk,针对于之前的加密方式采用相对应的破解技术,And ...

  4. python_012

    一.内置函数 1.sorted()排序函数 a:语法sorted(Iterable,key = None,reverse = False) Iterable:可迭代对象;key:排序规则(函数) ls ...

  5. 【2019 Multi-University Training Contest 8】

    01: 02: 03:https://www.cnblogs.com/myx12345/p/11655876.html 04: 05: 06:https://www.cnblogs.com/myx12 ...

  6. 攻防世界 | CGfsb

    所以题目要求是输入生日1926l

  7. toutiao url

    https://it.snssdk.com/article/v2/tab_comments/?group_id=6485899113563947533&item_id=648589911356 ...

  8. PHP的重载-使用魔术方法实现

    摘录PHP官网对PHP重载的解释: PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法.我们是通过魔术方法(magic method ...

  9. 虚拟机中安装Linux_Centos7操作系统(最小化安装)

    我们打开之前安装的VM, 点击 “创建新的虚拟机”: 我们选 典型 安装  简单点 然后下一步: 我们稍后安装操作系统 ,点下一步: 这里选 Linux 然后下拉 选CentOS 64位,然后下一步: ...

  10. P1199三国游戏

    众所周知,三国题材的游戏很多,小涵遇到了其中之一 传送 这个题显然用贪心做,但是怎么贪心? 首先我们只知道计算机的策略,但我们不知道小涵的策略.所以我们要想小涵是怎么挑的. 计算机的策略是拆掉你每次选 ...