static inner class和非static inner class的实例化问题(can only instantiate non-static inner class...)

2019-09-26 18:58:25

前言:过年回来,项目突然报错:can only instantiate non-static inner class... 


代码如下:


/**

 * @author fandong

 * @create 2018/12/10

 */

@Data

public class QuestionnaireAttribute {

 

   

 

    public QuestionnaireAttribute() {

    }

 

    @Data

    public class StartAndEndTime{

 

        private String startTime;

 

        private String endTime;

 

    }

 

}

Spring Boot 接收到Json参数后,无法构造 StartAndEndTime类的实例,过了个年,第一天上班头晕呼呼的,一时有点懵。


原因:后来想想,其实是序列化框架 无法构造 非静态内部类 StartAndEndTime的实例,加个 static 将其声明为 静态内部类就可以了。


这里不得不说下 static inner class 和 non-static inner class 构造实例的区别:


static inner class 可以直接调用构造器构造,如下:


QuestionnaireAttribute.StartAndEndTime startAndEndTime = new QuestionnaireAttribute.StartAndEndTime();

non-static inner class 需要持有外部类实例的引用,所以无法直接调用构造器创建,需要先构造外部类实例,然后通过外部类实例调用构造方法创建,如下:


QuestionnaireAttribute questionnaireAttribute = new QuestionnaireAttribute();

QuestionnaireAttribute.StartAndEndTime startAndEndTime = questionnaireAttribute.new StartAndEndTime();

日常使用的话一般 static inner class比较多,所以一时遇到 non-static inner class的实例化会有点懵,😄


  • 2017-03-11 08:39:13

    mysql存在就更新,否则插入

    ,如果要在插入的时候先判断插入的数据是否存在数据库中,那每一次插入之前都要进行一次select的操作,这样效率不高?如何优化蛤?

  • 2017-03-13 12:07:19

    JavaScript原型与原型链分析

    JavaScript没有类的概念,但几乎所有的东西又是基于对象的,同时也能实现继承,这就是js跟其他OOP语言最大的不同之处,这也是js最难理解的一块。下面我来说说我个人的理解。

  • 2017-03-15 07:43:19

    NodeJS服务器”热部署“代码,实现动态调试

    如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你在开发 Node.js 实现的 HTTP 应用时会发现,无论你修改了代码的哪一部份,都必须终止Node.js 再重新运行才会奏效。这是因为 Node.js 只有在第一次引用到某部份时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,而 PHP 则总是重新读取并解析脚本(如果没有专门的优化配置)。