Java Learning – Basic 01
买了IZ0-803认证学习指南,打算好好过一遍JAVA。在看书过程中,突然感慨时代在进步,04-05年在大学学JAVA时,教材烂的跟祥一样,而现在的教材讲的真是浅显易懂呀!
知识点总结:
1. 在java.lang.*是默认import的,这是java的核心包
2. 在上一篇总结里,也简单说明了包的基本概念,它就是分层的概念,也可以理解文件的路径,这样可以把相同名字的类放到不同的package中,方便用反domain的方式引用(如 package com.ocaj.exam.tutorial;)
3. java编译class文件时不能带后缀名,如:
yonzhao2-mac:Desktop zhaoyong$ javac test.java yonzhao2-mac:Desktop zhaoyong$ ls |grep test test.class test.java yonzhao2-mac:Desktop zhaoyong$ ls -l |grep test -rw-r--r-- 1 zhaoyong staff 416 2 23 13:29 test.class -rw-r--r-- 1 zhaoyong staff 108 2 23 09:20 test.java yonzhao2-mac:Desktop zhaoyong$ yonzhao2-mac:Desktop zhaoyong$ java test.class 错误: 找不到或无法加载主类 test.class yonzhao2-mac:Desktop zhaoyong$ yonzhao2-mac:Desktop zhaoyong$ java test test-classpath
4. 在MAC上安装完JDK后不用设置环境参量?!
yonzhao2-mac:Desktop zhaoyong$ /usr/libexec/java_home /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home yonzhao2-mac:Desktop zhaoyong$ yonzhao2-mac:Desktop zhaoyong$ /usr/libexec/java_home -V Matching Java Virtual Machines (3): 1.7.0_75, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home 1.6.0_65-b14-466.1, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home 1.6.0_65-b14-466.1, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home yonzhao2-mac:Desktop zhaoyong$ yonzhao2-mac:Desktop zhaoyong$ echo $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home yonzhao2-mac:Desktop zhaoyong$ yonzhao2-mac:Desktop zhaoyong$ echo $PATH !---在PATH中加入可执行文件后,在任何地方都可以直接调用,而不用带着绝对路径调用 /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin yonzhao2-mac:Desktop zhaoyong$ yonzhao2-mac:Desktop zhaoyong$ echo $CLASSPATH .:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/lib/tools.jar
对于$CLASSPATH这个变量设置的目的是为了程序能找到相应的”.class”文件(注意前面的“.”,这个是当前目录的意思,当编译一个java文件时,以当前目录为起始,计算java在哪个package里,在1-3的练习里有详细说明)。下面是引自网上的一篇博文,虽然是windows的,但还是可以参考的:
你编译一个JAVA程序—A.java,会得到一个A.class的类文件,你在当前目录下执行java A,将会得到相应的结果(前提是你已经设置CLASSPATH为”.”)。现在你把A.class移到别的目录下(例如:”e:\”),执行java A,将会有NoClassDefFindError的异常,原因就是找不到.class文件,现在你把CLASSPATH增加为:”.;e:\”再在任何目录下运行java A, 看看会有什么结果~~:)~~~, 一切正常, java命令通过CLASSPATH找到了.class文件!
5. 关于dt.jar,tools.jar,rt.jar的区别
如上可以看到在$CLASSPATH定义了dt.jar和tools.jar,rt.jar是默认加载的,所以不需要加载。那么这些都包含了什么呢?跟import xxx时有什么关系?先来看看一个简单的文件执行后,会加载什么类:
yonzhao2-mac:Desktop zhaoyong$ java -verbose test [Opened /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/rt.jar] [Loaded java.lang.Object from /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/rt.jar] [Loaded java.io.Serializable from /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/rt.jar] [Loaded java.lang.Comparable from /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/rt.jar] [Loaded java.lang.CharSequence from /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/rt.jar] [Loaded java.lang.String from /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/rt.jar]
ok,都是rt.jar,那么这里面到底包含什么呢?
我们再来讨论下tools.jar是做什么的?
它是系统用来编译一个类的时候用到的,也就是javac的时候用到,如“javac xxx.java”。实际上就是运行:javac -classpath=%JAVA_HOME%\lib\tools.jar xxx.java
那么dt.jar里面有什么?
它是关于运行环境的类库,主要是swing的包,如下图:
6. 如何用Eclipse建立多层包,如”package com.ocajexam.tutorial;”?
首先建立一个project,如java,然后在src下建立包,命名时用点分开,如下所示:
注意在Eclipse里显示的不是层级关系,但实际上已经是多层目录了,如下所示:
7. Import和编译路径测试(1-3)
建立一个主程序“GreetingsUniverse.java”,3个副程序“Earth.java, Mars.java, Venus.java”,然后通过主程序调用这几个副程序,在此列出主程序和Earth的代码
主程序:
package com.ocajexam.tutorial; import com.ocajexam.tutorial.planets.Earth; import com.ocajexam.tutorial.planets.Mars; import com.ocajexam.tutorial.planets.Venus; public class GreetingsUniverse { public static void main(String[] args){ System.out.println("Greetings, Universe!"); Earth e = new Earth(); Mars m = new Mars(); Venus v = new Venus(); } }
副程序:
package com.ocajexam.tutorial.planets; public class Earth { public Earth (){ System.out.println("Hello from Earth!"); } }
看上去没什么问题,用命令行编译一下,看看结果:
yonzhao2-mac:tutorial zhaoyong$ pwd
/Users/zhaoyong/Documents/python/java/src/com/ocajexam/tutorial
yonzhao2-mac:tutorial zhaoyong$ ls
GreetingsUniverse.java planets
yonzhao2-mac:tutorial zhaoyong$ javac GreetingsUniverse.java
GreetingsUniverse.java:2: 错误: 程序包com.ocajexam.tutorial.planets不存在
import com.ocajexam.tutorial.planets.Earth;
^
GreetingsUniverse.java:3: 错误: 程序包com.ocajexam.tutorial.planets不存在
import com.ocajexam.tutorial.planets.Mars;
^
GreetingsUniverse.java:4: 错误: 程序包com.ocajexam.tutorial.planets不存在
import com.ocajexam.tutorial.planets.Venus;
^
GreetingsUniverse.java:9: 错误: 找不到符号
Earth e = new Earth();
^
符号: 类 Earth
位置: 类 GreetingsUniverse
GreetingsUniverse.java:9: 错误: 找不到符号
Earth e = new Earth();
^
符号: 类 Earth
位置: 类 GreetingsUniverse
GreetingsUniverse.java:10: 错误: 找不到符号
Mars m = new Mars();
^
符号: 类 Mars
位置: 类 GreetingsUniverse
GreetingsUniverse.java:10: 错误: 找不到符号
Mars m = new Mars();
^
符号: 类 Mars
位置: 类 GreetingsUniverse
GreetingsUniverse.java:11: 错误: 找不到符号
Venus v = new Venus();
^
符号: 类 Venus
位置: 类 GreetingsUniverse
GreetingsUniverse.java:11: 错误: 找不到符号
Venus v = new Venus();
^
符号: 类 Venus
位置: 类 GreetingsUniverse
9 个错误
一堆报错,找不到包?那换一个绝对路径试试?还是报一样的错误:
yonzhao2-mac:tutorial zhaoyong$ javac /Users/zhaoyong/Documents/python/java/src/com/ocajexam/tutorial/GreetingsUniverse.java
/Users/zhaoyong/Documents/python/java/src/com/ocajexam/tutorial/GreetingsUniverse.java:2: 错误: 程序包com.ocajexam.tutorial.planets不存在
import com.ocajexam.tutorial.planets.Earth;
^
难道在包路径中(现在的路径是tutorial文件夹)去编译会有问题?
那么退到src文件夹下,看看情况:
yonzhao2-mac:src zhaoyong$ pwd
/Users/zhaoyong/Documents/python/java/src
yonzhao2-mac:src zhaoyong$ ls
com
yonzhao2-mac:src zhaoyong$ javac /Users/zhaoyong/Documents/python/java/src/com/ocajexam/tutorial/GreetingsUniverse.java
yonzhao2-mac:src zhaoyong$ ls -l /Users/zhaoyong/Documents/python/java/src/com/ocajexam/tutorial/
total 16
-rw-r--r-- 1 zhaoyong staff 643 2 24 19:01 GreetingsUniverse.class
-rw-r--r-- 1 zhaoyong staff 365 2 24 17:49 GreetingsUniverse.java
drwxr-xr-x 8 zhaoyong staff 272 2 24 19:01 planets
看来编译成功了,用java执行class文件试试,看是否ok?!
yonzhao2-mac:src zhaoyong$ java /Users/zhaoyong/Documents/python/java/src/com/ocajexam/tutorial/GreetingsUniverse
错误: 找不到或无法加载主类 .Users.zhaoyong.Documents.python.java.src.com.ocajexam.tutorial.GreetingsUniverse
这是怎么回事?找不到类?路径又有问题了?研究了很久。。。终于找到问题所在,由于在$CLASSPATH中没有定义这些路径,所以JAVA找不到相应的类,还好在$CLASSPATH中定义了当前目录“.”,所以以当前路径指定相对路径找类文件既可以了,而且路径方式和域名方式都可以,如下所示:
yonzhao2-mac:src zhaoyong$ pwd /Users/zhaoyong/Documents/python/java/src yonzhao2-mac:src zhaoyong$ java com/ocajexam/tutorial/GreetingsUniverse Greetings, Universe! Hello from Earth! Hello from Mars! Hello from Venus! yonzhao2-mac:src zhaoyong$ yonzhao2-mac:src zhaoyong$ java com.ocajexam.tutorial.GreetingsUniverse Greetings, Universe! Hello from Earth! Hello from Mars! Hello from Venus!
参考文章:
java环境变量详解—找不到或无法加载主类
Java基础第一讲:Java的故事和Java编程环境搭建 <<< 有非常好的JAVA基础教程,推荐
$JAVA_HOME环境变量在Mac OS X中设置的问题
Probable error on 1-3 exercise on OCA Java SE 7 Programmer I Study Guide (Robert Liguori) <<< 本书作者解答