No enclosing instance of type xxx is accessible 问题及解答,静态方法调用动态方法问题

来源:互联网 发布:mysql select嵌套 编辑:程序博客网 时间:2024/06/16 03:38

问题描述

编写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 method

2. 问题原因:这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区然后再在堆内存中创建对象

所以说静态方法会随着类的加载而被加载。new一个对象时,该对象存在于对内存中this关键字一般指该对象,但是如果没有new对象,可以直接通过类名调用该类的静态方法

类的静态成员(变态和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;

非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建实例)的时候才会分配内存然后通过类的对象去访问

在一个类的静态成员中去访问非静态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存中不存在的东西当然会出错

3. 解决方案:要么将方法也改为静态方法,要么通过创建该方法所在的实例再通过实例来调用

1 0
原创粉丝点击