1.创建内部类对象

  1. 创建内部类对象(相当于new内部类对象) 外围类对象.new 内部类( )。
  2. 创建内部类对象一种方法是 外围类有一个方法返回内部类对象。
  3. 没有外围类对象就不能创建内部类对象,因为内部类对象会暗暗连接到外围类对象上。
  4. 如果是嵌套类(静态内部类)无需外围类对象引用就可创建。Outer.Inner in  = Outer.Inner();

2.创建内部类引用 in

  • Outer.Inner in ,无论在什么其他类内还是在所在的外围类内。
  • 内部类内创建外围类对象引用out : Outer.this out

3. 匿名内部类

  • 只知其超类不知其自身叫什么类。
public Test f(){

        return new Test(){         // 从方法返回值可以看出要返回一个Test对象,new Test(){}; 就是一个Test的匿名内部类对象,
                                
//类数据成员 // Test是匿名内部类的基类
//类方法             // 在匿名内部类内可以定义额外的方法,成员,也可以覆写Test的方法。
}; }

结果:  调用一次f()就创建了一个继承自Test的匿名对象,并自动向上转型为Test引用,并返回这个引用。

  1. 匿名内部类如果需要一个外围类定义的对象那么这个对象的参数一定是final

    public Test f( final String a1){
    
        return new Test() {   
    
            String s = a1;
    
        };
    
    }
  2. 匿名内部类没有名字也就谈不上有构造器(构造器必须类名相同),若想在创建匿名对象时执行初始化行为就像构造器那样,通过实例初始化,就可以做到构造器行为。
  3. 要扩展一个类可以继承或者实现接口,而且能实现多个接口,而使用匿名内部类来扩展类,那么一个匿名内部类要么继承,要么实现接口,实现接口也只能实现一个。
    class A extends B implements C,D{    //要扩展A 可以同时继承B,实现C,D多个接口
    
        Animal f = new Animal() {    //使用匿名内部类,一个匿名内部类只能实现一个接口,而且不能再继承,
    // 当然可以使用多个匿名内部类分别实现继承,或者其他接口 @Override
    public void fly() {
    // A 中的匿名内部类 实现了接口 }
    };
    }
  4. 线程常用的一个匿名内部类的例子
    public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread().start(); //启动一个线程 new Thread(new Runnable() { // 使用Thread类的public Thread(Runnable target)构造器,
//向里传入一个实现Runnable接口的匿名内部类,并启动。 @Override
public void run() {
// TODO Auto-generated method stub }
} ).start(); new Thread(){public void run() {};}.start(); // 创建一个Thread类的匿名内部类,覆写run方法,并启动。 }

4.嵌套类

  • static 内部类 ,内外部类对象间无联系。 static类就是一个单独的存在,只是把它放在了一个类中。
  1. 嵌套类因为是静态的所以不能访问外围类的非静态成员对象
  2. 普通内部类不能有 static 字段和static数据成员,也不能再嵌套一个内部类,但嵌套类这些都可以有。

5.接口的内部类

  • 因为接口中任何类自动都是public和static,故无需写static也是嵌套

6.为什么需要内部类

  • 内部类可以解决部分多重继承问题
  • 内部类可以独立继承实现接口,与外围类是否继承了该接口无关。
  • 内部类操作外围类的对象,提供进入外围类的窗口

7.闭包

  • 闭包是对象,记录了一些来自于创建它的作用域的对象。

8.什么是回调。

  • A给B发消息,B处理完后调用A的方法执行处理结果。
  • 回调的灵活性: 在运行时动态的决定调用什么方法。

9.继承内部类

class B {
class A {
}
} class C extends B.A { //C只继承内部类
C(B b) { //创建C对象需要调用A的构造器,但调用A的构造器必须有B的引用
b.super(); //给C的构造器传入一个B的引用,然后调用基类A的构造器
}
}

注意: b.super()代表用B引用调用C类的基类构造器,而不是调用B基类的构造器

  1. 子类覆写基类的内部类后,这两个内部类就是两个独立的内部类,因为所在命名空间不同,与方法覆写不同。
  2. 内部类可以继承内部类,作为基类的内部类一定是Outer.Inner

10. 局部内部类

-------以后补充

