如何在Java静态块中创建Local类?

时间:2016-05-19 15:03:40

标签: java static-initializer

来自Java文档:

  

本地类是在中定义的类,它是一个   平衡括号之间的零个或多个语句的组。您   通常可以找到方法体中定义的本地类。

此外,Local类是一种特殊的内部类,需要从外部类对象实例化:

  

与实例方法和变量一样,内部类是关联的   使用封闭类的实例

但是在创建对象实例之前,在类加载期间调用静态块。

那么,如何在静态初始化程序块中创建和实例化本地类呢?

例如:

127706 info install kerberos@0.0.11
127707 silly gunzTarPerm extractEntry _baseAssign.js
127708 silly gunzTarPerm extractEntry _assignInDefaults.js
127709 silly gunzTarPerm extractEntry unzip.js
127710 silly gunzTarPerm extractEntry uniq.js
127711 silly gunzTarPerm extractEntry _baseGt.js
127712 silly gunzTarPerm extractEntry tap.js
127713 silly gunzTarPerm extractEntry _baseFor.js
127714 silly gunzTarPerm extractEntry toFinite.js
127715 silly gunzTarPerm extractEntry _baseFor.js
127716 silly gunzTarPerm extractEntry toFinite.js
127717 silly gunzTarPerm extractEntry es6/weak-map.js
127718 silly gunzTarPerm modified mode [ 'es6/weak-map.js', 438, 420 ]
127719 verbose unsafe-perm in lifecycle false
127720 verbose stack Error: spawn ENOMEM
127720 verbose stack     at exports._errnoException (util.js:870:11)
127720 verbose stack     at ChildProcess.spawn (internal/child_process.js:298:11)
127720 verbose stack     at exports.spawn (child_process.js:362:9)
127720 verbose stack     at spawn (/opt/elasticbeanstalk/node-install/node-v4.4.3-linux-x64/lib/node_modules/npm/lib/utils/spawn.js:7:13)
127720 verbose stack     at runCmd_ (/opt/elasticbeanstalk/node-install/node-v4.4.3-linux-x64/lib/node_modules/npm/lib/utils/lifecycle.js:211:14)
127720 verbose stack     at /opt/elasticbeanstalk/node-install/node-v4.4.3-linux-x64/lib/node_modules/npm/lib/utils/lifecycle.js:179:7
127720 verbose stack     at nextTickCallbackWith0Args (node.js:420:9)
127720 verbose stack     at process._tickCallback (node.js:349:13)
127721 verbose cwd /tmp/deployment/application
127722 error Linux 4.4.8-20.46.amzn1.x86_64
127723 error argv "/opt/elasticbeanstalk/node-install/node-v4.4.3-linux-x64/bin/node" "/opt/elasticbeanstalk/node-install/node-v4.4.3-linux-x64/bin/npm" "--production" "install"
127724 error node v4.4.3
127725 error npm  v2.15.1
127726 error code ENOMEM
127727 error errno ENOMEM
127728 error syscall spawn
127729 error spawn ENOMEM
127730 error If you need help, you may report this error at:
127730 error     <https://github.com/npm/npm/issues>
127731 verbose exit [ 1, true ]

根据JLS项目#15.9.2,根据本地课程的重复修改

  

如果C是本地类(§14.3),那么让O成为最里面的词法   包含C类。设n是整数,使得O是n'   词法包含类实例的类的类   创建表达式出现。然后:

     

如果C出现在静态上下文中,那么我没有立即封闭   实例

     

否则,如果类实例创建表达式出现在   静态上下文,然后发生编译时错误。

     

否则,i的直接封闭实例是n   在词汇上包含这个的实例(§8.1.3)。

2 个答案:

答案 0 :(得分:0)

好的定义说明了一切

  

本地类是在块中定义的类,它是一个   平衡括号之间的零个或多个语句的组。您   通常可以找到方法体中定义的本地类。

简而言之,你可以做到。无论是内部方法还是静态

更新: -

实例类与实例相关联。它们可以在课外实例化,如

OuterClass outer=new OuterClass ();
OuterClass.InnerClassinner=outer.new InnerClass();

但是可以在块中调用本地类

答案 1 :(得分:0)

无论是静态初始化块还是静态方法(仅提及),您都可以创建类的对象并定义本地类。

另外,Local类是Inner Class的一种特殊类型(除了我们所知的匿名类),它的对象在每种情况下都与外部类的对象相关联。

<强> P.S。 -

  

静态块中的内部类的实例不是关联的   与封闭它的类的任何实例。