No enclosing instance of type xxx is accessible 问题及解答,静态方法调用动态方法问题
2017-04-28 16:14
453 查看
问题描述
编写Java代码验证:判别是否类的实例化对象的instanceof方法中, ,类名为instanceOfTest,在它的main方法中创建内部类的实例时,编译阶段出现错误,查看错误描述:Exception in thread "main" java.lang.Error: Unresolved compilation problem: No enclosing instance of type instanceOfTest is accessible. Must qualify the allocation with an enclosing instance of type instanceOfTest (e.g. x.new A() where x is an instance of instanceOfTest). at demo.instanceOfTest.main(instanceOfTest.java:33)
问题原因
因为内部类是动态的(无static关键字修饰),而main方法是静态的普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象,所以要在static方法(类加载时已经初始化)调用内部类的必须先创建外部类。
解决方案
方法一:创建动态内部类时,先创建内部类所属的外部类。
A a = new instanceOfTest().new B();
其中instanceOfTest为外部类,B为内部动态类,A为类B接口。
详细代码见GitHub:
https://github.com/JasonChen-666/JavaSE1.8/blob/master/instanceOfTest.java
方法二:
将内部类修改为静态类(类名前添加修饰static),就可以在main中直接创建内部类实例。
静态方法调用动态方法问题
1. 问题描述: Cannot make a static reference to the non-static method2. 问题原因:这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区,然后再在堆内存中创建对象。
所以说静态方法会随着类的加载而被加载。new一个对象时,该对象存在于对内存中,this关键字一般指该对象,但是如果没有new对象,可以直接通过类名调用该类的静态方法。
类的静态成员(变态和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;
非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建实例)的时候才会分配内存,然后通过类的对象去访问。
在一个类的静态成员中去访问非静态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。
3. 解决方案:要么将方法也改为静态方法,要么通过创建该方法所在的实例再通过实例来调用。
相关文章推荐
- JAVA编译错误 “No enclosing instance of type XXX is accessible”的解决方法
- Java中出现No enclosing instance of type XXX is accessible问题
- Java在编译运行时出现No enclosing instance of type XXX is accessible问题
- java解决 No enclosing instance of type XXX is accessible的问题
- Java中出现No enclosing instance of type XXX is accessible问题
- Java中出现No enclosing instance of type XXX is accessible问题
- Java中出现No enclosing instance of type XXX is accessible问题
- Java中出现No enclosing instance of type XXX is accessible问题
- Java解决No enclosing instance of type PrintListFromTailToHead is accessible问题的两种方案
- Java编译时出现No enclosing instance of type XXX is accessible.
- No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing 问题解释
- 验证参数传递引发的Java编译错误“No enclosing instance of type XXX is accessible" 及匿名内部类
- 【JAVA001】No enclosing instance of type XXX is accessible.
- No enclosing instance of type xxx is accessible
- 问题No enclosing instance of type E is accessible的解决
- Java出现No enclosing instance of type E is accessible问题解决
- No enclosing instance of type XXXis accessible. Must qualify the allocation ....
- No enclosing instance of type XXX is accessible
- Java解决No enclosing instance of type PrintListFromTailToHead is accessible问题
- 解决android出现static void xxx No enclosing instance of type xxx is accessible