如何自学java迅速成为java高手文档格式.docx

上传人:b****7 文档编号:22381959 上传时间:2023-02-03 格式:DOCX 页数:51 大小:46.58KB
下载 相关 举报
如何自学java迅速成为java高手文档格式.docx_第1页
第1页 / 共51页
如何自学java迅速成为java高手文档格式.docx_第2页
第2页 / 共51页
如何自学java迅速成为java高手文档格式.docx_第3页
第3页 / 共51页
如何自学java迅速成为java高手文档格式.docx_第4页
第4页 / 共51页
如何自学java迅速成为java高手文档格式.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

如何自学java迅速成为java高手文档格式.docx

《如何自学java迅速成为java高手文档格式.docx》由会员分享,可在线阅读,更多相关《如何自学java迅速成为java高手文档格式.docx(51页珍藏版)》请在冰豆网上搜索。

如何自学java迅速成为java高手文档格式.docx

它的大量代码已由中间件(也就是我们常听到的Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。

最后,Javascript也是大家重点要掌握的,现在所有公司面试几乎没有不问Javascript的

好了,对Java和J2EE有了一些基本概念之后,你就应该编一些程序了,千万不要纸上谈兵哦。

最好从开始找一些小的程序来写,大家可以到上下载一个项目的视频程序及源码参考着写一下!

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?

当然没那么简单,这只是万里长征走完了第一步。

不信?

那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?

你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

这说明你掌所的只是一些基础的知识,并没有完全理解!

你现在最缺的是实际的工作经验和编程思想的培养,而不是书本上那些凭空想出来的程序。

你应该发现你有一点,书本上的内容你都明白了,但是自已写东西还是不会,还是要依赖书本!

记得尚学堂也曾碰到过一个来培训的学员,号称Java都会了,框架也都理解了。

其实他现在只是学到了Java的骨架,却还没有学到Java的精髓。

接下来你得研究设计模式了。

设计模式的书大家可以到尚学堂的网站找到资料下载就可以了!

设计模式是高级程序员真正掌握面向对象核心思想的必修课。

设计模式并不是一种具体"

技术"

它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:

要让你的程序尽可能的可重用,MVC结构(把Model-View-Control分离开的设计思想)是必须要研究的,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,相比来说还是webwork2.0好一些。

然后你再研究一下hibernate和Spring框架,相信你又会上一个台阶。

做完这些,接下来应该做一些实际的项目,不要写一些贪蛇食啊,坦克大战这种不实用的项目,要去写一些有实际应用价值的项目。

Java语言学习六大要点

 

Java的学习是比较复杂的,主要表现在相关的一系列平台、规范和协议上。

有经验的Java程序员都知道,只掌握了Java语言本身很难开发应用程序。

本文不讨论这些复杂的概念,而是我是在北京参加的培训,现在从初学者的角度,对于Java语言本身的学习提出自己的见解和建议。

本文的讨论基于以下假设:

 

1.学习的目的是为了将来进行应用程序的开发,而不是进行语言理论研究

2.将来的应用开发是在成熟的平台上展开,而不是自己从底层开发平台

一、掌握静态方法和属性

静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。

java中大量应用了静态方法和属性,这是一个通常的技巧。

但是这种技巧在很多语言中不被频繁地使用。

理解静态方法和属性对于理解类与对象的关系是十分有帮助的,在大量的java规范中,静态方法和属性被频繁使用。

因此学习者应该理解静态方法和属性。

Java在方法和属性的调用上是一致的,区别只表现在声明的时候,这和c++是不同的。

二、重视接口

在面向对象早期的应用中大量使用了类继承。

随着软件工程理论的不断发展,人们开始意识到了继承的众多缺点,开始努力用聚合代替继承。

软件工程解决扩展性的重要原则就是抽象描述,直接使用的工具就是接口。

接口近年来逐渐成为java编程方法的核心。

另一方面,就应用而言,大部分开发是建立在规范基础之上的,不需要自己建立复杂的继承关系和庞大的类。

因此读懂规范和用好规范已经成为应用程序开发人员的首要任务,Java各项规范的主要描述手段就是接口。

三、学好集合框架

java描述复杂数据结构的主要方式是集合框架。

Java没有指针,而是通过强大的集合框架描述数组、对象数组等复杂的数据结构。

学好这些数据结构的描述方法对于应用程序编写,特别是涉及到服务器方、3层结构编程至关重要。

程序员在这个时候不能再用诸如数据库结果集之类的结构描述数据了。

由于很多语言没有这么强大的集合框架体系,很多初学者不知所措,更不知道拿来做什么用,因此应该引起足够的重视。

四、例外捕捉

java对例外捕捉的强调是空前的,它强迫程序员用显著的与逻辑方法完全不同的方式描述例外捕捉,对于程序描述的完整性和严谨性有很大的意义。

c++也有类似的机制,但是我们看到很多c++程序员并不习惯使用这些机制。

Java的初学者应该充分学习好这种例外捕捉机制,养成良好的编程习惯。

五、多线程需要理解机理

很多java程序员热衷于多线程程序编写,认为是对逻辑能力的挑战。

其实在大量应用中根本就不需要编写多线程程序,或者说大多数编写应用程序的程序员不会去写多线程程序。

这是因为多线程机制都内置到基础平台当中了。

程序员应该了解的是多线程原理和多线程安全,这对于今后准确地把握程序是至关重要的。

例如JSP中编写到不同的位置对于多个用户环境的安全影响完全不同,又如著名的SuperServlet是每一个访问作为一个进程,但是每一个页面是一个线程,和Servlet正好相反,对程序的性能和安全的影响有天壤之别。

六、了解网络编程

java号称是最强的网络编程语言,但是大多数应用程序开发人员是从来不会自己开发什么底层的网络程序的。

需要做只是了解原理就够了。

网络机制的实现是靠平台实现的,除非自己开发平台,否则是不需要知道socket怎么实现,怎么监听访问的。

因此在这方面花太多的功夫就偏离了“将来的应用开发是在成熟的平台上展开,而不是自己从底层开发平台”这一假设。

Java三种常见异常及解决

异常跟普通的警告等有一定的区别。

当应用程序发生异常时,会中断正在执行的程序的正常指令流。

也就是说,发生异常后面的代码将得不到正确的执行。

甚至还会触发数据库的回退操作。

在Java的常见异常中,异常包括预定义异常与自定义异常。

这两种异常的类型互为补充。

作为一个合格的程序开发人员,要善于在应用程序中使用异常。

这可以提高应用程序的交互性。

同时,也是保证应用程序正常运行的前提。

故异常的处理对于开发一个优秀的应用程序来说非常的重要。

为此笔者认为程序开发人员应该对Java应用程序的常见异常有一个深入的了解。

只有在了解这些常见异常的情况下,才能够做好自定义异常的处理。

一、Java常见异常的类型与原因。

对于Java应用程序的常见异常,笔者认为程序开发人员要从两个方面去了解。

一是要知道有哪些常见的Java应用程序异常,二是需要知道哪些原因可能会造成这个异常。

这不仅需要程序管理人员在日常工作中要注意积累,在必要的情况下还需要去从其它渠道收集资料。

笔者对此就进行一个分析,希望能够对各位程序开发人员有一定的帮助。

1、 

SQLException:

操作数据库异常类。

现在的Java应用程序大部分都是依赖于数据库运行的。

当Java应用程序与数据库进行沟通时如果产生了错误,就会触发这个类。

同时会将数据库的错误信息通过这个类显示给用户。

也就是说,这个操作数据库异常类是数据库与用户之间异常信息传递的桥梁。

如现在用户往系统中插入数据,而在数据库中规定某个字段必须唯一。

当用户插入数据的时候,如果这个字段的值跟现有的纪录重复了,违反了数据库的唯一性约束,此时数据库就会跑出一个异常信息。

这个信息一般用户可能看不到,因为其发生在数据库层面的。

此时这个操作数据库异常类就会捕捉到数据库的这个异常信息,并将这个异常信息传递到前台。

如此的话,前台用户就可以根据这个异常信息来分析发生错误的原因。

这就是这个操作数据库异常类的主要用途。

在Java应用程序中,所有数据库操作发生异常时,都会触发这一个类。

所有此时Java应用程序本身的提示信息往往过于笼统,只是说与数据库交互出现错误,没有多大的参考价值。

此时反而是数据库的提示信息更加有使用价值。

2、 

ClassCastException:

数据类型转换异常。

在Java应用程序中,有时候需要对数据类型进行转换。

这个转换包括显示的转换与隐式的转换。

不过无论怎么转换,都必须要符合一个前提的条件,即数据类型的兼容性。

如果在数据转换的过程中,违反了这个原则,那么就会触发数据类型转换异常。

如现在在应用程序中,开发人员需要将一个字符型的日期数据转换为数据库所能够接受的日期型数据,此时只需要在前台应用程序中进行控制,一般不会有问题。

但是,如果前台应用程序缺乏相关的控制,如用户在输入日期的时候只输入月、日信息,而没有年份的信息。

此时应用程序在进行数据类型转换的时候,就会出现异常。

根据笔者的经验,数据类型转换异常在应用程序开发中使一个出现的比较多的异常,也是一个比较低级的异常。

因为大部分情况下,都可以在应用程序窗口中对数据类型进行一些强制的控制。

即在数据类型进行转换之前,就保证数据类型的兼容性。

如此的话,就不容易造成数据类型的转换异常。

如在只允许数值类型的字段中,可以设置不允许用户输入数值以外的字符。

虽然说有了异常处理机制,可以保证应用程序不会被错误的运行。

但是在实际开发中,还是要尽可能多的预见错误发生的原因,尽量避免异常的发生。

3、NumberFormatException:

字符串转换为数字类型时抛出的异常。

在数据类型转换过程中,如果是字符型转换为数字型过程中出现的问题,对于这个异常在Java程序中采用了一个独立的异常,即NumberFormatException.如现在讲字符型的数据“123456”转换为数值型数据时,是允许的。

但是如果字符型数据中包含了非数字型的字符,如123#56,此时转换为数值型时就会出现异常。

系统就会捕捉到这个异常,并进行处理。

Java常见的异常类还有很多。

如未找到相应类异常、不允许访问某些类异常、文件已经结束异常、文件未找到异常、字段未找到异常等等。

一般系统开发人员都可以根据这个异常名来判断当前异常的类型。

虽然不错,但是好记性不如烂笔头。

程序开发人员在必要的时候(特别是存在自定义异常的时候),最后手头有一份异常明细表。

如此的话,无论是应用程序在调试过程中发现问题,还是运行过程中接到用户的投诉,都可以及时的根据异常名字来找到异常发生的原因。

从而可以在最短时间内解决异常,恢复应用程序的正常运行。

这个措施笔者用了很多年,非常的有效。

二、异常管理的实用建议

对于操作数据库异常来说,Java应用程序只提供了一个异常类。

故光凭Java应用程序的错误信息,往往不能够帮助应用程序人员排除错误的原因。

只能够指名是应用程序错误还是数据库错误导致的这个异常。

为了更进一步指明问题的原因,在数据库层面定义异常的时候,最好能够说明具体的原因。

如前台应用程序可能会调用数据库的函数或者过程。

此时在数据库的函数或者过程中做好能够说明某个异常的具体原因。

如根据某个基础表生成另一张表的时候,某个字段不能够为空等等。

将这些异常信息说明清楚后,如果真的遇到类似的异常时,操作数据库异常类就会将数据库的异常信息反会给前台用户。

从而有利于用户寻找问题的原因,并在最短时间内改正。

当然,这需要Java程序员与数据库设计人员进行协调。

其次需要注意的是,异常并不是常态。

也就是说,大部分异常可以通过前提的合理预见与预防,来消除。

如设计到四则运算,可以在前台应用程序窗口中限制在除数字段内输入0值等手段来消除应用程序运行中可能产生的异常。

不过这往往要求应用程序开发人员有比较丰富的工作经验以及由比较严密的思维逻辑。

虽然这有一定的难度,但是笔者认为程序开发人员还是应该往这方面努力,而不要老是让用户作为你的试验品,让用户来发现应用程序中的设计Bug.笔者认为,只有一些实在是程序人员无法控制的因素才允许抛出异常。

如果应用程序开发人员能够意识到这种错误、但是仍然没有引起重视或者采取有效的措施防止出现这种异常,那么笔者是不允许的。

用java多线程断点续传实践

/**

*author:

annegu

*date:

2009-07-16

*/

annegu做了一个简单的Http多线程的下载程序,来讨论一下多线程并发下载以及断点续传的问题。

这个程序的功能,就是可以分多个线程从目标地址上下载数据,每个线程负责下载一部分,并可以支持断点续传和超时重连。

下载的方法是download(),它接收两个参数,分别是要下载的页面的url和编码方式。

在这个负责下载的方法中,主要分了三个步骤。

第一步是用来设置断点续传时候的一些信息的,第二步就是主要的分多线程来下载了,最后是数据的合并。

1、多线程下载:

/***//**

*/

publicStringdownload(StringurlStr,Stringcharset){

this.charset=charset;

longcontentLength=0;

CountDownLatchlatch=newCountDownLatch(threadNum);

long[]startPos=newlong[threadNum];

longendPos=0;

try{

//从url中获得下载的文件格式与名字

this.fileName=urlStr.substring(urlStr.lastIndexOf("

/"

)+1);

this.url=newURL(urlStr);

URLConnectioncon=url.openConnection();

setHeader(con);

//得到content的长度

contentLength=con.getContentLength();

//把context分为threadNum段的话,每段的长度。

this.threadLength=contentLength/threadNum;

//第一步,分析已下载的临时文件,设置断点,如果是新的下载任务,则建立目标文件。

在第4点中说明。

startPos=setThreadBreakpoint(fileDir,fileName,contentLength,startPos);

//第二步,分多个线程下载文件

ExecutorServiceexec=Executors.newCachedThreadPool();

for(inti=0;

i<

threadNum;

i++){

//创建子线程来负责下载数据,每段数据的起始位置为(threadLength*i+已下载长度)

startPos[i]+=threadLength*i;

/**//*设置子线程的终止位置,非最后一个线程即为(threadLength*(i+1)-1)

最后一个线程的终止位置即为下载内容的长度*/

if(i==threadNum-1){

endPos=contentLength;

}else{

endPos=threadLength*(i+1)-1;

}

//开启子线程,并执行。

ChildThreadthread=newChildThread(this,latch,i,startPos[i],endPos);

childThreads[i]=thread;

exec.execute(thread);

//等待CountdownLatch信号为0,表示所有子线程都结束。

latch.await();

exec.shutdown();

//第三步,把分段下载下来的临时文件中的内容写入目标文件中。

在第3点中说明。

tempFileToTargetFile(childThreads);

}catch(InterruptedExceptione){

e.printStackTrace();

首先来看最主要的步骤:

多线程下载。

首先从url中提取目标文件的名称,并在对应的目录创建文件。

然后取得要下载的文件大小,根据分成的下载线程数量平均分配每个线程需要下载的数据量,就是threadLength。

然后就可以分多个线程来进行下载任务了。

在这个例子中,并没有直接显示的创建Thread对象,而是用Executor来管理Thread对象,并且用CachedThreadPool来创建的线程池,当然也可以用FixedThreadPool。

CachedThreadPool在程序执行的过程中会创建与所需数量相同的线程,当程序回收旧线程的时候就停止创建新线程。

FixedThreadPool可以预先新建参数给定个数的线程,这样就不用在创建任务的时候再来创建线程了,可以直接从线程池中取出已准备好的线程。

下载线程的数量是通过一个全局变量threadNum来控制的,默认为5。

好了,这5个子线程已经通过Executor来创建了,下面它们就会各自为政,互不干涉的执行了。

线程有两种实现方式:

实现Runnable接口;

继承Thread类。

ChildThread就是子线程,它作为DownloadTask的内部类,继承了Thread,它的构造方法需要5个参数,依次是一个对DownloadTask的引用,一个CountDownLatch,id(标识线程的id号),startPosition(下载内容的开始位置),endPosition(下载内容的结束位置)。

这个CountDownLatch是做什么用的呢?

现在我们整理一下思路,要实现分多个线程来下载数据的话,我们肯定还要把这多个线程下载下来的数据进行合。

主线程必须等待所有的子线程都执行结束之后,才能把所有子线程的下载数据按照各自的id顺序进行合并。

CountDownLatch就是来做这个工作的。

CountDownLatch用来同步主线程,强制主线程等待所有的子线程执行的下载操作完成。

在主线程中,CountDownLatch对象被设置了一个初始计数器,就是子线程的个数5个,代码①处。

在新建了5个子线程并开始执行之后,主线程用CountDownLatch的await()方法来阻塞主线程,直到这个计数器的值到达0,才会进行下面的操作,代码②处。

对每个子线程来说,在执行完下载指定区间与长度的数据之后,必须通过调用CountDownLatch的countDown()方法来把这个计数器减1。

2、在全面开启下载任务之后,主线程就开始阻塞,等待子线程执行完毕,所以下面我们来看一下具体的下载线程ChildThread。

/***//**

*authorby

publicclassChildThreadextendsThread{

publicstaticfinalintSTATUS_HASNOT_FINISHED=0;

publicstaticfinalintSTATUS_HAS_FINISHED=1;

publicstaticfinalintSTATUS_HTTPSTATUS_ERROR=2;

privateDownloadTasktask;

privateintid;

privatelongstartPosition;

privatelongendPosition;

privatefinalCountDownLatchlatch;

privateFiletempFile=null;

//线程状态码

privateintstatus=ChildThread.STATUS_HASNOT_FINISHED;

publicChildThread(DownloadTasktask,CountDownLatchlatch,intid,longstartPos,longendPos){

super();

this.task=task;

this.id=id;

this.startPosition=startPos;

this.endPosition=endPos;

this.latch=latch;

tempFile=newFile(this.task.fileDir+this.task.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1