No enclosing instance of type Demo06 is accessible.

来源:互联网 发布:广电网络多少钱一年 编辑:程序博客网 时间:2024/06/05 06:30

先上图:
这里写图片描述
多么简单的一个小程序,确出现了一个看似“不可理解”的错误,实在令人捉急呀。。。。
No enclosing instance of type Demo06 is accessible. Must qualify the allocation with an enclosing instance of type Demo06 (e.g. x.new A() where x is an instance of Demo06).

错误提示:没有可访问的内部类的实例,必须分配一个合适的内部类的实例(如x.new A(),x必须是 Demo06的实例。)看着这句提示,是不是很着急,因为我已经用new实例化了这个类,为什么还不行呢?

看了看书,查了查资料,才发现问题的所在:

class 直接写的是动态的内部类,可是主程序是public static void main。
在Java中,类中的静态方法不能直接调用动态方法。只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法。
所以,最简单的解决办法是将public class改为public static class.

public class Demo06 {    public static class Person {        String name;        int age;        public void tell(){            System.out.println("姓名:"+name+",年龄:"+age);        }    }    public static void main(String[] args) {        // TODO Auto-generated method stub        Person person = null;               person = new Person();//      Person person = new Person();        person.name = "张三";        person.age = 30;        person.tell();    }}

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

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

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

那类是什么时候被加载呢?在需要调用的时候被加载。

0 0
原创粉丝点击