文章原地址:https://www.cnblogs.com/runnigwolf/p/5570810.html

Java编写代码过程中遇到了一个问题,main方法中创建内部类的实例时,编译阶段出现错误,查看错误描述

No enclosing instance of type NoUseThreadDemo is accessible. Must qualify the allocation with an enclosing instance of type NoUseThreadDemo (e.g. x.new A() where x is an instance of NoUseThreadDemo).

参考文章:

Multiple markers at this line
 - The value of the local variable test is not used
 - No enclosing instance of type StaticCallDynamic is accessible. Must qualify the allocation with an enclosing instance of type StaticCallDynamic (e.g. 
  x.new A() where x is an instance of StaticCallDynamic).

经过查证,是因为内部类是动态的(无static关键字修饰),而main方法是静态的,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象,所以要在static方法(类加载时已经初始化)调用内部类的必须先创建外部类。即应该这样创建“DanymicTest test = new StaticCallDynamic().new DanymicTest();”其中StaticCallDynamic为外部类,DanymicTest为内部动态类;如果将内部内修改为静态类,可以在main中直接创建内部类实例。

  顺便看了下静态方法对动态方法的调用,如果在静态方法中直接调用动态方法,其中print()为类中的动态方法,会出现如下问题:

Cannot make a static reference to the non-static method print() from the type StaticCallDynamic

  这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后再在堆内存中创建对象。所以说静态方法会随着类的加载而被加载。当你new一个对象时,该对象存在于堆内存中,this关键字一般指该对象,但是如果没有new对象,而是通过类名调用该类的静态方法也可以。

  程序最终都是在内存中执行,变量只有在内存中占有一席之地时才会被访问,类的静态成员(变态和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问,非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建实例)的时候才会分配内存,然后通过类的对象去访问。在一个类的静态成员中去访问非静态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。

  所以要么将方法也改为静态方法,要么通过创建该方法所在的实例再通过实例来调用。

Java静态方法调用内部类相关推荐

  1. Java静态方法调用非静态方法

    静态方法(static mehod)不能直接调用非静态方法(non-static method),可以通过一个对象的引用传入静态方法中,再去调用该对象的非静态方法.在主函数(static方法)中,经常 ...

  2. java 静态方法 调用非静态方法_面试官:为什么java中静态方法不能调用非静态方法或变量?...

    这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下: 一.例子 我们先看效果: 我们在静态方法main中调用非静态变量 ...

  3. java 静态方法 调用非静态方法_java静态方法调用非静态方法

    我们都知道,静态static方法中不能调用非静态non-static方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-s ...

  4. java静态方法调用非静态变量_[java]静态方法访问非静态方法的方法

    是不是是有点拗口哈,在刚开始的开发中,经常会碰到"无法访问非静态方法",如下: Test.java public Test{ public void notStatic(){ Sy ...

  5. java 内部类 静态方法调用_内部类和静态内部类的调用

    package day6$6; public class Inside { public static void main(String[] args) { //先创建一个外部类对象 Outside ...

  6. 基于静态类型分析的java程序函数调用图构建方法研究,JAVA的静态方法调用

    JAVA的静态方法调用 介绍一种数据流程分析,这种分析计算存在不同地址并由方法调用返回的引用.分析的结果用来估算方法调 (本文共4页) 阅读全文>> 介绍一种数据流程分析,这种分析计算存在 ...

  7. java的静态方法调用

    首先你要知道java中静态方法调用有哪几种 例如一个静态方法如下: (1) 通过类名直接调用 调用格式: 类名.方法名 Test.aa() 前提是这个静态方法是要有返回值!这个静态方法是公共的(pub ...

  8. java static getclass_如何从Java中的静态方法调用getClass()?

    如何从Java中的静态方法调用getClass()? 我有一个必须有一些静态方法的类. 在这些静态方法中,我需要调用方法getClass()来进行以下调用: public static void st ...

  9. JAVA 静态方法和成员方法、静态方法的调用

    静态方法与成员方法 定义方法的时候,有static和没有static有什么区别? 1.有static的方法,叫静态方法. 2.没有static的方法,叫成员方法(实例方法). 定义静态方法的格式: p ...

最新文章

  1. 乐高无限无法进入服务器,乐高无限6.13更新 无法进入游戏问题修复
  2. JZOJ__Day 6:【普及模拟】神奇的项链(fett)
  3. python mysqldb 查询不到最新记录_python – MySQLdb是否缓存SELECT结果?
  4. 【网络信息安全】网络信息安全概述
  5. 大疆aeb连拍_大疆 AIR2 玩机(一)包围曝光及后期处理
  6. Golang入门教程(九)复合数据类型使用案例二
  7. do_fork实现--上
  8. 【光学】基于matlab像面数字全息离轴干涉模拟【含Matlab源码 215期】
  9. 密度聚类( DBSCAN )
  10. Quartus prime工程中各种文件的后缀及意义
  11. vue项目静态图片不显示
  12. 2020-11-04 [蓝桥杯2018决赛]阅兵方阵
  13. ap位置服务器怎么找,如何正确选择无线AP的安装位置?
  14. mysql的strict_linux关闭mysql strict mode的方法介绍
  15. Ubuntu18.04grub增加console口输出
  16. pdf文件在前端展示的三种方法
  17. OTT发展背后的融合通讯
  18. Vertica资源池
  19. h5活动是什么意思_浅谈什么是H5页面,怎么制作h5页面
  20. sql study conclusion

热门文章

  1. python 迷宫问题
  2. 酷睿cpu 计算速度
  3. web渗透测试之代码审计
  4. gitlab 修改项目备注
  5. java接口安全性解决方式
  6. python 人工智能库_python机器学习库sklearn——集成方法
  7. selenium解决验证码的方法
  8. 【BZOJ 1192】[HNOI2006]鬼谷子的钱袋
  9. C# 使用 DictionaryEntry 在WinForm中给 ComboBox 添加 Key 和 Value
  10. 自动化测试用例设计原则(接口自动化用例设计的基本原则)