|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是一些大型开发或者是保密型比较高的项目都会用java,原因有2点,一:java是开源的,不怕别人留后门,偷我工具,.net就不一样了,保持微软的一向风格,源代码不公开初学|心得
以下内容的测试前提是你的呆板上,设置了path命令PATH=D:JDK1.4BIN;D:JDK1.4LIB;,能够一般实行java和javac命令,不必设置classpath路径的情形下。
从一个复杂的例子谈谈package与import机制
基础准绳:为何必要将Java文件和类文件实在安装到其所回属之Package所对应的绝对路径下。
为何要如许做呢?假如你在程序中,用到打包命令package,而且间接编译和实行该程序。比方:以上面程序为例:
packagea.b.c;
publicclasshello
{
publicstaticvoidmain(Stringargs[])
{
System.out.println("Hellotheworld!");
}
}
此程序能够编译经由过程,可是实行时,却提醒以下毛病!
D:myxdj>javachello.java
D:myxdj>javahello
Exceptioninthread"main"java.lang.NoClassDefFoundError:hello(wrongname:a/
b/c/hello)
atjava.lang.ClassLoader.defineClass0(NativeMethod)
atjava.lang.ClassLoader.defineClass(ClassLoader.java:537)
atjava.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
3)
atjava.net.URLClassLoader.defineClass(URLClassLoader.java:251)
atjava.net.URLClassLoader.access$100(URLClassLoader.java:55)
atjava.net.URLClassLoader$1.run(URLClassLoader.java:194)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:187)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:289)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:235)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
D:myxdj>
在xdj目次下创建一个ac子目次把hello.java放在它上面,用以下命令举行编译和实行时,可一般经由过程!
D:myxdj>javacd:myxdjachello.java
D:myxdj>javaa.b.c.hello
Hellotheworld!
D:myxdj>
再看上面别的一种情形,先让我们在xdj目次下创建两个文件a.java和b.java文件,其内容以下。
a.java文件内容:
importa.b.c.*;
publicclassa
{
publicstaticvoidmain(String[]args)
{
bb1=newb();
b1.print();
}
}
a.java文件内容:
packagea.b.c;
publicclassb
{
publicvoidprint()
{
System.out.println("我是被挪用子类的程序输入呀!");
}
}
间接编译a.java文件时,会提醒以下毛病!
D:myxdj>javaca.java
a.java:1:packagea.b.cdoesnotexist
importa.b.c.*;
^
a.java:6:cannotaccessb
badclassfile:..java
filedoesnotcontainclassb
Pleaseremoveormakesureitappearsinthecorrectsubdirectoryoftheclasspa
th.
bb1=newb();
^
2errors
D:myxdj>
接上去,我们把b.java移到xdjac下,并把xdj目次下的b.java删撤除呀!从头实行编译指令,此次一定能够编译乐成!你能够发明b.java也同时被编译过了,这就是所谓的make编译体例。
D:myxdj>javaca.java
D:myxdj>
提醒1:假如你在xdj目次下仍保存一个b.java文件的话,实行对主程序的编译命令时仍会报错!你本人能够尝尝呀!
提醒2:假如你删除xdjac.java文件的话,保存b.class文件,实行对主程序的编译命令时是能够经由过程,此地能够不必要子程序的源代码。
提出一个成绩:假如把目次ac全体剪切到别的目次,如D盘根目次下,在xdj目次假如实行编译和实行命令呢?
很分明,会报以下毛病!固然了,条件前提是你没有设置classpath路径,实在只需没把类搜刮路径设置到我这个地位就会堕落的!你尝尝吧!
D:myxdj>javaca.java
a.java:1:packagea.b.cdoesnotexist
importa.b.c.*;
^
a.java:6:cannotresolvesymbol
symbol:classb
location:classa
bb1=newb();
^
a.java:6:cannotresolvesymbol
symbol:classb
location:classa
bb1=newb();
^
3errors
D:myxdj>javaa
Exceptioninthread"main"java.lang.NoClassDefFoundError:a/b/c/b
ata.main(a.java:6)
D:myxdj>
办理的举措能够用以下命令便可一般编译和实行:
D:myxdj>javac-classpathd:a.java
D:myxdj>java-classpathd:;a
我是被挪用子类的程序输入呀!
D:myxdj>
提醒3:-classpath参数,缺省是以以后目次为基本目次的,即不带-classpath参数的情形下。
提醒4:利用java.exe仍是javac.exe,最好明白指定-classpath选项,可设置情况变量CLASSPATH便可,同时设置了-classpath参数和情况变量classpath时,会以-classpath参数为主的。假如在它们所指定的路径或JAR文件中存有package称号和类称号不异的类,会引发搅浑的!
假如你在D盘的根目次天生一个打包文件a.zip,其内容目次ac下的一切文件的话,你也能够用上面命令举行编译和实行。
D:myxdj>javac-classpathd:a.zipa.java
D:myxdj>java-classpathd:a.zip;.a
我是被挪用子类的程序输入呀!
D:myxdj>
以上会商就暂告一段落吧!假如你还想进一步懂得package与import机制话,哪你能够持续往下看下往的。
深切剖析package与import机制部分
不论你有无利用import指令,存在今朝目次下的类城市被编译器优先接纳,只需它不属于任何package。这是由于编译器老是先假定您所输出的类名就是该类的全名(不属于任何package),然后-classpath所指定的路径中搜刮属于该类的.java文件或.class文件,在这里能够晓得defaultpackage的脚色十分特别。
必需明白告知编译器我们用到哪一个package下的类,导进时或在包称号.类称号中举行援用。导进某个包时,必定要举行-classpath路径指定某个包的地位。你假如指定了多个路径话,假如在一个路径下已找到了该包话,就优先援用该包的类。
当java编译器入手下手编译某个类的源代码时,起首它会做一件事变,这就是创建“类路径援用表”,它是依据参数-classpath或classpath情况变量来创建的。假如没有指定选项-classpath或情况变量CLASSPATH时,缺省情形下类路径援用表只要一条记录,即以后的目次(“.”)。情况变量CLASSPATH的内容会被选项-classpath所掩盖,没有累加效果。
当编译器将类路径援用表创建好以后,接着编译器要断定它能够使用类援用内外的数据作为绝对肇端路径,找到一切用到的package。
编译器还要完成一张名为“类援用表”与“绝对类援用表”的数据布局。
全部编译程序中package与import机制相干的部分流程以下:
入手下手,
创建类路径援用表与类援用表;
假如创建乐成:则类称号剖析程序:
假如已存在该类的类文件,持续别的的编译事情。
假如该类的文件不存在,寻觅该类的源代码文件:
假如找到,则编译该
类的源代码,持续
别的的编译事情。
此时,也可前往到
入手下手,make机制,
递回式编译。
假如找不到,编译
停止,收回告诫
信息。
假如创建失利:编译停止,收回告诫信息(2)。
JAVA静态链接实质研讨
不论你在统一个源代码(.java)中利用了几个类声明,它们城市逐一编译成.class文件,即便是外部类、匿名类都是一样。在java中,关于每个类所组成的类文件,都可将它视为静态链接库。
在类文件中,一切关于特写类的操纵都被转换成类的全名。Import除用来指引编译器剖析出准确的类称号以外,没有别的功效。
在运转时代,仍旧用到一个与编译器不异的程序,就是类路径援用表的创建,而使用静态链接载进类文件的机制流程以下:
入手下手,
创建类路径援用表,
依据类文件外部的信息,与类路径援用表的数据分解类文件的相对路径。
假如找到类文件,反省该类的类文件外部信息,是不是切合绝对路径信息:
假如切合,载进该类。
假如不切合,实行毛病,收回
Exception信息。
假如找不到类文件,则实行毛病,收回Exception信息。
最初,必要申明的是,在java中供应很多的类包,java言语中将完成与盘算机底层相干的输出输入、经常使用的数据范例转换等功效的函数封装在包中。假如你的程序提醒找不到如许基本包的话,你就能够用参数-classpath或情况变量classpath举行指定地位来办理此类成绩!
前面写的有点乱呀!不晓得你可否了解呀!不外信任你看完我对package与import的会商后,应当会有所劳绩的。假如你另有任何干于package与import的疑问的话,能够和我一同会商和交换呀!我的邮箱是:xiaodajin@sina.com。
但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听, |
|