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,那么这里面到底包含什么呢?
java-learning-1-01
我们再来讨论下tools.jar是做什么的?
它是系统用来编译一个类的时候用到的,也就是javac的时候用到,如“javac xxx.java”。实际上就是运行:javac -classpath=%JAVA_HOME%\lib\tools.jar xxx.java

那么dt.jar里面有什么?
它是关于运行环境的类库,主要是swing的包,如下图:
java-learning-1-02
6. 如何用Eclipse建立多层包,如”package com.ocajexam.tutorial;”?
首先建立一个project,如java,然后在src下建立包,命名时用点分开,如下所示:
java-learning-1-03
注意在Eclipse里显示的不是层级关系,但实际上已经是多层目录了,如下所示:
java-learning-1-04
java-learning-1-05

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!");
	}
}

执行主程序,结果如下图所示:
java-learning-1-06

看上去没什么问题,用命令行编译一下,看看结果:

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) <<< 本书作者解答

0
你可以留言,或者trackback 从你的网站

留言哦