热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java内部类方法_java方法本地内部类与内部类

java-方法本地内部类与内部类下面的代码产生输出classA。谁能详细解释这是怎么发生的?是否因为在go()方法中创建classA的实例之后才出现297370833

java-方法本地内部类与内部类

下面的代码产生输出class A。谁能详细解释这是怎么发生的?

是否因为在go()方法中创建class A的实例之后才出现29737083357170170768的“内部”版本声明?

class A {

void m() {

System.out.println("outer");

}

}

public class MethodLocalVSInner {

public static void main(String[] args) {

new MethodLocalVSInner().go();

}

void go() {

new A().m();

class A {

void m() {

System.out.println("inner");

}

}

}

class A {

void m() {

System.out.println("middle");

}

}

}

6个解决方案

38 votes

我猜您期望本地类方法被调用。 那没有发生,因为您正在使用new A()超出本地类的范围。 因此,它访问范围内的下一个更接近的候选对象,即内部类。 根据JLS§6.3:

紧接在块中的局部类声明的范围(第14.2节)是紧随其后的块的其余部分,包括它自己的类声明。

因此,方法的第一行中的new A()将无法访问其后出现的本地类。 如果在此之前移动类声明,则将获得预期的输出。

另请参见JLS§14.3,其中包含类似的示例。

Rohit Jain answered 2020-07-19T18:49:26Z

17 votes

由于代码的顺序,您将获得“中间”输出。 由于在调用class A之后发生了方法范围为297370921642020142014的情况,因此您将获得输出“ middle”。 如果按以下方式切换顺序,则将获得输出“ inner”:

void go() {

class A {

void m() {

System.out.println("inner");

}

}

new A().m();

}

输出:

class A

从高到低实例化class A的优先顺序为:

方法

请查看有关内部类的正式Java语言规范,以获取更多信息。

Tim Biegeleisen answered 2020-07-19T18:50:17Z

7 votes

无法打印MethodLocalVSInner的原因是(6.3):

一个块紧紧包围的局部类声明的范围是紧紧包围的块的其余部分,包括它自己的类声明。

(在方法内部声明的类称为本地类。)

因此MethodLocalVSInner无法引用本地类,因为表达式A出现在声明之前。 换句话说,局部类的作用域与局部变量相似。

打印MethodLocalVSInner而不是A的原因是内部类n遮盖了顶级类d(6.4.1):

类型为A的声明MethodLocalVSInner遮盖了范围为d的任何其他类型的名为n的声明。

这意味着在MethodLocalVSInner正文中的任何位置,不合格的A必须引用内部类。

如果您熟悉成员变量的影子,例如:

class Example {

int x;

void setX(int x) {

// ┌ 'x' refers to the local method parameter

this.x = x;

}

}

本质上,类声明也是如此。

Radiodef answered 2020-07-19T18:51:13Z

4 votes

情况1:

void go() {

new A().m();

class A {

void m() {

System.out.println("inner");

}

}

}

在这种情况下,如果您在本地类范围之外运行方法。 那就是为什么它将打印middle

情况2:

void go() {

class A {

void m() {

System.out.println("inner");

}

}

new A().m();

}

在这种情况下,它将打印inner,因为该类现在在范围内。

Sumit Singh answered 2020-07-19T18:51:46Z

2 votes

在方法中:

void go() {

new A().m();

class A {

void m() {

System.out.println("inner");

}

}

}

当方法开始执行时,将执行第一行inner

并且因为内部类已经在范围内,所以将创建该类的对象,并且将为inner class而不是为local method class调用inner方法,因为它仍不在范围内。 这就是为什么您得到middle作为输出的原因。

但是如果您将方法更改为:

void go() {

class A {

void m() {

System.out.println("inner");

}

}

new A().m();

}

您的本地方法类现在将在范围内,并且具有更高的优先级,因此您现在将获得输出inner。

Prashant answered 2020-07-19T18:52:23Z

1 votes

您正在使用A class的实例调用A()方法

里面的方法您正在创建A()的实例在这里,因为您没有显式导入外部A class,并且直接内部类位于方法调用语句之后,所以JVM选择了MethodLocalVSInner的类级别的inner class A,并在其中执行go方法

Thusitha Thilina Dayaratne answered 2020-07-19T18:52:48Z



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
author-avatar
坐在河边的蚂蚁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有