Java学习笔记 1
安装JDK
以前搭hadoop的时候给ubuntu装过,学algorithms的时候给win装过……还都是JDK7,总之不用再装了=___,=
这里是个不错的教程:How to Install Oracle Java on Ubuntu Linux 和配套的升级教程:How to Upgrade Oracle Java on Ubuntu Linux
安装eclipse
以前入门安卓的时候在win下装过(然后就被我果断坑掉了),记得貌似也是点点点就装好了,Ubuntu要从头装一次
在Ubuntu 12.04下安装eclipse:How to install eclipse in ubuntu 12.04
注意:eclipse自带的那个icon跟个乒乓球那么大,无论是gnome还是unity都不能直接拿去做launcher,要稍微动下手脚,没有记哪里找到的解决方法,即时搜就可以了。
开始入门
用eclipse自带的教程就可以开始入门HelloWorld了。
注:eclipse自带的SWT教程居然自带大坑……按照上面的步骤来做会报类似于“no swt-gtk-4427 in java.library.path”的错误,因为它没说全步骤……解决方法在这里 (图形界面好蛋疼……)
折腾编译
学会了用eclipse导入第三方jar来编译之后,我决定来折腾一下命令行编译。
搜索了一下找到了一个应该OK的解决方案:How to compile a .java file in Java?(果然想把eclipse自带教程的程序手动编译试试的折腾星人不止我一个……)
首先把之前按教程写的HelloWorldSWT.java cp到另一个地方去,接着尝试编译,用eclipse下的jar的绝对路径放到classpath里面:
$ javac -cp /opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_*.jar HelloWorldSWT.java
编译OK,跑跑看
$ java -cp /opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_*.jar:. HelloWorldSWT
结果报错了……
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Display
at HelloWorldSWT.main(HelloWorldSWT.java:19)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Display
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 1 more
中途手误了几次在运行的时候没有把当前目录也放进cp,遇到了这样的错误: Error: Could not find or load main class
另外找到了一个很棒的小技巧:用debug模式去看eclipse是用什么命令执行你的程序的: Can I run from command line program created by Eclipse?
发现eclipse在用的命令没有星号,我又试着把星号去掉用jar的实际路径代替一下试试(记得当初跑hadoop也遇到过类似的问题是这样解决的)
$ javac -cp /opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_3.103.0.v20140605-2012.jar HelloWorldSWT.java
$ java -cp /opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_3.103.0.v20140605-2012.jar:. HelloWorldSWT
结果居然成功了Orz 原来stackoverflow上已经有人解释过了,java的wildcard和平时在bash里用的是不一样的: Setting multiple jars in java classpath
OK,换种方法跑
java -cp "/opt/eclipse/plugins/*:." HelloWorldSWT
居然成功了,跪……
写几个小程序
挑了一本free book Think Java来看,虽然是针对不会编程的初学者的书,不过刚好是给APCS学生写的,实训的那个GridWorld就是书上讲解的一部分。挑了一些课后习题来做,都放在我的github上了(新一点的eclipse都自带git支持的,点点点就行了……)
因为GridWorld是APCS的program,所以网上资料多到爆,youtube上也有很多视频。随手找了一个导入eclipse的教程: Getting Started with Eclipse for Java and GridWorld 无痛安装完毕,一运行就跑出那个小虫虫了……
看书
不知道看Head First Java好还是Core Java比较好……不过翻了一下Core Java,发现蛮有趣的,决定看后者了。 大概看了第一章,有一些比较好玩的点
- Java白皮书在这里
- Java的特性被刻意设计成了精简版的C++,去掉了一大堆繁杂难懂的东西,还把指针换成了引用+GC
- C++的多重继承在Java里被简化成了interface
- Java的int总是32位,String总是Unicode
- 各种宣扬JIT大法好……