因为公司的业务需要而学习java,并应用java开发项目。由于项目时间紧,没有充裕的时间系统学习java,对java的学习只能是项目需要用什么,就学什么,这种学习方法的上手快,但不扎实,在以后的工作中,因为java学的不扎实,吃了不少苦头。现在我学习应用java已经有一年半的时间,对java已经有了一定的体会,把自己的体会写出来,供网友分享。
以我个人的经验,学习java应分以下几个阶段:
java的语法学习
面向对象观念的建立
java基本类库的学习
学习设计模式
应用设计模式
经过大量的实践,可以设计模式
以上六个阶段,其中前三个阶段是针对java的,但java中,在很多设计模式的应用,同时有很多功能都支持设计模式,所以不懂设计模式的人是不会很好的应用java做开发的。第4、5个阶段的学习在前三个阶段的基础上,学习、应用成功的经验。从而进入第六个阶段,在软件设计这个领域尽情发挥。本人受能力所限,还处在第4个阶段的学习过程,所以会对前四个阶段说明。第五、六个阶段只是我根据我自己的知识做的推断,还没有经验无法说明。
在对这些学习阶段进行阐述之前,我先说一下我的学习方法。在学习新的知识时我通常是按以下三个阶段学的:
理论学习。通过对理论的学习,尽量了解新知识的概念;学习之后只是粗略的了解概念,不能和实际很好的结合。
演绎阶段。根据理论学习的知识,考虑在什么场合下可以应用这个新知识,哪些地方已经应用了这个概念,建立对新知识的感性认识。
归纳阶段。从一个更深的层次理解理论。
以下根据java的六个学习阶段阐述我的体会,而每个阶段将按照理论学习、演绎和归纳三个小阶段讨论。
java语法的学习
语法学习的理论学习阶段是最容易的阶段,70%以上的java书主要介绍的就是java语法,随意买来一本,通读一下就可以,主要理解以下内容:(1)数据类型,(2)操作符,(3)控制流程,(4)类和类再生,(5)包和接口,(6)异常操作。
在理论学习阶段,不必过于注重细节,只要对java的基本语法有一个整体认识,能读懂示例的源代码就可以了。
下一步就是演绎阶段,应用所学的语法知识,编写简单的程序。最好凭自己的记忆,将各语法要点都用一遍(编写代码最好用notepad),对自己不熟悉的语法要重新阅读,用编译器去检查语法错误。这个阶段的目标是脱离书本以及java API能编写简单的程序,阅读一个java源代码能说出执行结果。
完成这个阶段的学习,参加scjp的考试,应该获得较高的成绩。
在演绎阶段的基础上,根据自己犯过的错误,总结一下java的难点。重新阅读语法书,将一些自己不是很清楚的概念重新整理一下,这时你对java语法的理解比第一次阅读时更深了。
我在刚开始学java时,只是粗略的看看语法书,就开始编程序了,遇到不懂的就重新阅读语法书,这样,完全可以成为一个合格程序员,但是当我成为team leader时,为了培训组员java编程,却发现自己脱离了java语法书和Java API,竟然会的不多(java集成开发工具有提示功能),为了培训,我又重新学了一遍java语法,很有收获。
其实一个优秀的程序员,不但要能写出好的程序,更重要的是,对所写的程序能说的清楚:
(1)说清楚程序的功能
(2)说清楚程序的结构。而说清楚程序的结构的基础是对java的语法要熟悉。想成为优秀的程序员,一定要在学习语法的基础上,不断实践,不断总结,最终能脱离语法书,将java语法系统的讲解清楚。
为何要再谈JVM
很多人认为,分布式Java应用看上去好像和Java虚拟机没什么太多关注的东西,别说分布式系统了,就是一个单机JavaSE系统也不用将JVM学得透透的,有个JVM执行不就行了吗。据笔者的经验回答则是,在大型分布式系统,尤其是云计算服务平台,SAAS也好,PAAS也罢,要求编写的应用必须要高效,你就当你运行的是一个配置很小的机器上,要求资源比较苛刻。所以了解,甚至再学习JVM相关知识还是十分必要的。之前笔者写过一篇关于JVM加载类的文章http://suhuanzheng7784877.iteye.com/blog/964784。后来发现这些还是不够的,还是需要在总结一下JVM运行时的其他环节。对于我们开发分布式的Java系统是有一种潜移默化的作用,主要用于自己回顾用。
2. JVM结构
JVM主要负责什么工作呢,首先它负责将我们编写的java文件编译成为class文件;第二它负责加载已有的class文件;第三它还负责class的执行;第四JVM还负责内存的分配与回收,这也是为什么大家在写代码的过程中不用手工写代码分配资源和强制回收资源了,有个强势的管家——JVM为您做了;JVM还要和底层操作系统接口进行交互完成多线程资源的同步、并发机制,所以为什么我们实现一个Runnable接口或者集成Thread就能完成多线程操作了,表面上看您除了编写一些特殊的类什么都没做,实际上是JVM为您默默做了那么多。
Sun,哦,不,笔者老是改不了口,Oracle的Java规范JVM如下:
Class文件被类加载器加载,JVM为其开辟内存空间,内存空间又分为四个大部分:方法区、堆区、栈区、本地方法栈区。JVM启动优先级比较小的线程来运行垃圾回收器,时刻监视并回收开辟的内存区域。
3. JVM到底如何编译Java代码
运行class文件需要将java文件编译成为class文件,JavaSDK如何编译的呢?javac将java源代码编译class过程如下:
1:分析输入到符号表:将java文件内容的字符串转变为关键字序列,之后生成一个类似于树状结构的内容,叫做抽象语法树。所谓输入到符号表的意思,就是将类中出现的符号输入类自身的符号表中等。所谓符号一般是指:父类、接口,因为要根据这些符号生成无参构造函数。
2:处理注解阶段:在JDK1.5之前,JVM没有这个阶段,但是JDK1.5之后咱们在Java类文件中写的注解需要JVM来进行处理、加强,至于注解保留到何时才生效,具体请参考http://suhuanzheng7784877.iteye.com/blog/1054838。
之后根据抽象语法树中等等信息联系到一起,进行有效性判断,一些列的语义判断,校验,优化某些代码,之后就是我们看到的class文件。class中除了字节码,还包括了JVM执行class的相关信息:
结构信息:class的文件格式版本号以及各部分的数量与大小。
元数据:元数据代表类的继承关系、接口、声明信息、属性、方法声明信息、常量池信息。
方法信息:包括字节码、异常处理表、局部变量区大小
我们利用反编译工具反编译一下以前自己写过的class源码,是不是发现确实JDK编译此文件的时候和我们源代码有些许出入,那是它为我们做了优化。
4. JVM到底如何执行Java代码
JVM执行class文件有3种方式,第一是解释执行、第二是编译执行、第三就是反射执行。可能大家对于第三个反射执行更为熟悉,因为这也是对大家相对真真正正编代码体验过的,而前两者都是由JVM给咱做的,所以听上去就十分陌生。
1):解析执行
在JVM中解析执行专门执行那些执行频率不高的代码,解析执行内部原理十分类似于咱们学过的汇编语言,JVM用一些自己自定义的指令(汇编语言也有自己一些简单的指令),来完成既有代码的执行过程,说白了,到了最底层,面向对象还是要过程化的。
通过4条常用指令完成对类的解析和执行。Invokestatic负责调用static方法,invokevirtual负责调用实例对象方法,invokeinterface对应的是调用接口方法,invokespecial负责private方法的调用以及编译源码后(就是class)生成的构造方法。
如下一段代码
Java代码
import java.io.UnsupportedEncodingException;
public class UTest {
public static void main(String[] args) throws UnsupportedEncodingException {
String c = java.net.URLDecoder
.decode("%E4%BA%A7%E5%93%81%E6%8F%8F%E8%BF%B0%E5%9F%9F%E8%B6%8A%E7%95%8C","utf-8");
System.out.println(" " + c);
}
}
import java.io.UnsupportedEncodingException;
public class UTest {
public static void main(String[] args) throws UnsupportedEncodingException {
String c = java.net.URLDecoder
.decode("%E4%BA%A7%E5%93%81%E6%8F%8F%E8%BF%B0%E5%9F%9F%E8%B6%8A%E7%95%8C","utf-8");
System.out.println(" " + c);
}
} 编译成class后,使用javap –c UTest看字节码内容
Java代码
Compiled from "UTest.java"
public class UTest extends java.lang.Object{
public UTest();
Code:
0: aload_0//装载局部变量第一个值到操作数栈
1: invokespecial #8; //Method java/lang/Object."<init>":()V//初始化构造器
4: return
public static void main(java.lang.String[]) throws java.io.UnsupportedEncoding
Exception;
Code:
0: ldc #19; //String %E4%BA%A7%E5%93%81%E6%8F%8F%E8%BF%B0%E5%9F%9F%E8%B
6%8A%E7%95%8C//将字符串值装载到常量池中
2: ldc #21; //String utf-8//将字符串值装载到常量池中
4: invokestatic #23; //Method java/net/URLDecoder.decode:(Ljava/lang/Str
ing;Ljava/lang/String;)Ljava/lang/String;
//调用静态方法java.net.URLDecoder.decode
7: astore_1//将操作数栈中栈顶的值弹出放入局部变量区
8: getstatic #29; //Field java/lang/System.out:Ljava/io/PrintStream;
11: new #35; //class java/lang/StringBuilder
14: dup
15: ldc #37; //String
17:invokespecial #39; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
20: aload_1
21:invokevirtual #42; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
24:invokevirtual #46; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
27:invokevirtual #50;//Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
30: return
}
Compiled from "UTest.java"
public class UTest extends java.lang.Object{
public UTest();
Code:
0: aload_0//装载局部变量第一个值到操作数栈
1: invokespecial #8; //Method java/lang/Object."<init>":()V//初始化构造器
4: return
public static void main(java.lang.String[]) throws java.io.UnsupportedEncoding
Exception;
Code:
0: ldc #19; //String %E4%BA%A7%E5%93%81%E6%8F%8F%E8%BF%B0%E5%9F%9F%E8%B
6%8A%E7%95%8C//将字符串值装载到常量池中
2: ldc #21; //String utf-8//将字符串值装载到常量池中
4: invokestatic #23; //Method java/net/URLDecoder.decode:(Ljava/lang/Str
ing;Ljava/lang/String;)Ljava/lang/String;
//调用静态方法java.net.URLDecoder.decode
7: astore_1//将操作数栈中栈顶的值弹出放入局部变量区
8: getstatic #29; //Field java/lang/System.out:Ljava/io/PrintStream;
11: new #35; //class java/lang/StringBuilder
14: dup
15: ldc #37; //String
17:invokespecial #39; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
20: aload_1
21:invokevirtual #42; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
24:invokevirtual #46; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
27:invokevirtual #50;//Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
30: return
} 估计大家都看烦了,习惯了面向对象思维的大家一看这种汇编似的语言确实头疼,耐不下心。如果不是搞JVM开发的,其实了解一下就可以,毕竟了解一下JVM运行原理,对于我们写代码,无异于又过了一层思考。
解释执行比较慢,但是呢,比较省资源,省内存,因为采用栈这种数据结构进行指令的收编和采集,运用,空间利用率可见是比较节俭的。
2):编译执行:
为了提升性能,JDK还可以编译执行,也叫做即时编译器,通常是对执行频率比较高的代码进行及时编译执行。编译执行牺牲了部分空间资源,换来的是优化了字节码的编译实际代码块,就是说我们编写的代码在JVM编译器看来是可优化的,所以它采用优化编译,将原先的代码进行一些调整,进而更好地利用JVM资源。编译执行那个主要分为2类,一个是客户端类型,属轻量级;一类是服务端类型,属于重量级。
分享到:
相关推荐
这一点对于追求效率和个性化开发环境的开发者来说尤为重要。 在学习使用MyEclipse时,理应充分了解其操作界面和命令,包括如何配置开发环境,如何通过编辑区、类体等指定位置执行操作。对于初学者而言,清晰的步骤...
这一点体现在两个方面:首先,Sun提供的Java认证考试中最高级的认证是SCJA(Software Certifications for Java Architects),这反映了Sun对软件架构师角色的重视;其次,在市面上关于Java的书籍中,除了入门书籍外...
最近在复习JAVA相关基础知识,在编译时多态和运行时多态-...因为该处产生的错误为运行时异常,故编译时看不出来报错,干脆整个试验一下,此处为个人练习所写,也是个人总结的一点心得,如有错漏还请不吝指教,谢谢!
【大学生Java实习总结报告】是学生们在完成Java实训课程后对个人学习和团队协作经验的总结。这份报告中,学生通过实践操作一个吧计费管理系统,深入理解和应用了Java编程语言,同时也涉及到软件开发的多个关键环节,...
功夫不负有心人,终于我找到一个聊天室的小例子,但是功能差的太远,于是我把这个例如一点点的研究,从一点也不懂到后来慢慢看懂,从对AJAX技术一无所知到根本熟练运用。接下来我就开始自己开发,到最后终于把它开发...
设计模式是我到公司才接触的事物,主要是讲述一种面向接口的编程思维,按照设计模式所编写的代码,会比学校那种直接实现功能的代码繁琐一点,增加很多看似多余的虚类或者接口。但是这种代码更加具有拓展性,更好地把...
《若依RuoYi框架剖析笔记》是基于江南一点雨的课程并结合个人理解整理而成,涵盖了项目改造、框架结构分析以及多个关键功能模块的深入探讨。以下将逐一解析这些知识点。 1、**项目改造**:首先,从源代码仓库获取...
- **面向对象编程基础:** 对于希望在LabVIEW软件开发上有更高成就的同学来说,掌握面向对象编程语言(如Java、C++或Objective-C)是非常有益的。 通过以上分享,希望能够帮助到正在学习LabVIEW或者对LabVIEW感兴趣...
java坑爹的笔试题 cpp-primer-5th C++ ...第12章动态内存个人觉得对于一个想要深入学习C++的人来说非常重要,对于内存的理解、动态数组、new和delete运算符,对于C++的理解更加”底层“一点,最后12.
软件大小仅1M多一点,非常小巧,无需网络连接即可使用,这意味着它可以在任何有电脑的环境下快速启动,无论是开发环境、出差途中还是个人学习,都能随时记录灵感和学习心得。 3. **无需安装**: 这款笔记本软件...
"驾校一点通源码.zip" 是一个包含了驾校一点...通过分析和学习这个源码,开发者不仅可以了解一个完整的在线教育平台的架构,还能从中学习到具体的编程技巧和最佳实践,对于提升个人技能和开发类似项目有着极大的帮助。
对于量化投资者而言,熟练使用至少一个交易平台至关重要,因为平台的熟悉度直接影响到交易策略的开发和实盘操作的效率。此外,MATLAB、R、SAS等统计分析软件以及C/C++、JAVA、Python等编程语言的掌握,也是量化投资...
尽管这类项目在技术层面并不复杂,但在实施过程中,作者意识到了分享个人经验和技巧的重要性,尤其是在Java Swing框架的应用方面。 #### 二、Swing框架概述 Swing是Java平台中的一个图形用户界面(GUI)工具包,它为...
我的一点心得:在这个版本之前, 我还写过一个版本,玩法不一样, 所以开始没考虑拼图是否有解, 以 为只要通过移动就等得到全部想要的结果. 界面也不好看, 说实话, 这次这个界面, 我觉得勉强还能接受, 没有 找到那种...
很抱歉,但根据您提供的信息,标题和描述似乎与IT行业知识无关,而是指向一个可能包含某种交易策略或个人心得的压缩文件。标签和压缩包内的文件名与标题相同,进一步确认了这一点。然而,您要求的是IT领域的专业知识...
在“LearningBlog:日常学习写的一点博客”这个项目中,我们可以看出这是一份个人学习历程的记录,可能包含了作者在IT领域的各种学习心得、笔记和技术分享。由于没有具体的标签信息,我们将根据“LearningBlog-main”...
这篇笔记是关于Android开发的个人珍贵经验与心得总结,涵盖了从基础知识到高级技巧的全方位内容。在Android开发的世界里,无论是初学者还是资深开发者,都能从中找到有价值的信息。 一、Android系统架构 Android...
【描述】中的“刚过程序员,这是一点资料”表明这些资料是某个已经通过程序员资格考试的人分享的,可能包含了一些个人的备考经验、学习心得或者是他认为比较有用的学习资源。"晕,一定要20字以上~"这部分更像是作者对...
每当遇到难题时,你会主动上网搜索解决方案,参考GitHub上的开源代码,甚至加入了一些在线论坛和社区,与其他爱好者交流心得。这种自主学习的精神对于未来的学习和发展至关重要。 此外,你还学会了如何保护个人信息...
这一点表明文档可能包含了社区讨论和互动的元素,可能融入了社区成员在面试准备过程中的经验分享和心得体会。 通过上述内容的总结,我们可以看到文档旨在为IT行业求职者提供一个全面的面试准备资源,不仅包括答案和...