asm和c一般用作底层开发,虽然大多数学习都把c语言作为必修课,但是坦率来讲,真正高水平的c语言开发工程师其实不多,汇编就更少了,看过nginx和lua代码的同学应该深有体会。通讯厂商、芯片厂商,还有一些单片机设备、白色家电、黑色家电,这些设备上运行的代码大多数都是asm和c编写的。c++和java是上层应用使用较多的编程语言,c++在游戏和大型软件开发中使用较多,当然这也和具体公司有关。按我的了解,c++在腾讯就用的比较多,java在阿里巴巴用的不少。使用c++多数是为了兼顾效率和面向对象,而java语言则照顾到网络开发、网站开发、分布式、android开发等很多方面。另外,合格的java工程要比c++工程师多很多。一个5年的工程师,他可以说精通java,但是同样的年限下,他一般不会说自己精通c++。而python、js、html这些,也是使用较多的脚本语言。python用于机器学习、网站搭建、软件原型、测试脚本开发,十分方便。而js,既可以勇于前端开发。也可以用于后端开发。自从出现了node.js之后,使用js的场景也越来越多了。甚至于,由于混合编程的流行,使用js和ionic这样的框架开发app也不是多复杂的事情。
如果只是开发上层应用,java无疑是比较好的选择。不管是下载、安装,还是学习资源、学习教程,都非常方便,更不用说五花八门的jsp开发框架了。但是对于我来说,学习java的根本动力就是分布式开发,特别是apache下面的hadoop、hdfs、hbase,这些基本是分布式开发的标配。此外,编写健壮的java程序相对而言是容易的,而同样的逻辑用c或者c++程序来开发要复杂的多,单是关于内存的问题就够让人头痛的了。
1、jdk安装
如果是windows开发,一般使用oracle公司的jdk进行开发。如果是ubuntu开发,既可以选择openjdk,也可以选择oracle公司的jdk。jdk一般包括了编译环境和运行环境两个部分。
2、ide安装
很多同学安装完jdk之后,都喜欢安装ide,比如说eclipse,或者是netbeans。如果是项目开发,这无可厚非,但是如果自己学习,我还是建议大家安装一个代码编辑工具就可以了。比如说sublime就不错了,在windows、linux、mac上面都可以安装这个软件。
3、设置环境变量
设置环境变量比较简单。一般设置三个系统变量,分别是JAVA_HOME、CLASSPATH、Path。其中JAVA_HOME设置为C:\Program Files (x86)\Java\jdk1.8.0_91,CLASSPATH设置为.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;,Path只需要在原来的环境变量下面添加这两个属性就可以了,分别是%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin。
4、常用的java工具
常用的命令工具主要有javac、jar、java、javadoc、javap、jdb。javac是编译工具,它既可以编译单个文件,也可以编译多个文件。jar负责生成jar文件,主要是将多个class文件压缩在一起。java是虚拟机命令,它负责将class文件加载到虚拟机执行。javadoc负责文档的自动生成,内容来自于java文件中的注释。javap是反汇编文件,一般添加一个-c选项即可。jdb类似于gdb,可以用它对生成的class文件进行调试。
5、入门demo
public class hello {
public static void main(String[] args){
System.out.println("hello, world");
}
}
这个无敌的入门demo几乎是各个语言学习的标配。javac hello.java & java hello,这样可以运行起来了。主要执行的时候是java hello,而不是java hello.class。
6、多个java文件编译
如果需要对多个文件进行编译,也可以直接用javac来进行处理。假设有一个目录test,test中有两个文件a.java和b.java。那么在a.java和b.java的开头,都要添加代码package test;。然后进行编译,输入javac test/*.java。最后执行的时候,只要输入java test/hello即可。
7、引用第三方库
如果编译的过程中使用了第三方库,那么只要在javac中添加cp选项即可。比如,像这样javac -cp test/junit-4.12.jar test/*.java。
8、反汇编java
多实用javap工具是学习java的一个重要方法,它可以清楚地告诉你,代码最终是编译成什么样子,比如说最简单的hello程序,最后编译出来是这样的,
Compiled from “hello.java”
public class hello {
public hello();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object.""?)V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String hello, world
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
9、jdb调试
还是以刚才的hello程序为例,开始的时候输入jdb hello,接着输入stop in hello.main,最后输入run。有了这三步,程序就已经加载好了,后面就可以单步调试了。不管java语言是这样,几乎所有的脚本语言都可以编译、调试、反汇编,这三个工具真的非常重要,希望大家好好掌握和应用。
正在初始化jdb…
stop in hello.main
正在延迟断点hello.main。
将在加载类后设置。
run
运行hello
设置未捕获的java.lang.Throwable
设置延迟的未捕获的java.lang.Throwable
VM 已启动: 设置延迟的断点hello.main
断点命中: “线程=main”, hello.main(), 行=7 bci=0
7 System.out.println(“hello, world”);
main[1]
10、生成jar文件,且被引用
假设有test目录,test下有hello.java文件。首先hello.java的开头必须有package test;这段代码。其次,利用javac test/*.java生成class文件。接着,利用jar -cvf test.jar test/*.class创建test.jar文件。此时如果需要引用test.jar,直接利用javac -cp ./test.jar process.java即可。注意,在process.java中添加import test.hello代码。最后,如果需要执行process,直接输入java process即可。当然这个时候,如果用解压工具可以发现,jar文件中除了class文件之外,还有一个META-INF目录,这个目录下面有一个manifest.mf文件。
11、参考书籍
建议先学习好一本书的情况再去参考其他的数据,比如说《java编程思想》。如果这本书看完了,那么可以去参考其他的书籍,比如说《java核心技术》等等。
12、后面的话
一般教程上面学习java是这么安排的:a、学习基本语法,包括关键字、变量、计算、循环、判断、数组、编译、调试等等;b、学习类、包、继承、封装、多态、嵌套类、抽象类、接口、匿名类等等;c、学习第三方库,包括多线程、网络、数据库、日志、单元测试、gui、jni开发等等;d、到了这一步,一般会学习java的各个框架,比如structs、spring、hibernate、ibatis、mybatis等等,好一点的培训机构还说带一点hadoop、hdfs、hbase这些内容;e、等到上面的知识点都学完了,一般都会开始进行项目实战了,比如网上商城、爬虫、分布式监控、android开发等等。
大家可以根据自己的能力和兴趣,灵活调整内容,不断学习和进步。
13、资源
api文档,https://docs.oracle.com/javase/7/docs/api/
java教学视频,http://www.maiziedu.com/course/348-3765/ 和 http://www.maiziedu.com/course/804/
其他教程,http://www.runoob.com/java/java-filereader.html,
http://www.weixueyuan.net/java/rumen/