我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

时间:2022-01-18 04:33:47

我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了。IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代码,点几下鼠标,程序就跑起来了,用起来相当方便。你不用去关心它后面做了些什么,执行了哪些命令,基于什么原理。然而也是这种过分的依赖往往让人散失了最基本的技能,当到了一个没有IDE的地方,你便觉得无从下手,给你个代码都不知道怎么去跑。

  


首先我在C盘上编写了一个InnerClassTest.java代码,代码内容如下:

package com.csdn.oyp.inner;
public class InnerClassTest {
static class One{
private static class Two{
public static void main(String[] args) {
System.out.println("two");
}
}
}
}

然后我在Dos窗口下使用命令进行编译

C:\Users\Administrator>cd C:\

C:\>javac InnerClassTest.java

C:\>java InnerClassTest$One$Two
Exception in thread "main" java.lang.NoClassDefFoundError: InnerClassTest$One$Two (wrong name: com/csdn/oyp/inner/InnerClassTest$One$Two)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: InnerClassTest$One$Two. Program will exit.

我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

当运行完 javac InnerClassTest.java 命令后,在C盘生成了以下三个class文件,分别是:InnerClassTest$One$Two.class

InnerClassTest$One.class

InnerClassTest.class

我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

但是运行 java InnerClassTest$One$Two命令时,却报了异常:Exception in thread "main" java.lang.NoClassDefFoundError: InnerClassTest$One$Two (wrong name: com/csdn/oyp/inner/InnerClassTest$One$Two)。

原来是因为我的InnerClassTest.java中有package语句:package com.csdn.oyp.inner;所以在进行编译的时候javac命令要加上-d选项。

把javac命令改为 C:\>javac -d . InnerClassTest.java  (注意 "."号)

javac -d destdir srcFile 命令解释

其中:1、-d destdir是用来指定存放编译生成的.class文件的路径。(若此选项省略,那么默认在当前目录下生成.class文件,并且没有生成包文件夹;当前目录可以用“.”来表示,即:javac -d . srcFile )

注意:添加-d选项除了可以指定编译生成的.class文件的路径外,最大的区别是可以将源文件首行的package关键字下的包名在当前路径下生成文件夹。

那么在当前目录(C盘)下生成一个C:\com\csdn\oyp\inner目录,用于保存编译好的class文件。如下图所示:

我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

然后使用java命令运行main方法。

java com.csdn.oyp.inner.InnerClassTest$One$Two

运行结果为:输出two。

我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

当然如果将InnerClassTest.java中的package语句删除,即不打包的话。

public class InnerClassTest {
static class One{
private static class Two{
public static void main(String[] args) {
System.out.println("two");
}
}
}
}

编译和运行代码为:

C:\>javac InnerClassTest.java

C:\>java InnerClassTest$One$Two
two

如下图所示:
我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

总结:如果编译Java文件时不是用 -d 选项,编译器不会为Java源文件生成相应的文件结构。鉴于此,笔者推荐编译Java文件时总是使用 -d 选项,即使想把生成的class文件放在当前路径下,也应该使用  -d .  选项,而不省略 -d 选项

=================================================================

C:\>javac -help
用法:javac <选项> <源文件>
其中,可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖安装的扩展目录的位置
-endorseddirs <目录> 覆盖签名的标准路径的位置
-proc:{none,only} 控制是否执行注释处理和/或编译。
-processor <class1>[,<class2>,<class3>...]要运行的注释处理程序的名称;绕过默认的搜索进程
-processorpath <路径> 指定查找注释处理程序的位置
-d <目录> 指定存放生成的类文件的位置
-s <目录> 指定存放生成的源文件的位置
-implicit:{none,class} 指定是否为隐式引用文件生成类文件
-encoding <编码> 指定源文件使用的字符编码
-source <版本> 提供与指定版本的源兼容性
-target <版本> 生成特定 VM 版本的类文件
-version 版本信息
-help 输出标准选项的提要
-Akey[=value] 传递给注释处理程序的选项
-X 输出非标准选项的提要
-J<标志> 直接将 <标志> 传递给运行时系统
C:\>java -help
Usage: java [-options] class [args...]
(to execute a class)
or java [-options] -jar jarfile [args...]
(to execute a jar file) where options include:
-client to select the "client" VM
-server to select the "server" VM
-hotspot is a synonym for the "client" VM [deprecated]
The default VM is client. -cp <class search path of directories and zip/jar files>
-classpath <class search path of directories and zip/jar files>
A ; separated list of directories, JAR archives,
and ZIP archives to search for class files.
-D<name>=<value>
set a system property
-verbose[:class|gc|jni]
enable verbose output
-version print product version and exit
-version:<value>
require the specified version to run
-showversion print product version and continue
-jre-restrict-search | -jre-no-restrict-search
include/exclude user private JREs in the version search
-? -help print this help message
-X print help on non-standard options
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
enable assertions
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
disable assertions
-esa | -enablesystemassertions
enable system assertions
-dsa | -disablesystemassertions
disable system assertions
-agentlib:<libname>[=<options>]
load native agent library <libname>, e.g. -agentlib:hprof
see also, -agentlib:jdwp=help and -agentlib:hprof=help
-agentpath:<pathname>[=<options>]
load native agent library by full pathname
-javaagent:<jarpath>[=<options>]
load Java programming language agent, see java.lang.instrument
-splash:<imagepath>
show splash screen with specified image

可以参考以下链接:

http://www.cnblogs.com/xiazdong/p/3216220.html?utm_source=tuicool

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================

我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行