java 构造函数嵌套_关于java:是否有与嵌套类关联的构造函数
我想知道是否有任何构造函数涉及到内部类。例如,考虑下面给出的代码片段
class MyOuter
{
private int x= 10;
class MyInner
{
void dostuff(){
System.out.println("The value of x is"+x);
}
}
}
在另一个Java文件中,我为MyOuter和MyLype类创建实例,如下所示
Class Program
{
public static void main(String [] args)
{
MyOuter mo = new MyOuter();
MyOuter.MyInner mi = mo.new MyInner();
mi.dostuff();
}
}
上面的代码片段编译得很好,给出了"x的值是10"的输出。
这里我想知道的是,当new()与myinner类和myouter类一起使用时,是否调用构造函数。如果是,那么是否存在从内部类到外部类的任何构造函数链接(比如子类调用超级类的构造函数等等)。
在扩展内部类时,可以观察内部类的构造函数链。
举个例子:
public class MainClass {
public MainClass(String value) {
System.out.println("mainValue:" + value);
}
public class NestedClass {
public NestedClass(String nestedValue) {
System.out.println("nestedValue:" + nestedValue);
}
}
}
然后像这样扩展嵌套类
public class NestedClassExtension extends NestedClass {
public NestedClassExtension(MainClass mainClass, String nestedValue) {
mainClass.super(nestedValue);
}
}
因此,您可以看到,您能够调用嵌套类的超级构造函数,将它传递给该构造函数MainClass,并在MainClass对象实例上调用.super。
现在,可以通过以下方式创建嵌套类扩展实例:
NestedClassExtension extension = new NestedClassExtension(new MainClass("main"),"nested");
所以主类必须存在,它的构造函数被称为第一个。然后是嵌套类的构造函数。
相反,如果要在MainClass之外创建NestedClass实例,则必须编写:
MainClass mc = new MainClass("main");
mc.new NestedClass("nested");
另一次,必须先创建MainClass,然后创建嵌套类。
只有在
MyOuter.MyInner mi = mo.new MyInner();
否则,它甚至不会调用内部类构造函数,因为它没有被实例化,就像执行静态块一样,但在创建对象之前,不会调用实例块和构造函数。
它们都是使用默认的无参数构造函数实例化的。继承的super()中没有类似的链接。只是如果不先实例化外部类,就不能实例化内部类。
读取静态和非静态内部类之间的区别。
如果不指定构造函数,将创建不带参数的默认构造函数。如果您声明任何其他构造函数,比如myinner(int i),那么缺省构造函数的创建将被省略,并且您必须自己声明它(如果需要)。每个对象(没有任何异常)都是通过调用构造函数创建的。
如果编译了建议的代码,然后运行Java反编译程序
javap MyOuter$MyInner
您将看到编译器如何实际声明内部类的构造函数:
public class MyOuter$MyInner extends java.lang.Object{
final MyOuter this$0;
public MyOuter$MyInner(MyOuter);
void dostuff();
}
在这里,您可以看到编译器通过声明包含对封闭类的引用的最后一个字段成员来实现内部类。字段被声明为最终字段,因此需要提供一个值来实例化您的Inner类。
执行MyOuter.MyInner mi = mo.new MyInner()操作时,编译器确保将封闭实例作为参数传递。
这是由编译器自动完成的,因此,您不能简单地将内部类的创建与外部类的创建链接起来,因为外部实例在您创建内部实例时必须已经存在。
但是,您可以在内部类的其他声明的构造函数之间进行构造函数链接。
例如,如果这样的代码:
public class MyOuter
{
private int x= 10;
public class MyInner
{
private int y = 0;
public MyInner(){
this(10);
}
public MyInner(int value){
this.y = value;
}
void doStuff(){
System.out.println("The value of x is"+x);
}
}
}
在这里,我将构造函数与内部类链接起来。
同样,反编译器确保解释所有这些内容,以确保将外部实例作为参数传递给内部实例:
public class MyOuter$MyInner extends java.lang.Object{
final MyOuter this$0;
public MyOuter$MyInner(MyOuter);
public MyOuter$MyInner(MyOuter, int);
void doStuff();
}
java 构造函数嵌套_关于java:是否有与嵌套类关联的构造函数相关推荐
- java try catch嵌套_解析Java中未被捕获的异常以及try语句的嵌套使用
Java未被捕获的异常 在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public st ...
- java核心教程_核心Java教程
java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...
- java程序设计 论文_《JAVA程序设计》论文要求
<JAVA程序设计>论文要求 1. 文字要求:2000字到3000字之间 2. 打印稿: 1) 纸张大小:A4 2) 题目:黑体,2号字 3) 班级 姓名 学号 EMAIL(题目下方):宋 ...
- java初始化数据报_初始化java原因
虚拟机的类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类 即虚拟机的类加载机制. 在Java中,类型的加载.链接 ...
- java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !
" 本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指 ...
- java初反射_初始 java 反射机制 (一)
反射机制详解 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为j ...
- java 进程运行时间_将Java类作为子进程运行
java 进程运行时间 我本周需要将Java类(而不是jar)作为子进程运行. 更确切地说,我想从测试内部产生一个新进程,而不是直接在测试内部(进程内)运行它. 我不认为这是幻想或复杂的事情. 但是, ...
- java高级教程_高级Java教程
java高级教程 课程大纲 学习Java基础很容易. 但是,真正钻研该语言并研究其更高级的概念和细微差别将使您成为一名出色的Java开发人员. 网络上充斥着"软","便宜 ...
- java字节码_掌握Java字节码
java字节码 嘿! Happy Advent:D我是ZeroTurnaround的技术布道者Simon Maple( @sjmaple) . 您知道, JRebel伙计们! 由于编写了类似JRebe ...
最新文章
- 权限表管理之删除权限表数据
- SAP PI 集成引擎
- struts2学习笔记(二):Struts2配置
- delphi 关闭时缩小到托盘_delphi 实现最小化系统托盘
- Q109:用PBRT渲染Blender导出的模型(3)
- 很牛的vim使用技巧nbsp;转载来的
- 集训队论文之经典数学题【收藏】
- 简单通俗理解MRF马尔可夫随机场
- 膜片联轴器市场现状及未来发展趋势
- butter滤波器是iir吗_IIR Butterworth型模拟低通滤波器设计原理
- 关于本博客博皮的几点改进与释疑
- 每日英语:Etiquette Catches On in China, Even in Government
- 手机翻书效果html,移动端实现翻书效果
- Web基础-JSON和AJAX
- 【githubshare】开源的文件文档在线预览项目,支持主流办公文档的在线预览,如 doc、docx、Excel、pdf、txt、zip、rar、 图片等
- 2015计算机基础知识,计算机基础知识题库【2015版】
- 程序员成长之路(四)之有用的网址
- 等保测评 安全计算坏境之linux操作系统
- 日志审计系统的基本原理与部署方式
- MixMarvel | 区块链项目介绍