知识点

  1. 多层嵌套中,不管嵌套了多少层它们总归在一个类中,同一个类内成员间可以相互访问(但要注意是不是static),哪怕是private
  2. 应用程序框架:是被用来以解决某些特定问题的一个类或者一组类。
  3. 控制框架是特殊的应用框架。

《Java编程思想》笔记 第十章 内部类的更多相关文章

  1. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

  2. java编程思想笔记(1)

    java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...

  3. #Java编程思想笔记(一)——static

    Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...

  4. 2.1(java编程思想笔记)位移操作

    java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...

  5. java继承内部类问题(java编程思想笔记)

    普通内部类默认持有指向所属外部类的引用.如果新定义一个类来继承内部类,那“秘密”的引用该如何初始化? java提供了特殊的语法: class Egg2 { public class Yolk{ pub ...

  6. 7.JAVA编程思想笔记隐藏实施过程

    欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040237 "进行面向对象的设计时,一项主要的考虑是:怎样将发生变 ...

  7. Java编程思想笔记

    打好java基础 后续会增加相应基础笔试题 目录如下 1 对象导论2 一切都是对象3 操作符4 控制执行流程5 初始化与清理6 访问控制权限7 复用类8 多态9 接口10 内部类11 持有对象12 通 ...

  8. java编程思想笔记(第一章)

    Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5 ...

  9. java编程思想笔记(一)——面向对象导论

    1.1 抽象过程 1.所有编程语言都提供抽象编程机制. 2.人们所能够解决的问题的复杂性直接取决于抽象的类型(所抽象的是什么)和质量. 3."命令式"语言(basic,c等)都是对 ...

  10. Java编程思想笔记(第二章)

    第二章  一切都是对象 尽管Java是基于C++的,但相比之下,Java是一种更纯粹的面向对象程序设计语言. c++和Java都是杂合型语言(hybird language) 用引用(referenc ...

随机推荐

  1. Dispose的调用顺序

    非托管资源的释放顺序. 这是应该先释放 reader  再释放 stream. 或者直接使用using,防止出错 .

  2. Android隐藏键盘

    今天接到的任务是在验证码输入框中加入键盘监听事件,需要点击Enter实现登录,这个比较好实现,但是在登录时,键盘并没有隐藏掉,看上去很别扭,因此,百度了一堆方法,但是都无济于事,最后找到了一个,如下, ...

  3. STL Allocator

    从上面这个程序可以看出,我们这里手动使用了分配器,分配器有很多种类,有std::,还有非std::,也就是上面的__gnu_cxx下面的,我们在使用容器的时候不关心我们使用什么分配器,也不关心我们如何 ...

  4. Java相关配置合集

    Java环境变量配置: 1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为C:\java\jdk1.6.0_08: 2.安装完成后,右击“我的电脑”,点击“属性”: 3.XP选 ...

  5. JMS实战——ActiveMQ实现Pub-Sub

    前言 上篇博客<JMS实战--ActiveMQ>介绍了ActiveMQ的安装,并实现了简单的PTP模型.这篇博客我们来看一下Pub-Sub模型,之后来总结一下JMS. 实现 项目结构 其中 ...

  6. 【PHP】- 全局变量global和$GLOBALS的区别

    1.global global关键字的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件. 但是在函数体内定义的global变量, ...

  7. 封装 RabbitMQ.NET

    这篇文章内容会很短,主要是想给大家分享下我最近在做一个简单的rabbitmq客户端类库的封装的经验总结,说是简单其实一点都不简单.为了节省时间我主要按照Library的执行顺序来介绍,在你看来这里仅仅 ...

  8. linux cfs 负载均衡

    确定新的负载的时候,代码中给出的公式是: (old×(2^i-1) + new))/2^i 整理下来是: old + (new-old)/2^i i的范围是[1, 4],也就是说,i的层级越高,那么n ...

  9. [BZOJ5417] [NOI2018]你的名字

    Description 小A 被选为了ION2018 的出题人,他精心准备了一道质量十分高的题目,且已经把除了题目命名以外的工作都做好了. 由于ION 已经举办了很多届,所以在题目命名上也是有规定的, ...

  10. [洛谷P1361]小M的作物

    题目大意:将作物种在A,B两地,对于每种作物,种A,B分别有不同的收益,对于一些特殊的作物集合,共同种到A,B集合分别有一些额外收益.求最大收益. 题解:最小割,S向i连容量为$a_i$的边,i向T连 ...