在 Java 中,为什么需要创建内部类对象之前需要先创建外部类对象

  我们知道,在 Java 中,创建一个内部类对象之前,需要它的一个外部类对象。这是因为内部类可能使用外部类的数据。

  在内部类中,有一个隐式字段指向其外部类的对象,而这个字段是内部类在被创建时,隐式初始化的。具体来说,内部类所有的构造器都自动被插入了一个匿名隐式形参,这个匿名隐式形参就是外部类对象引用,它被作为所有构造器的第一个形参,且自动用于完成对外部类对象引用的初始化。

  当使用外部类对象来创建内部类对象时,这个隐式形参不需要额外作为实参提供给内部构造器。创建内部类对象的外部类对象将自动被用于初始化上述隐式字段。

  当使用反射来调用内部类的构造器时,需要把外部类对象作为构造器的第一个实参传入。示例代码如下。

package demo;public class Outer {private String outerData;public Outer(String outerData) {this.outerData = outerData;}public String getOuterData() {return outerData;}public void setOuterData(String outerData) {this.outerData = outerData;}public class Inner {private String innerData;public Inner(String innerData) {this.innerData = innerData;}public String getInnerData() {return innerData;}public void setInnerData(String innerData) {this.innerData = innerData;}public String getOuterData() {return outerData;}public void setOuterData(String externalData) {outerData = externalData;}public String getTravelInfo() {return innerData + " is on board the " + outerData + " now.";}}
}
package demo;import java.lang.reflect.InvocationTargetException;public class Other {public static void main(String[] args)throws NoSuchMethodException, IllegalAccessException,InvocationTargetException, InstantiationException {/*****************************************************//*** 使用外部类对象创建内部类对象*/Outer train = new Outer("train");Outer.Inner alice = train.new Inner("Alice");Outer.Inner bob = train.new Inner("Bob");System.out.println(alice.getTravelInfo()); // Alice is on board the train now.System.out.println(bob.getTravelInfo()); // Bob is on board the train now./*** 外部类对象 sea 与两个内部类对象相绑定。* 例如,当外部类对象 sea 的信息改变时,* 这两个内部类对象引用的关于外部类信息也会改变*/train.setOuterData("China Harmony");System.out.println(alice.getTravelInfo()); // Alice is on board the China Harmony now.System.out.println(bob.getTravelInfo()); // Bob is on board the China Harmony now./*---------------------------------------------------*//*****************************************************//*** 借助反射来动态绑定内部类与外部类*/Outer outer = Outer.class.getConstructor(String.class).newInstance("Hello, world.");Outer.Inner inner = Outer.Inner.class.getConstructor(Outer.class, String.class).newInstance(outer, "Hello, my world.");System.out.println(inner.getOuterData()); // Hello, world.System.out.println(inner.getInnerData()); // Hello, my world./*---------------------------------------------------*/}
}

在 Java 中,为什么需要创建内部类对象之前需要先创建外部类对象相关推荐

  1. java 通常在函数内部创建对象还是在外部创建对象_java中为什么在主函数中创建外部类对象可以,创建内部类对象就失败了呢?2类不都是非静态的吗?...

    展开全部 public class OuterClass { public static void main(String[] args) { OuterClass outerClass = new  ...

  2. Java中的四种内部类

    Java中有四种内部类: 成员内部类:定义在另一个类(外部类)的内部,而且与成员属性和方法平级,故称成员内部类.类比于外部类的非静态方法,如果用static修饰就变成了静态内部类 静态内部类:使用st ...

  3. java四种内部类区别_浅谈Java中的四种内部类

    如果你看过一些JDK和框架源码的话,就经常会发现一般在类的定义中,都会再定义一些其他的类,这些类也同样会被编译成字节码文件,这样的类就被叫做 内部类 ,按照一般的分法,大致可以分为以下四类: 成员内部 ...

  4. java内部类外部类_Java内部类:如何在内部类中返回外部类对象

    Nasted Class 的介绍,请详见参考 今天讨论的不是不是内部类的概念,而是具体使用的一个场景-如何在内部类中返回外部对象 (孤猪:我在程序里也碰到过一次这样的状况,非静态内部类可以直接调用外部 ...

  5. java中创建对象的一般格式是什么_Java零基础快速入门|对象的创建和使用(下)...

    本篇文章主要内容:构造方法Constructor 空指针异常 当实例变量是一个引用 方法调用时参数的传递问题 难点解惑 构造方法Constructor 什么是构造方法?构造方法怎么定义?构造方法怎么调 ...

  6. java 中静态内部类与普通内部类的区别

    1.静态内部类与普通内部类的区别 1)普通内部类不能脱离外部类被创建:静态内部类可以脱离外部类被创建. 2)普通内部类可访问外部类的静态和非静态成员变量和方法(包括私有属性),因其在外部类内部:静态内 ...

  7. java中有几种内部类,Java中的四种内部类

    四种内部类 在Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的 内部类一般来说包括这四种:静态内部类.匿名内部类.成员内部类和局部内部类,下面我们一一介绍 ...

  8. java中io流如何创建一个文件_,Java中Io流操作-File类的常用操作-创建文件,创建文件夹...

    package com.hxzy.IOSer; import java.io.File; import java.io.IOException; public class Demo03 { publi ...

  9. Java中创建对象的六个步骤 细分后(new关键字)对象头详细介绍

    要看的懂对象的创建过程,首先你得有对Java虚拟机和Java基础以及JUC很是熟悉, 比如类的加载过程.CAS.多线程.JVM的GC等等 文章目录 一.创建对象的六个步骤: 二.对象头的内部结构 首先 ...

最新文章

  1. 内存泄露排查之线程泄露
  2. TIOBE 9月编程语言排行榜
  3. vb中如何才能有手型的光标?
  4. Linux下的buffer与cache
  5. java 有序列表_java有序列表
  6. Linq-语句之Select/Distinct和Count/Sum/Min/Max/Avg
  7. python中int转换为时间戳_python日期和时间戳互相转化操作详解
  8. python列表输入数字逗号隔开_第一行Python代码之我的第一个Project(3)
  9. Android手机录制音频
  10. 使用FreeSWITCH SIP落地的配置总结
  11. 2021WordPress转z-blog搬家教程_WordPress搬家zblog博客程序工具
  12. lomboz 官方网址
  13. 如何确定聚类簇数 (k)
  14. java如何使用barcode4j生成条形码_JAVA条形码生成组件barcode4j使用
  15. 智能家居普及的最大障碍:如何“排座次”
  16. 【量化】验证《股市操盘宝典》对周期论
  17. matlab导入表格画图,matlab从excel表格导入数据画图-在matlab上如何导入excel表格然后画图...
  18. php中implode什么意思,implode是什么意思中文翻译
  19. C#代码CRUD操作MySQL数据库
  20. 手写简易版链表及原理分析

热门文章

  1. 集合对象的声明和初始化
  2. Docker学习笔记_网上资源参考
  3. 在Ubuntu 16.04下安装Matlab 2017a
  4. BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
  5. Linux SendMail服务启动慢总结
  6. 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结...
  7. JavaEE6入门02—Myeclipse8.5+GlassFish
  8. oracle rownum 学习
  9. [新手必备]Python 基础入门必学知识点笔记
  10. 解决ssh7.4升级8.5后环境变量失效和无法登录问题