No enclosing instance of type Demo06 is accessible.

原创 2015年11月21日 11:43: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对象,而是通过类名调用该类的静态方法也可以。

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

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

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

版权声明:本文为博主辛苦整理文章,转载请注明出处:http://blog.csdn.net/shangguanyunlan

Java中的嵌套类、内部类、静态内部类

嵌套类可以分为两种,静态的和非静态的,即静态嵌套类和非静态嵌套类。非静态嵌套类又叫做内部类(Inner Class)。我们通常所说的静态内部类其实是不严格的,严格的说应该叫做静态嵌套类(Static ...
  • sunqunsunqun
  • sunqunsunqun
  • 2015年06月14日 12:03
  • 3976

Swift编程语言学习12 ——实例方法(Instance Methods)和类型方法(Type Methods)

方法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法;实例方法为给定类型的实例封装了具体的任务与功能。类、结构体、枚举也可以定义类型方法;类型方法与类型本身相关联。类型方法与 Obje...
  • zpf8861
  • zpf8861
  • 2014年07月25日 08:51
  • 1357

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

问题描述编写Java代码验证:判别是否类的实例化对象的instanceof方法中, ,类名为instanceOfTest,在它的main方法中创建内部类的实例时,编译阶段出现错误,查看错误描述:Exc...
  • u014166319
  • u014166319
  • 2017年04月28日 16:14
  • 248

在外部类中创建内部类的对象时报错No enclosing instance of type Outside is accessible···的解决方

在学习内部类的时候自己写了一个内部类的代码试验了一下,代码如下public class Outside { public class Inner{ public void show(){ Sys...
  • theEmperor
  • theEmperor
  • 2016年10月20日 16:06
  • 294

sonar常见问题及修改建议

如今,大家都用sonar工具扫描自己的项目代码,以提高自己的代码质量。关于sonar工具的使用以及本地sonar环境搭建已经有同事在内网上分享了,本文不再介绍。本文主要介绍自己在工作中用soanr工具...
  • dixialieren
  • dixialieren
  • 2014年07月17日 17:04
  • 7919

SpringCloud微服务架构搭建(四):断路器

在Spring Cloud中使用了Hystrix 来实现断路器的功能。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和...
  • kylin058
  • kylin058
  • 2017年07月17日 23:27
  • 380

函数式编程--变量作用域

1,lambda表达式捕获变量 通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,比如下面的代码: public class Test { public void tes...
  • u011794238
  • u011794238
  • 2015年10月26日 09:58
  • 795

超时机制、断路器模式简介

1、 HystrixNetflix has created a library called Hystrix that implements the circuit breaker pattern...
  • Jeson0725
  • Jeson0725
  • 2017年04月18日 13:37
  • 2041

函数式编程--lambda表达式对比匿名内部类

从前面的整理中我们看出了,Lambda表达式其实是匿名内部类的一种简化,因此它可以部分取代匿名内部类。 1,Lambda表达式与匿名内部类存在如下相同点: 1),Lambda表达式与匿名内...
  • u011794238
  • u011794238
  • 2015年10月27日 16:00
  • 2608

<数字图像处理的MATLAB实现笔记>第11章 表示与描述(一)

首先背景知识中说:令S表示一幅图像中像素的子集,也就是说S是图像中任选的一部分,如果在S中组成它们的所有像素间都存在通路,就说两个像素p和q在S中是连接着的。对于S中的任何像素p,在S中连接p的像素的...
  • u011500649
  • u011500649
  • 2016年10月15日 16:14
  • 315
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:No enclosing instance of type Demo06 is accessible.
举报原因:
原因补充:

(最多只允许输入30个字)