java教学讲义内容全面.docx

上传人:b****2 文档编号:919082 上传时间:2023-04-30 格式:DOCX 页数:29 大小:36.69KB
下载 相关 举报
java教学讲义内容全面.docx_第1页
第1页 / 共29页
java教学讲义内容全面.docx_第2页
第2页 / 共29页
java教学讲义内容全面.docx_第3页
第3页 / 共29页
java教学讲义内容全面.docx_第4页
第4页 / 共29页
java教学讲义内容全面.docx_第5页
第5页 / 共29页
java教学讲义内容全面.docx_第6页
第6页 / 共29页
java教学讲义内容全面.docx_第7页
第7页 / 共29页
java教学讲义内容全面.docx_第8页
第8页 / 共29页
java教学讲义内容全面.docx_第9页
第9页 / 共29页
java教学讲义内容全面.docx_第10页
第10页 / 共29页
java教学讲义内容全面.docx_第11页
第11页 / 共29页
java教学讲义内容全面.docx_第12页
第12页 / 共29页
java教学讲义内容全面.docx_第13页
第13页 / 共29页
java教学讲义内容全面.docx_第14页
第14页 / 共29页
java教学讲义内容全面.docx_第15页
第15页 / 共29页
java教学讲义内容全面.docx_第16页
第16页 / 共29页
java教学讲义内容全面.docx_第17页
第17页 / 共29页
java教学讲义内容全面.docx_第18页
第18页 / 共29页
java教学讲义内容全面.docx_第19页
第19页 / 共29页
java教学讲义内容全面.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

java教学讲义内容全面.docx

《java教学讲义内容全面.docx》由会员分享,可在线阅读,更多相关《java教学讲义内容全面.docx(29页珍藏版)》请在冰点文库上搜索。

java教学讲义内容全面.docx

java教学讲义内容全面

1.引言

Java程序设计已在很多院校中被列为计算机专业教学体系中一门重要的主干课。

在众多计算机程序设计语言中,Java语言充分体现出了面向对象程序设计语言的众多特点[1]。

因此,怎样

教好、学好该语言,通过Java语言理解、掌握面向对象程序设计语言的精髓,并能灵活运用去解决实际问题,便成了计算机教学中一个研究的热点。

垃圾收集机制是Java的一项关键技术,用于动态存储管理,自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。

正因为Java中的垃圾收集机制复杂而特殊,涉及到的多是内存管理问题,这使它成为Java教学中的重点和难点。

本人将结合自己的教学经验,对该部分的教学进行一些探讨。

2.与C++比较来理解垃圾收集器的作用

对比学习是一种很好的学习方式。

可以去理解隐藏在语言背后的设计哲理,让我们更好地掌握编程语言的精髓。

C、C++在我校是Java的先修课程,在内存管理方面与Java语言作对比去理解垃圾收集机制的问题能收到较好的效果。

在C++程序设计语言中,无论是对象还是动态配置的资源或内存,都必须由程序员自行声明产生和回收。

若程序为某个变量分配了内存,但变量使用完之后却没有相应执行内存释放操作,就会导致该变量所占用的内存空间无法释放,直到程序终止。

我们称这种无法回收的内存空间为"内存漏洞(MemoryLeaks)"。

若应用程序是一个不间断地运行的应用系统,产生内存漏洞的代码被反复执行,那么内存漏洞将越来越大,直到系统内存被耗尽,从而导致应用系统崩溃。

内存漏洞成为困扰C++语言所开发的应用系统的难题。

为解决此类问题,Java提供了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再引用的对象。

在Java程序中,内存仍由程序动态地分配,通过New等操作完成,但不需要管理内存的释放,因为Java虚拟机(JVM)提供了垃圾收集器,负责将不再引用的对象回收,以释放内存空间。

3.垃圾回收算法的突破

Java的垃圾收集算法对应用程序的性能有着非常重要的影响,有些时候甚至成为应用程序的性能瓶颈,因此Java学习者有必要了解这一内部机制。

SUN公司在每次发布的新版JDK中都为其中的垃圾收集器做了一些改进。

主要的垃圾收集算法包括引用计数(ReferenceCounting)、标记-清除(Mark-Sweep)算法、复制(Copying)算法、标记-整理(Mark-Compact)算法。

在单位时间教学中对各个算法的分析不可能面面俱到,这里从三个最具代表性的算法分析突破:

(1)引用计数算法

引用计数算法的垃圾收集策略是引用计数。

每一个对象都有一个关联的引用计数,表示连接该对象的活跃引用的数量。

当有引用连接至对象时,引用计数加1,当引用离开作用域或置为null时,引用计数减1。

如果对象的引用计数是零,那么它就是可以回收的垃圾。

这一算法在执行垃圾收集任务时速度较快,但管理引用计数的开销在整个程序生命周期中将持续存在,且引用计数算法无法正确释放循环引用的内存块。

(2)复制算法

复制算法把整个堆分成相等的两块。

在任意时刻,只有其中的一块用于分配对象,另一块是空的。

在垃圾收集时,用于分配对象的一块称为源块,空的一块称为目的块,所有从根对象出发可及的对象都从源块拷贝到目的块,在下一次垃圾收集时,源块和目的块互换。

(3)"标记-清除"算法

基于标记-清除算法的垃圾收集器,从根开始遍历所有可到达的对象,标记出可到达对象,剩下的就是垃圾对象。

然后就对堆进行清除,所有没有标记的对象都作为垃圾回收并返回空闲列表。

在不同算法的讨论中,重点是分析它们的优缺点,如引用计数算法最为直观,常用来说明垃圾收集的工作方式,特别适合教学分析Java垃圾收集算法的入门分析,但它从未被应用于任何

一种JVM实现中[2]。

复制算法效率很高,而且不存在内存碎片,缺点是被分配的内存只有一半是可用的,一半是空闲的,长寿的对象在每次收集时都要来回复制。

而标记和清除是一种"停止"式的垃圾收集技术,收集暂停可能会很长,在清除阶段整个堆都是可访问的,这对于可能有页面交换的堆的虚拟内存系统有非常负面的性能影响,另外它还容易使堆产生碎片。

4.熟悉与垃圾回收有关的一些常用方法

Java语言提供了一些和垃圾回收有关的方法,以便在必要的时候能和垃圾收集器进行交互。

Runtime类以及System类中的一些方法可以很方便地让你调用垃圾收集程序,从而使尚待进行的清除动作得以执行,也可以让你查询当前系统的内存状态情况。

Runtime类中相关的方法如下:

publicvoidgc()

该方法请求虚拟机执行无用对象的回收任务,以便重用内存资源。

当Runtime类的gc方法被调用执行时,也同样不能保证垃圾会实际执行回收动作。

publicvoidrunFinalization()

该方法请求虚拟机在那些不可达的对象上,调用从前还没有执行过的finalize方法。

publiclongfreeMemory()

该方法返回系统中可用内存字节数。

publiclongtotalMemory()

该方法返回系统中全部内存资源字节数。

在讲述这些方法的过程中,本人采用的是引导学生去看JDK的原始英文版帮助文件,也特别注意类的继承关系及所包含的方法,也为将来的Java开发打下坚实的基础。

5.示例程序的分析

一个精炼恰当的示例程序能加深学生对Java垃圾收集机制的理解和直观感觉,取得较好的课堂效果。

如下面的程序:

publicclassFinalizeTest{

publicstaticvoidmain(String[]args){

for(inti=0;i<10;i++){

newSeed();

}

System.out.println(Seed.gcount+"instancesarecreated.");

Runtimert=Runtime.getRuntime();

System.out.println("MemorybeforeGarbageollection:

"+rt.freeMemory()

+"/"+rt.totalMemory());

rt.gc();

System.out.println(Seed.fcount+"instancesarekilled.");

System.out.println("MemoryafterGarbageCollection:

"+rt.freeMemory()

+"/"+rt.totalMemory());

System.exit(0);

}

}

classSeed{

staticintgcount=0;//gcount用来记录创建的实例总数

staticintfcount=0;//fcount用来记录已被清除的实例总数

publicSeed(){

gcount++;

System.out.println("Instance:

"+this.toString()+"instancesare

created.");

}

protectedvoidfinalize()throwsThrowable{

super.finalize();

fcount++;

System.out.println("Instance:

"+this.toString()+"instancesare

killed.");

}

}

在该例中需要特别加以分析说明的地方是:

(1)newSeed();只是创建了一系列Seed对象,但这些对象并不被引用,一经创建就成为事实上的"垃圾"。

(2)rt.gc();请求垃圾回收。

(3)classSeed{……}定义了一个Seed类,当创建实例、清除实例时能显示相关的信息。

(4)对象是否被回收一般是看不见的,但一个对象的空间被回收之前总会调用finalize方法。

在Seed类定义中重写finalize方法时调用了父类的finalize方法,如果不调用父类的finalize方法,可能对象中自己的那部分会被正确回收,而父类的那一部分却没回收。

即使我们所定义的类并没有继承任何类,也要尽量养成调用父类的finalize方法的好习惯。

由于垃圾收集程序是一个优先级最低的线程,启动时机不确定,因此每次的输出结果不一定一样。

由结果的不确定性,教师也正好分析垃圾收集器收回无用对象的顺序并不固定,也可能暂时不去回收。

内存资源的清除运作在垃圾收集器认为合适的时间进行,垃圾收集器不会做任何对象回收顺序的保证,回收将以最有效的方式进行,从而将回收的开销降至最低。

6.结论

在Java垃圾收集机制的教学中,作者通过在内存管理上与C++的对比、垃圾回收算法的突破、熟悉了与垃圾回收有关的一些常用方法,再深入分析一个恰当精炼的例题,可使学生不仅能

深刻理解垃圾收集机制,同时提高了学生的编程能力。

也体现了程序设计语言的教学中,最重要的是让学生通过理解掌握该语言的特点,把握Java语言编程的精髓。

Java吸收了C/C++的优点和语法,同时减少复杂性和奇异性,添加了安全性和可移植性.但Java不仅仅是一种编程语言,还是一种开发环境,一种应用环境,一种部署环境.Java从语言级提供了线程概念和强大的网络功能,为操作系统和计算机网络等课程中理论知识的验证和实践提供了直观有效的工具.Java拥有丰富的技术成熟且经过大量测试的类库.在Java类库中,Java.util包提供了一套功能强大的数据结构,让您能更方便、灵活地操纵数据.因为Java.util包不但将常用的数据结构都定义好了,而且连各种操作都定义成了可以直接调用的方法.这就大大降低数据结构学习的难度.

Java适用于Web的许多特征,例如平滑移植、安全、健壮和可扩展等,为面向对象软件工作设计提供了实现工具和想象空间.遵循面向对象思想,软件生命周期的各个部分都将从面向对象的角度出发实现.

(Java教学中面向对象编程思想的培养)

在Java教学内容中涉及了面向对象的概念和特点,但是如何结合Java教学内容找出面向对象技能培养的结合点和突破口则是双方面升华的关键。

本文结合在Java教学过程中的体会,提出如何在Java学习中培养学生面向对象的编程思想。

Java教学的目的,一方面使面向对象的编程技能得到训练,另一方面,掌握Java的编程方法,在所有的Java教材中,都含有面向对象的基本内容,而在教学内容和方法上,要把握两者之间的渗透性和相互作用性。

(一)加强面向对象特征的认识

我们是以面向对象的程序设计方法来进行Java程序设计的,所以在Java中要以面向对象的思想来分析问题和解决问题,首先把握面向对象的基本概念和特征,然后严格遵循面向对象的设计思想来进行编程训练。

从面向对象设计的优点出发,引导程序设计思路:

可重用性使我们在应用程序中大量采用成熟的类库,从而缩短开发时间。

继承和封装性使我们要分析直接表现组成问题区域的事物以及这些事物间相互联系,易于程序的维护、更新和升级。

(二)发掘教学内容的结合点

在Java教学中,综观教学内容,除了Java的基本语法之外,都是以Java提供的强大API类为主要学习内容,Java类都包含在不同的包中,我们可以把经常应用的字符串String类作为突破点,提高学生对概念的理解和类方法的正确使用的能力。

所有语言中都涉及对字符串的处理,如Delphi和C语言中,用函数实现子字符串的获取,而在面向对象设计中则以类的方式提供,对字符串对象进行了封装,在该类中提供了大量的方法,如charAt()、substr()等等,我们把它作为成熟的类,在任何应用程序中都可以通过创建String对象而实现对字符串的相关操作,我们只关心如何正确使用该类中的方法而不关心方法的内部实现过程。

通过String类的学习和比较,使学生对类封装的实质、类封装的作用和意义、类的正确引用都有一个清晰的认识,对后边的学习起到抛砖引玉的作用。

在String类学习的基础上,后续的Java类,如线程、异常、输入/输出、网络编程等都是以掌握这些类的作用和技术应用为目的的,我们都可以应用系统提供的类而完成自己的任务,以缩短开发周期,必要时我们还可以通过继承等方法建立自己的类库等,便于扩充自己的功能类。

(三)改变观念、转变思路

C语言作为基础课程而首先开设,它培养了学生的基础编程能力,它是面向过程的,在后续教学上向面向对象的设计思想转变,如C++、VisualC++等,同样在Java中我们也要进一步转变设计思路,例如在求阶乘值的示例中,我们不妨打破直接解决问题的方法,从两种程序的设计出发而完成思想的转变。

一是面向过程的实现:

在类中直接在main方法中,通过初值的设计、结果的计算、结果的输出来完成问题的处理,但是这种模式是完全面向问题而求解的,没有把面向对象的设计方法考虑进去。

二是以面向对象的问题分析进行实现:

把阶乘看做一个对象,而所有阶乘问题抽象为类,该类用final修饰而不能再被继承,除了构造方法外,运用方法重载机制设计两个阶乘值计算方法:

非静态不带参数的方法和静态带参数的方法,这样在应用程序中就可以通过类名或者类对象两种方法实现阶乘值的计算,增加了类应用的灵活性。

通过对简单问题的分析和解决就能达到掌握static修饰符的作用和方法重载应用的目的。

所以,观念的形成和经验的积累有利于面向对象编程技能的培养。

三、用面向对象的思维方法指导Java程序的开发

很多同学对Java的面向对象的特性琢磨良久,自认为有所领悟,也开始有意识地运用OOP风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。

例如要实现这样一种功能:

要发广告邮件,广告邮件列表存在数据库里面。

倘若用C来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail的sendmail命令发送。

然后考虑用Java来实现,既然是OOP,就不能什么代码都塞到main过程里面,于是就设计了三个类:

一个类是负责读取数据库,取邮件地址,调用qmail的sendmail命令发送;一个类是读邮件内容,MIME编码成HTML格式的,再加上邮件头;一个主类负责从命令读参数,处理命令行参数,调用发email的类。

把一件工作按照功能划分为3个模块分别处

理,每个类完成一件模块任务。

仔细地分析一下,就会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。

因此,在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底

层实现程序这样的出发点来达到满足现实世界的软件需求的目标。

这样的分析方法其实是不适用于Java这样面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java实现起来轻松得多,逻辑上也清楚得多。

面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。

举一个非常简单的例子:

假使现在需要写一个网页计数器,客户访问一次页面,网页计数器加1,计数器是这样来

访问的http:

//hostname/count.cgi?

id=xxx。

后台有一个数据库表,保存每个id(一个id对应一个被统计访问次数的页面)的计数器当前值,请求页面一次,对应id的计数器的字段加1(这里我们忽略并发更新数据库表,出现的表锁定的问题)。

如果按照一般从程序实现的角度来分析,我们会这样考虑:

首先是从HTTPGET请求取到id,然后按照id查数据库表,获得某id对应的访问计数值,然后加1,更新数据库,最后向页面显示访问计数。

现在假设一个没有程序设计经验的人,他会怎样来思考这个问题呢?

他会提出什么样的需求呢?

他很可能会这样想:

我需要有一个计数器,这个计数器应该有这样的功能,刷新一次页面,访问量就会加1,另外最好还有一个计数器清0的功能,当然计数器如果有一个可以设为任意值的功能的话,我就可以作弊了。

作为一个没有程序设计经验的人来说,他完全不会想到对数据库应该如何操作,对于HTTP变量该如何传递,他考虑问题的角度就是我有什么需求,我的业务逻辑是什么,软件应该有什么功能。

按照这样的思路(请注意,他的思路其实就是我们平时在生活中习惯的思维方式),我们知道需要有一个计数器类Counter,有一个必须的和两个可选的方法:

getCount()//取计数器值方法

resetCounter()//计数器清0方法

setCount()//设计数器为相应的值方法

把Counter类完整的定义如下:

publicclassCounter{

publicintgetCount(intid){}

publicvoidresetCounter(intid){}

publicvoidsetCount(intid,intcurrentCount){}

}

解决问题的框架已经有了,来看一下如何使用

Counter。

在count.cgi里面调用Counter来计数,程

序片断如下:

//这里从HTTP环境里面取id值

CountermyCounter=newCounter();//获得

计数器

intcurrentCount=myCounter.getCount(id);

//从计数器中取计数

//这里向客户浏览器输出

程序的框架全都写好了,剩下的就是实现

Counter类方法里面具体的代码了,此时才去考虑具

体的程序语言实现的细节,比如,在getCount()方法

里面访问数据库,更新计数值。

从上面的例子中看到,面向对象的思维方法其

实就是我们在现实生活中习惯的思维方式,是从人

类考虑问题的角度出发,把人类解决问题的思维方

式逐步翻译成程序能够理解的思维方式的过程,在

这个翻译的过程中,软件也就逐步被设计好了。

在运用面向对象的思维方法进行软件设计的过

程中,最容易犯的错误就是开始分析的时候,就想到

了程序代码实现的细节,因此封装的类完全是基于

程序实现逻辑,而不是基于解决问题的业务逻辑。

面向对象的设计是基于解决业务问题的设计,

而不是基于具体编程技术的设计。

如果说传统的面

向过程的编程是符合机器运行指令的流程的话,那

么面向对象的思维方法就是符合现实生活中人类解

决问题的思维过程。

在面向对象的软件分析和设计的时候,要提醒

自己,不要一上来就去想程序代码的实现,应该抛开

具体编程语言的束缚,集中精力分析我们要实现的

软件的业务逻辑,分析软件的业务流程,思考应该如

何去描述和实现软件的业务。

毕竟软件只是一个载

体,业务才是我们真正要实现的目标。

但是在设计过程中,心里却往往在担心,如果我

完全不去考虑程序代码的实现的话,那么我怎么知

道我的设计一定合理呢?

我怎么知道我设计的类、

接口一定可以实现呢?

所以经常可以看到的现象就

是:

在设计过程中,虽然知道不能过早考虑代码实

现,但是每设计一个类、一个接口,心里都要不知不

觉地用自己熟悉的编程语言大概的评估一下,看看

能否编出来,因此,一不小心就会又回到按照程序功

能实现的思路进行设计的老路上去了。

使用面向对象的思维方法,其实是一个把业务

逻辑从具体的编程技术当中抽象出来的过程,而这

个抽象的过程是自上而下的,非常符合人类的思维

习惯,也就是先不考虑问题解决的细节,把问题的最

主要的方面抽象成为一个简单的框架,集中精力思

考如何解决主要矛盾,然后在解决问题的过程中,再

把问题的细节分割成一个一个小问题,再专门去解

决细节问题。

当然Java只是面向对象编程技术涉及的课程

之一,理论是基础,应用是目的,在体系化的教学内

容设置基础上,应该通过相关课程知识的融合和对

实际问题的系统设计而使学生的综合实践能力得到

培养。

(责任编辑 孔德瑾)

笔者在从事java的教学工作时发现在讲授

java基础理论知识部分时,学生注意力不集中,甚至觉得枯

燥乏味。

原因是同学们在学习java课程之前已学习过C或

C++,而java语言中的一些程序设计语法与这些语言相似,

学生感觉是在重复学,可学过后又不能抓住java与C或C++之

间到底有什么区别,在实际应用编程时常会出错。

所以笔者

在理论教学时先将两种语言的区别分析清楚,然后再让学

生学习程序设计语法。

而Java语言作为一门纯面向对象的程序设计语言,需

要大量的实践练习才能较好掌握。

而学生在学

习java程序之前已经开设了C语言和数据结

构课程,对java语法级别的学习相对容易,但

学完之后对java能用来做什么和怎么做产生

困惑,因此对其进行教学改革是非常必要的。

实用型软件

编程人员的基本素质包括以下几个方面:

掌握

基本的语言和算法,具有一定的程序设计能力;

具有面向对象的概念和设计思想,精通一到二

门面向对象的程序设计语言;掌握数据库的基

本概念和基本应用;具有一定的项目经验,在校

期间参与一些项目设计;具有现代软件工程思

想,了解软件开发的一般方法,熟悉软件开发

的一般过程,精通一些实用的软件开发工具;

具有较强的代码编制能力,同时有一定的软件

测试能力。

Java教学的目的,一方面使面向对象的编

程技能得到训练,另一方面掌握Java的编程

方法,而在教学内容和方法上,要把握两者之

间的渗透性和相互作用性。

理解面向对象的基本概念和特征,然后严

格遵循面向对象的设计思想来进行编程训练。

在面向对象的设计方法中,对象、消息、方法、

类是其基本概念,封装性、继承性和多态性是

其基本特征。

在对基本特征理解的基础上,配

合图示方式来体现这些概念和关系的直观表

达,使学生首先牢固掌握好面向对象的概念和

特征,为发挥其编程指导性作用打下基础。

念的理解和图示的配合,从面向对象设计的优

点出发,引导程序设计思路,可重用性使我们

在应用程序中大量采用成熟的类库,从而缩短

开发时间。

继承和封装性使我们要分析直接

组成问题区域的事物以及这些事物间相互联

系,易于程序的维护、更新和升级。

针对上述的各面向对象的主要原则,我们

结合实例与学生共同讨论。

同时为了进一步

加强学生的实际设计和沟通能力,我们以通用

的UML图作为主要的设计工具,使得师生之

间、同学之间使用标准的图形化工具进行交

流。

1.2注重面向对象编程思想的培养

加强对面向对象的编程思想培养,才能总

体把握和运用Java这一语言工具。

学生在刚

开始使用Java编写程序时很难从面向过程的

程序设计的思想转换到面向对象的思想。

Java中,需要以类为基本单位来进行编写程

序,通过类中的方法调用来实现整个程序的功

能。

例如:

设计一个时钟。

学生看到这个题目,

首先想到的是这个题目需要哪些数据类型?

题目的算法如何?

这种思路是典型的面向过程

的程序设计思想,按照面向对象的程序设计思

想,应做如下设计:

首先从时钟的功能角度出发,该类应具备获取系统时间的值、充当计

时器、为计时器清零等方法。

类的框架写后,

下一步是如何实现Clock类三个方法里的具

体代码了,此时才去考虑具体的实现细节,从

这个例子中看到,传统的面向过程的编程是符

合机器运行指令的流程的话,而面向对象的程

序设计符合现实生活中解决问题的思维过程。

按照现实生活中习惯的思维方式,从问题出

发,把解决问题的思维方式逐步转变成计算机

能够理解的方式的过程。

它是基于解决问题

的设计,而不是基于具体编程技术的设计。

封装解决问题的业务逻辑,对代码实现的细节

是在业务逻辑编码实现阶段才

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2