繁体   English   中英

如何使用内部类执行 JAVA 程序?

[英]How to execute JAVA programs with Inner classes?

我的程序中有 3 个课程

1. LinkedListProgram : contains PSVM 
2. LinkedList extends Node { 
     3. private class Node {
       }   
   }

我正在通过以下命令编译java程序

javac -d bin .\LinkedListProgram.java

编译成功,我在我的 bin 文件夹中看到了 3 个 .class 文件

LinkedList$Node.class
LinkedList.class
LinkedListProgram.class

现在我想执行程序,我使用的命令是

java -cp bin LinkedListProgram

这给了我一个堆栈跟踪错误,我将其粘贴在下面

Exception in thread "main" java.lang.NoClassDefFoundError: Node
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at LinkedListProgram.main(LinkedListProgram.java:137)
Caused by: java.lang.ClassNotFoundException: Node
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 13 more

如何解决这个问题? 根据我的实验,如果我不在另一个目录中生成 .class 文件,java 程序运行正常。

我从 bin 文件夹运行程序的方式有什么问题?

完整的源代码可以在Github 中看到

我觉得将整个代码粘贴到我的 OP 中不是一个好主意,因为代码有点冗长。 请转到上面的链接以获取完整代码。

出现问题是因为您试图从其父类扩展内部类。

LinkedList extends Node {
    class Node{}     
}

信息:私有内部类仅存在于其父类的上下文中,因此这意味着NodeLinkedList之外不可见。 甚至不在父类定义中!

但真正的问题不在于 Node 是私有的,

假设您将Node类设为public ,这将允许您在定义您的父类时引用您的内部类,例如LinkedList extends LinkedList.Node
但这将导致从LinkedList自身循环引用 这是不允许的!

解决方案是将这两个类放在单独的文件中。

在您的情况下,您将所有类都放在一个文件中,只需将Node类定义放在LinkedList类定义之后(或之前)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM