华中科技大学电信系Java实验全套教案.docx
- 文档编号:5793611
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:34
- 大小:566.43KB
华中科技大学电信系Java实验全套教案.docx
《华中科技大学电信系Java实验全套教案.docx》由会员分享,可在线阅读,更多相关《华中科技大学电信系Java实验全套教案.docx(34页珍藏版)》请在冰豆网上搜索。
华中科技大学电信系Java实验全套教案
第一次实验、Java程序基础及面向对象程序基础
第1节实验目的
1.把握Java语言基础
2.把握面向对象的基础知识
第2节实验内容
2.1实验一
编写名为的Java源文件,在main函数内完成全数工作,声明一个float类型的变量score并赋值,当score大于,输出“评判:
合格”字样,当score大于,输出“评判:
良好”字样,当score大于,输出“评判:
优秀”字样。
利用If-else语句实现,能够人为修改float的初始值,然后从头编译,查看运行结果。
要求把握:
1.if-else流程操纵语句的大体用法。
2.大体输出方式。
3.字符串的“+”运算。
2.2实验二
编写名为和两个java源文件,一样在main函数内完成全数工作,别离实现同一个功能,即求1+2+3+……+50的和,其和用int变量sum寄存,计算完毕并输出“计算结果为:
××”的字样。
要求把握:
1.for流程操纵语句的大体用法。
2.while流程操纵语句的大体用法。
2.3实验三
创建一个猫类(Cat),包括属性成员出名称(Stringname)、颜色(Stringcolor)和年龄(intage),包括的方式成员有取得名称getName(),修更名称setName(),取得颜色getColor(),修改颜色setColor(),取得年龄getAge(),修改年龄setAge()。
创建一个白猫(John)3岁,一个黑猫(Jack)2岁,将两只猫的所有信息互换后输出。
要求提交两个Java文件,一个仅仅描述猫类,另一个描述互换进程并输出结果。
要求把握:
1.类的大体组成。
2.Java文件的大体组成。
3.方式的构造及挪用。
4.对象的创建及挪用。
其类图如下所示,注意类图中仅仅指明了类的方式名,没有具体指明方式的入口参数和返回值,请实验者自行斟酌。
第3节实验结果
第4节辅助材料
实验一、二的程序模版
/***************************************************************************************************
*第1次实验,程序模版(2001/09/23)
*@author许炜
*@version
*@since
***************************************************************************************************/
publicclassTest{
/***主控方式
*@param命令行参数入口(程序中未用到)
*@returnvoid
*/
publicstaticvoidmain(String[]args)
{
第5节}
第6节
员属性”的方式来赋值。
那么什么又是对象句柄呢?
咱们明白类只是一个抽象概念,将类进行实例化以后,取得的对象才是咱们需要的,那么实例化后咱们如何定位和操作具体的对象呢?
每一个对象都有一个名字(句柄),咱们通过句柄能够向那个对象发消息,希望它改变状态。
就像电视机的遥控器一样,由遥控器来操作电视机。
在对象外直接操作对象属性的例子:
=23;(lightImpl是Light的一个实例)
成员属性也能够是另一个对象,但实际保留的只是那个对象的句柄,也确实是说拥有对象的遥控器罢了,至于有无电视机,还要靠用户自己去实例化。
可是关于大体类型的成员属性,则直接拥有该对象,若是不以为给这些大体类型指明初始值,系统也会给他们缺省值,缺省值如下表:
booleanfalse||int0
char‘\u0000’(null)||long0L
byte0(byte)||float
short0(short)||double
也确实是说对象的成员属性若是是大体类型,则为其开辟存储空间,若是是一样对象,则为对象的句柄开辟存储空间。
成员方式
成员方式和以前咱们常说的函数很相似,它决定了一个对象能够接收什么样的消息,并实现接收消息后的动作。
它大体要素和C语言中的函数的一致,即输入参数,函数体,返回值,但不同的是方式的输入参数和返回值再也不是C中数据类型的范围,而包括对象,即参数和返回值都能够是对象。
在外部对成员方式进行挪用同对成员属性的挪用一样,采纳“对象句柄.成员方式()”的格式,以Light类的brighten为例,图示方式的挪用。
那个地址咱们顺便提一下“构造方式”,构造方式是一个特殊的方式,构造方式必需与类名相同,且没有返回值,它要紧的功能是完成类实例化时一些初始化工作,若是你以为自己编写的类不需要构造方式,也能够不写,可是编译时仍是会执行一个缺省的构造方式,只是那个方式对结果没有阻碍罢了。
6.1Java语言中对象的创建
前面咱们已经提到过一些有关对象的问题,咱们是通过句柄来操作对象的,但句柄是如何来的呢?
句柄是在类实例化成对象的同时取得的,那个实例化的进程确实是对象的创建,对象的句柄是通过声明的进程取得的,对象的实例是通过创建的进程取得的,创建的进程一样是将某一个句柄和某一个对象关联起来的进程。
下面咱们以String那个类型来讲明声明和创建的进程:
如图2-5
由上图咱们明白将一个类实例化的进程逻辑上分为两步,声明和创建,可是也能够将他们在一条语句内完成,声明只是为可能显现的对象构造一个句柄,即买回一个遥控器;创建是构造一个类的实例,那个构造进程若是用户编写了类的构造函数的话,在为对象分派完空间后就会按用户指定的方式对对象进行初始化,即执行用户构造函数。
这就比如是买回一台没有遥控器的电视机;若是将对象实例赋给已经声明且类型匹配的句柄,则完成了整个对象的创建进程,比如将遥控器的发射频率与电视机的接收频率一致,电视机就能够够利用了。
通常电视机买回来就配有遥控器,而咱们通常也将对象的声明和创建一路做。
句柄是寄存在堆栈(Stack)中的,而对象实例是寄存在堆(Heap)中的,他们都是在常规内存RAM中的,可是他们的访问机制不同,效率也不同,是由操作系统和运行环境一起保护的。
6.2作用域问题
大多数语言都提供作用域(scope)的概念,主若是描述一个对象或是变量在哪个范围是可用的,C语言中有局部变量的概念,若是局部变量和外部变量同名,则在内部仍然利用局部变量。
Java一样也有如此的概念,而且加倍灵活,只是利用起来要注意。
第一Java许诺在程序的任何位置声明变量,而变量在其隶属的一对{}之间是有效的,若是离开了那个范围,那么访问那个变量就会犯错。
(那个地址仅仅谈的是局部变量,而不是成员属性)例如:
for(intx=0;x<10;x++)
{
6.3……
6.4
;“*”代表你能够利用那个包里的任何类。
包的治理什么缘故会加倍方便一些,那个地址有个“名字空间”的概念,假设没出名字空间的话,你如何给类命名,你怎么能保证你自己命名的类和系统提供的标准类库和你所利用的他人提供的工具类不冲突。
既然不能保证不重名,那么咱们应该给一个对用户来讲既是唯一的,但又是可不能显现冲突的空间——“名字空间”。
那么如何解决这种唯一性的问题呢?
其实咱们想一想,域名是不是唯一的呢?
是,那么咱们就能够够以域名来标识一个名字空间,如咱们的域名若是是:
的话,那么咱们的包名能够是:
,也确实是将包名到过来写。
那么咱们在代码中应该如此写:
package这一句通常要放在程序的最前面,但注意若是如此写的话,你编写的.java文件应该放在org/hust/ecc/目录下,而且若是要执行的话,必需退到org目录外,用java来执行包括main方式的类。
这是因为本来其中的“.”确实是目录的代替符,包的组织方式也确实是目录的组织方式。
若是你将所有属于一个包的类放在一个目录下,然后全数编译称*.class文件,然后利用jar命令将这些编译后的文件打包,就会生成一个.jar文件,此刻大伙儿明白和文件是如何来的吧!
若是你将class文件打成jar包,不仅这些编译后的文件紧缩寄存,既节省空间,又治理方便,而且查找、转载的效率都很高,而且这一切都靠Java说明器来完成。
那个地址我就想跟大伙儿谈谈Java说明执行的特点。
如图3-1所示:
如图可知,由于通过Java虚拟机,那么同一个class文件能够在任何平台上运行,只要那个平台有相应的虚拟机,而C程序或是其他高级语言编译后,由于是机械能够直接运行的二进制代码,因此一旦平台改换,那么.exe文件就无法执行,必需从头编译,可是有谁会将源代码给你呢?
而且很多平台不是从头编译那么简单。
之因此咱们要说明Java执行的进程,确实是让大伙儿了解Java是说明执行的进程,因此就存在运行时包的定位的问题,而C程序一旦编译通过,运行.exe文件一样没有什么问题。
第7节包的利用
包名的设定咱们已经明白如何解决,那个地址咱们来讲明classpath环境变量的作用,classpath能够包括一个或多个变量,它们作为一种特殊的根利用,从那个地址展开对class搜索。
若是咱们指定classpath中包括目录d:
\test;那么若是程序中有如此的package那么系统在执行时要找寻自己所需的class时,会将两个路径联合起来,形成d:
\test\org\hust\ecc\*.class,如此他就能够够查询到你在那个package里编写的类了。
这也确实是什么缘故咱们用.;能够找到要执行的类,而不利用则找不到要利用的类。
那个地址咱们顺便要提一下的是,若是没有package的语句,那么缺省当前目录下所有文件共一个包。
第8节Java访问指示符
访问指示符能够来修饰一个类,也能够修饰一个成员属性或是方式。
它要紧描述他们是不是能被外界访问,而外界又有哪些划分?
8.1“友好的”
在别的编程语言中咱们能够看到“friendly”那个字样,可是在Java语言中它并非是一个保留字,但并非是说那个含义就没有,其实这是一个包的概念,若是你声明一个属性或方式,而他们的前面什么指示符都没有,即缺省状态,那么确实是“友好的”。
友好的属性咱们成为友元属性,有好的方式咱们成为友元方式。
友元方式和属性,除本类的其他属性或方式能够挪用之外,处于同一个包内的其他类也都能够访问。
这说明一个包内的类之间都是朋友,缺省都是可见和可挪用的。
可是关于包外的类,他们是不可见,也不可挪用的。
因为这是包内封装的特点。
而且大伙儿明白,若是缺省是友元也是最安全的,也是最方便的。
在那个地址咱们提一下必要的设计思想,当你实现一个类时,你必然要操纵那个类对外,专门是对包外类的开放程度,若是开放程度太高,比如属性能够被外界直接修改,那么外部代码就必然会有如此的一句挪用,可是当类内部发生转变时,你敢不敢修改那个属性呢?
不敢,因为这可能设计到很多很多的相关代码的调整,若是你是通过一个方式让用户来调整那个属性,那要方便一些,你在不改方式名的同时对方式进行适当的修改即可。
此刻明白访问指示符的重要性了吧!
8.2Public
Public则不同,它的目的确实是向外界宣布我该将这些方式和属性公布,不管是包内仍是包外的内,都能够对其进行挪用,可是public不因该太多太滥,不然就失去了封装的意义,÷
这和C就没有什么区别了。
8.3Private
Private却是和public相对的一个访问指示符,它的意思是关于任何人,即便是自己的朋友,也不能透露半点的隐私,如此说仿佛有些吓人,其实大伙儿想一想,若是你的一个变量仅仅是用作实现某个功能的一个临时性的变量,你有必要让他人明白吗?
8.4Protected
由于面向对象的概念有一种特殊的关系,继承关系,这种关系比较复杂,父亲的隐私能够让小孩明白吗?
不能,也确实是说即便继承了,private变量一样对儿子是不可见的。
那么若是儿子不是父亲的朋友,那么许多能够和朋友讲的情形是不能对儿子讲的。
也确实是说,若是不在一个包内,友元属性和方式是无法挪用的,那总有一些情形是父亲给儿子特殊的待遇吧,比如:
家里家产有多少呀?
而这些能够protected来讲明,可是大伙儿注意,在同一个包里,别的类也能够访问这些变量,而在包外,只有从父类继承的子类才能访问父类对象。
8.5总结
同一个类中
同一个包中
不同包中的子类
不同包中的非子类
private
★
default
★
★
protected
★
★
★
public
★
★
★
★
★表示能够访问
第9节一个抽象的实例
package工具;
publicclass灯泡
{
privateint亮度;
publicvoid点亮(){……}
publicvoid熄灭(){……}
privatevoid限亮(){……}
void闪亮(){……}
}
package工具;
publicclass音响
{
……
publicvoid自动操纵()
{
依照音乐节拍自动操纵灯的闪亮;
}
}
importclassRunEnvironment
{
publicstaticvoidmain(String[]args)
{
灯泡灯泡A=new灯泡();
音响音响B=new音响();
灯泡A.点亮();
灯泡A.限亮();
灯泡A.闪亮();
音响B.自动操纵();
}
}
第六章、类的继承
第10节继承的思想与实现
10.1继承的思想与实现
继承(inheritance)从原有的类中派生出新的类型,加入新的代码,可是并非会对原有的类产生任何的阻碍。
简单地说确实是一个类拥有另一个类的所有属性和方式,那么这两个类就之间的关系确实是继承关系。
被继承的类成为父类或超类,继承的类叫子类。
那个地址涉及到的大部份工作都是由编译器完成。
Java里的继承和C++里的继承是不同的,C++是许诺多继承的,即一个儿子能够有多个父亲,即同时继承多个父类的属性和方式,那么这确实是说,若是一个系统过于复杂的话,对象之间的关系可能是一种及其复杂的网状结构,你很难判定你所编辑的子类的一些属性和方式是来自于哪个父类,因此保护和利用起来难度将会大大增加。
可是Java在这一点上就简化了,Java仅仅许诺单继承,也确实是说一个子类只能有一个父类,可是一个父类仍是能够有多个子类,确实是依托这种唯一性,能够很方便地保护一个类的继承系统。
那么继承能够为咱们带来什么益处呢?
继承实际上是抽象的逆进程,咱们在分析系统时往往要对纷繁复杂的对象系统进行分析和抽象,要尽可能找出不同对象的相同点,从而最大限度的减少类的数量,若是一个系统的类过量,而且类之间有很多的冗余,这说明那个系统的抽象工作做的并非好。
举个例子:
此刻有人、猴子、猩猩三中对象类型,有两种抽象,一种抽象是为每一个具体对象构建一个具体的类别,如人类、猴子类、猩猩类;还有一种抽象有四个类,一个父类:
龄长类,三个子类:
人类、猴子类、猩猩类。
从表面上看,第二种抽象仿佛比第一种抽象更麻烦,构造的类也就更多。
可是实际的成效却是第二种抽象加倍适合一些,假设没有将龄长类抽象出来的话,那么人类、猴子类及猩猩类的所有一起点,不管是体形、行为都必需在每一个类中重复,咱们明白他们的相同点必然大于不同点,若是咱们别离来描述各个类型,会发觉这些类之间有超级多的重复的东西。
而若是将龄长类抽象出来,其实猴子、猩猩和人区别于龄长类的特点并非是很多,因此别离描述起来就超级方便。
尤其在子类中描述的是区别,而一起点在父类中都已经描述过了。
可是抽象只是为了加倍方便的组织类的层次结构,而真正描述系统仍是靠的是实实在在具体的对象,这些对象又是从抽象的最底层的具体类实例化过来的,咱们都明白抽象最底层的类是通过层层继承出来的,因此抽象是设计进程中的,而继承是在实现进程中的。
没有抽象-继承的进程,描述系统确实是“就事论事”的进程,而这种进程被以为是不可取的。
关于继承,也有标准的画法,一个从子类指向父类的箭头表明一个继承关系,如下图5-1所示:
在Java语言中,继承的保留字为extends,如上例所示,继承的语句应该写成如下形式:
class猴子extends龄长类{……}、class猩猩extends龄长类{……}、class人extends龄长类{……}。
10.2属性的继承与方式的继承
咱们明白若是一个类是从另一个类中继承而来,那么其父类的某些属性和方式能够被子类继承,下面咱们先来讨论类属性的继承问题。
属性的继承
【例程】
——文件——
/***************************************************************************************************
*Java编程思想第6章教学例程,关于类的属性的继承问题(2001/09/26)
*@author许炜
*@version
*@since
***************************************************************************************************/
classFather{
privateinta=1;
intb=2;
protectedintc=3;
publicintd=4;
}
publicclassFieldExtendextendsFather{
/***主控方法
*@param命令行参数入口(程序中未用到)
*@returnvoid
*/
publicstaticvoidmain(String[]args)
{
FieldExtendson=newFieldExtend();
Fatherfa=newFather();
=100;
=200;
法()挪用的方式具体是子类1的方式仍是子类2的方式或是父类的方式。
因此编译器在编译的时候是不明白应该将它与哪个对象绑定起来,因此绑定(binding)确实是将一个方式挪用同一个方式主体连接到一路。
若在程序运行以前执行绑定称为初期绑定,C编译器是典型的初期绑定。
若是编译器在编译时不明白某个方式具体和哪个对象相连,就意味着绑定必需在运行期间执行,因此成为运行期绑定,也确实是后期绑定。
若一种语言实现运行期绑定,则必需有一套机制来方便判定对象的类型,并挪用适当的方式,而那个进程完全交给语言本身和编译器说明器内部去完成,用户只是在设计时考虑这些问题即可。
那么咱们如何体会“将一条消息发给一个对象,让对象自行判定要做什么情形”的含义,咱们看下面的例子:
【例程】
——文件——
/***************************************************************************************************
*Java编程思想第8章教学例程,关于动态绑定的问题(2001/10/2)
*@author许炜
*@version
*@since
***************************************************************************************************/
classShapes{
voiddrawing()
{
"画图形方法");
}
oString());
}
;
import.*;
importdd(contents,;
(……);
;import.*;
importclassSwingApplication{
privatestaticStringlabelPrefix="Numberofbuttonclicks:
";
privateintnumClicks=0;
publicComponentcreateComponents(){
finalJLabellabel=newJLabel(labelPrefix+"0");
JButtonbutton=newJButton("I'maSwingbutton!
");
;
(newActionListener(){
publicvoidactionPerformed(ActionEvente){
numClicks++;
(labelPrefix+numClicks);
}
});
*/
JPanelpane=newJPanel();
(
30,JFrameframe=newJFrame("SwingApplication");
SwingApplicationapp=newSwingApplication();
Componentcontents=();
().add(contents,;
(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
(0);
}
});
();
(true);
}
}
第11节介绍Swing的组件
11.1利用顶级容器
顶级容器的特点是:
第一,屏幕上任意一个显示的组件都必需属于一个容纳层次结构,而每一个容纳层次结构又必需有一个顶级容器作为它的根;第二,每一个顶级容器都拥有一个内容面板(contentpane),咱们添加可视组件实际上是往内容面板上添加组件;第三,你唯一能够直接向顶级容器添加的组件是菜单(menu),菜单在顶级容器内,和内容面板平行。
如图12-3所示:
每一个顶级容器都隐式拥有一个中介容器称为rootpane,它是用来治理MenuBar和ContentPane和其他的容器的,一样咱们利用顶级容器时没必要关切rootpane,在rootpane之上的是layeredpane和glasspane,其中layeredpane能够直接容纳MenuBar和ContentPane和其他容器,而glasspane则是用于监听表面输入事件和界面重绘的,其层次结构如图12-4所示:
11.2利用中介容器
下面咱们来具体介绍一下中介容器的内容,中介容器往往用来承载具体原子组件,同时也能够为原子组件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华中科技大学 电信 Java 实验 全套 教案