Java技术讲义编程技术篇(6)-李铁英
- 格式:pdf
- 大小:3.19 MB
- 文档页数:72
1.1Java2企业级软件开发工程师--- Java语言核心技术培训教学课程(包含有OOP、Application、Applet、GUI、Socket、Java IO等技术)1、课程简介本课程是Java2企业级软件开发工程师中的第一阶段——Java语言核心课程,学员经过四个阶段的课程模块的系统培训学习,将帮助软件开发人员从Java编程语言入手,在接触Java高级应用后循序渐进最终掌握J2EE企业级开发技术。
2、授课特点授课方式是通过大量实例及应用技术讲解Java编程的原理、方法和技巧,使培训班的学员快速掌握Java编程,同时编写出实用的Java应用程序及Applet程序。
3、培训目标在本课程中,培训学员将学会Java语言的语法、如何使用Java来创建图形用户接口(GUI)、事件处理机制、例外处理、多线程、网络编程等编程技术;您也将涉及到文件输入/输出、多媒体编程方面的知识。
该培训课程是“Java2应用开发技术”的基础课程。
4、学习基础本课程适用于熟悉C或C++的编程人员,也适用于想参加Sun Java认证考试的学员。
5、培训内容(可根据具体学员的基础进行适当调整,以便学员能够快速接受)(1)Java语言基础:数据类型、运算符、语句及控制流、数组、字符串等。
(2)Java面向对象编程方法、类与对象、属性、方法、访问控制;构造函数、终结函数、静态成员等;)(3)类的继承与派生、GUI风格的应用程序的格式;this、super的用法、包与接口编程、引用包。
(4)Java Aapplication及Applet编程(原理、格式、实例讲解)。
(5)多线程编程及同步技术(创建方法、格式、实例讲解)。
(6)Java AWT机制;基本组件的编程技术;容器组件编程技术;菜单编程技术;对话框等编程技术;GUI事件编程等;(7)综合练习(重点熟悉在Java应用程序中如何实现组件及事件编程等,并设计出实用的GUI程序)。
Java是什么?(记住)Java是什么?Java——是一种程序设计语言,主要用于网络上的各种应用程序。
什么是跨平台?跨平台就是编译好的程序可以在各种操作系统上运行。
Java真正的内涵就是“海纳百川,有容乃大”:海——就是Java资源平台,含有大量的资源;百川——就是有广大的开发者使用Java技术;容——就是Java技术的开放性,即开源、跨平台、跨网络。
Java技术的独特魅力就是——开放性!Java语言特点(了解)Java语言是SUN公司推出的面向对象程序设计语言,特别适合于Internet应用程序开放,Java语言最大的特点就是:“一次编写,到处运行”!Java语言的11特性(了解)在1995年sun公司推出的Java白皮书中,是这样定义的,Java是:⒈一种简单的语言(Simple Language)——风格类似于C++,语法与C基本相同,提供了丰富的类库。
⒉面向对象的语言(Object Oriented)——支持静态和动态风格的代码继承和重用,是完全面向对象的,不支持面向过程(检查)。
⒊分布式的(Distributed)——Java技术包括一个支持http和ftp等基于TCP/IP协议的子库。
因此,应用程序可以凭借URL打开访问网络上的对象,其访问发送与访问本机文件系统几乎完全相同。
⒋解释性的(Interpreted)——Java解释器(运行系统)能够直接运行目标代码指令。
⒌健壮的(Robust)——Java致力于检查程序在编译和运行时的错误;类型检查帮助查出许多早期出现的错误;Java自己管理和操作内存,这就减少了内存出现错误的可能性;Java还实现了真数组,避免了覆盖数据的可能性。
注:所谓真数组就是,在程序设计语言中,数组元素在内存中是一个接着一个线性存放的,通过第一个元素就能访问随后的元素,这样的数组称之为“真数组”。
实现了真数组为Java 语言特点之一。
⒍安全的(Secure)——Java语言没有指针和释放内存等C++功能被删除,故避免了非负内存操作;另一方面,当java用来创建浏览器时,Java语言功能和一些浏览器本身提供的功能结合起来,使它更安全。
课程简介Java语言是美国SUN公司1995年推出的面向对象的程序设计语言,该语言充分考虑了互联网时代的特点,在设计上具有跨平台性、面向对象、安全等特性,因此一经推出就受到IT界的广泛重视并大量采用,同时也成为教育界进行程序设计教学的一门重要编程语言。
课程主要包括下列内容:■ Java语言的发展及相关技术的介绍,Java技术和平台在网络计算及电子商务中的应用介绍;■ Java语言的基础知识:Java语言的主要特点,设计思想,Java虚拟机,垃圾回收机制,安全性的保证机制;■ Jav a语言的基本语法规范,包括标识符、关键字、数据类型、表达式和流控制,程序基本结构;■ 面向对象技术的基本特点,Java语言的面向对象特性,类和对象的概念,封装性、继承性、多态性,Java语言的特殊属性;Java程序的例外处理机制和方法;■ Java语言的输入/输出处理机制和方法,常用的输入/输出方法,输入/输出处理的应用;■ Java语言的图形用户界面设计:AWT界面设计的基本方法,常用的组件类库,图形用户界面的事件处理模型和方法,JFC介绍,Swing图形界面设计;■ Ja va Applet程序设计,Applet程序的特点,运行机制,与浏览器的集成,安全机制的使用;■ 多线程程序设计,进程和线程的联系和区别,多线程程序设计的一般方法,线程的生命周期,线程状态的控制,多线程的互斥和同步;■ Java语言的网络编程技术和应用,Socket程序设计,Client/Server程序设计;■ Java的Servlet和JSP(Java Server Page)技术;■ JavaBeans和RMI。
学习目标通过本门课程的学习可以使学生掌握Java语言的基本语法和编程规范;尤其是掌握用Java语言进行网络编程的技巧;同时Java语言是一门面向对象的语言,通过学习可以掌握用面向对象进行编程的思想和实践,使学生成为一名合格的Java程序员。
线程(Thread)学习目标:⒈掌握如何创建线程。
⒉掌握线程的基本控制。
⒊掌握线程的同步。
⒋掌握线程的交互。
⒌掌握线程中的其他方法。
线程简介传统的单线程程序设计使程序在某一段时间内只能够处理一件事情,这样,造成了大量的CPU资源浪费,同时也降低了程序运行的效率。
例如,在访问网页时,我们通常并不是打开一个页面,而是同时打开很多网页;在聊天室中,我们希望能够与多个人同时聊天,而服务器还要能够处理不同的用户请求,在这些情况下都要使用多线程,而单线程程序无法同时完成多个任务。
多线程是这样一种机制,它允许在程序中并发执行多个任务,每个任务都称为一个线程,彼此间互相独立。
多个线程的执行是并发的,也就是说在逻辑上是“同时”的,而不管是否是物理上的“同时”。
当然如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户不会感觉到前后的差别。
多线程编程技术是Java语言的重要特点之一。
在程序设计过程中,一般是通过I/O输入数据,随之一步步进行计算,最后将计算结果通过I/O输出。
在这个过程中,机器将严格地顺序执行程序规定的动作,程序的执行结果与它的运行速度无关。
线程(thread)就是进程中的一个执行线索。
Java虚拟机允许进程中同时执行多个线程。
每个线程都有一个优先级。
具有较高优先级的线程先执行。
也就是说:⒈线程是操作系统分配 CPU 时间的基本实体。
每一个应用程序至少有一个线程,也可以拥有多个线程。
线程是程序中的代码流。
多个线程可以同时运行并能共享资源。
⒉线程与进程不同,每个进程都需要操作系统为其分配独立的地址空间,而同一进程中的各个线程是在同一块地址空间中工作。
⒊在 Java 程序中,一些动态效果(如动画的实现、动态的字幕等)常利用多线程技术来实现。
进程简介为了提高计算机系统中各种资源的使用效率,现代的计算机设计中普遍采用多道程序设计,也就是引入了进程(process)的概念。
进程是一种动态执行程序的实体,它由一个动作系列组成,每个动作执行某个数据集上的一段程序。
事件模型分层模型JDK1.0使用分层模型。
分层的事件模型基于容器,事件首先传送到组件然后再传播到容器层次。
组件不能自动处理的事件会继续传播到组件的容器,如下图所示。
在图中,Button对象位于Frame的Panel中,当鼠标单击Button对象时,首先向Button对象发送一个动作事件,如果Button没有处理这个事件,它将会被发送给Panel,如果在Panel 中仍未处理则继续发送给Frame。
这就是分层事件模型,它的优点是简便并且利用了面向对象编程环境的特性。
缺点是:⒈只有发生事件的组件或包含这个组件的容器才能处理这个事件。
⒉任何对于程序无关或者不重要的事件最终被抛弃之前都会遍历整个容器层次,相当数量的CPU周期都被浪费在无关的事件上了。
⒊为了处理事件,必须将接收事件的组件子类化或在基础容器中创建一个handleEvent()方法。
委托模型JDK1.1使用委托模型。
使用该模型,事件被发送给发起该事件的组件,同时组件将该事件传播到一个或者多个已经注册的监听器。
不同事件源上发生的事件种类是不同的,若希望事件源上引发的事件被程序处理,则需要将事件源注册给能够处理该事件类型的监听器。
如下图所示,监听器包含接收和处理该事件的事件处理器,它具有监听和处理某类事件的功能。
监听器可以是包容事件源的容器,也可以是另外的对象。
事件对象只向已注册的监听器报告事件源。
每个事件都有一个监听器接口,由该接口来决定类中能够接收该类型事件的方法。
实现这个接口的类可以被注册为一个监听器。
对于没有注册监听器的组件,来自这些组件的事件将不被传播。
事件用于描述程序、系统和程序使用者之间的各种活动。
这些事件由系统事先定义好,当用户在图形界面上单击控件或双击鼠标时就可能引发某个事件,而用户程序中需要编制相应的代码来对这些事件做出处理。
事件源图形用户界面上每个可能产生事件的组件称为事件源。
事件监听者Java系统中注册的用于接收特殊事件的类。
Java核心语法要编写一个Java应用程序类必须掌握Java的核心语法细节,Java 的核心语法分为三个部分,即类、变量和方法。
类:包括包、引入、类、变量、方法和注释;变量:变量定义、命名规则、赋值、作用范围:●数据类型:基本数据类型、对象数据类型、引用和数组;●运算符:算术运算符、赋值运算符、自增与自减运算符、关系运算符、逻辑运算符。
方法:方法的定义、类型、参数传递、递归和特殊方法main()。
控制与循环:if、switch、for、while、break、continue、label、return。
Java类结构如下:Java类的基本构成构成一个类的主要元素是,包、类、变量、方法;而构成类、变量和函数的细节则是实现Java类的语法核心。
例:类的基本结构。
package mypackgae //定义包import java.util.List; //引入类/***@author lty //注释*/public class MyClass{/***@变量说明//注释*/private String world=”World”; //定义变量和赋初值/***@函数说明//注释*/public void say() //方法(或函数){System.out.println(“Hello”+world+”!”); //函数体语句}/***@执行入口函数//注释*@param args*/public static void main(String args[]) //入口方法{//创建类实例MyClass inst=new MyClass();//调用函数//注释inst.say(); //语句}}其中入口函数是特殊方法。
package(包)Java用包来管理类命名空间,它提供了一种命名机制和可见性限制机制。
将功能相似的类都放到一个包中,但在同一个包内不能有重名类,不同包内可以有同名类,所以包解决了文件名与类名相同有可能发生冲突问题。
Java技术讲义学好java语言建议注意以下几点:⒈目前自己学习的目标和大方向,并锁定java语言。
⒉首先系统学习java语言的基础语法。
⒊了解设计模式,开发程序所编写的代码必须具有高度的可读性,这样编写的程序才具有调试和升级的价值,学习设计模式目的就是为了更好地把握项目的整体结构。
⒋不要死记语法,特别是Java语言,掌握基本的语法,并理解一些常用功能就可以。
⒌要开发一个可用程序,首先要读懂Java源代码,编写符合语法的标准程序代码,运行程序,分析程序,逐渐形成对Java程序设计的整体认识,用适合自己的思维方式思考问题,多编写代码来提高自己的编程思想。
要多与其他人沟通和交流技术问题,用以提高自己的技术和见识。
有目的的多读源代码、多编写源代码、多思考、多请教。
⒍遇到问题时,不要急躁,必须保持冷静。
只有保持清醒的头脑才能分析问题和解决问题。
在练习编程时要有意识地给自己多设置问题,解决问题后要认真总结和纪录。
在实际工作中遇到的问题,一时无法解决,要暂时休息一下,听一下自己喜欢的音乐,做一些使自己能够较快放松活动。
⒎要了解并掌握解决一些常见的编程问题。
在遇到问题时,首先要尝试自己解决问题,如果一时解决不了,应该真诚地请教他人,逐步养成举一反三的能力。
⒏要多阅读别人的代码,不但要看懂别人的代码,还用会分析代码编程者的编程思想和设计模式,并融为己用。
Java环境搭建下载JDK暂略。
配置环境变量暂略。
配置JDK常见错误⒈在变量文本框中必须在英文状态下输入和使用英文标点符号(如“;”和“%”)。
⒉输入变量名称JAVA_HOME必须和之前设置的JAVA_HOME变量统一。
⒊只能在Path变量中添加变量,而不能删除原有变量,负责会影响其他软件的运行。
说明:Path是系统变量,其功能类似于管道,可以连接变量中多个命令所在的文件夹路径,这样所有被路径的文件路径中的内容,在任何位置都可以直接使用。
编写一个Java程序暂略。
目录1.1Java语言程序设计课程教学辅导技术资料——第10章Java I/O 技术及应用(第1部分) (2)1.1.1Java IO技术基础 (2)1.1.2有关文件名及目录名操作的类 (4)1.1.3管道输入输出 (14)1.1Java语言程序设计课程教学辅导技术资料——第10章 Java I/O 技术及应用(第1部分)【教学目标】在本单元中希望您重点了解并掌握如下知识点:文件名及目录名的File类,本地文件读写,管道方式读写,随机文件读写,字符格式文件读写,标准数据类的数据读写,标准输入输出设备流等。
1.1.1Java IO技术基础1、引言(1)一个真正的应用系统绝对离不开数据,像ERP:处理生产、物流等数据信息。
CRM:分析客户数据,根据客户需求制定战略、政策。
科学计算软件:如神州5号软件,计算出各种数据保证火箭正常运行。
(2)对数据的读写,需要一些媒介数据库、文件,甚至内存等。
其中,又以文件因为占用资源少,存取方便且速度快得到了大量应用。
2、Java I/O方面的基础知识(1)流(Stream)它是通过缓冲机制将数据从生产者(如键盘、磁盘文件、内存或其他设备)传送到接受该数据的消费者(如屏幕、文件或者内存等)的这一过程的抽象。
(2)缓冲区(Buffer)流的两端都有数据缓冲区可以暂存数据。
这样接收端可以不必每时每刻都监视流是否有数据需要接收,数据来到之后放在缓冲区内,等需要时再去读取。
而发送端也不必每一个字节都调用发送方法,而是等集中了一定数量的数据后再一起发送,大大提高了效率。
(3)输入输出流的图示(4)为什么要采用流的机制(目的)为用户提供与设备无关的输入输出。
从而可以主要用以处理数据的流动(读写)、传输(网络)等等问题。
(5)IO实现的规则采用面向对象的文件读写方式来操作文件,即将所要读写的文件数据转化为相应的流类的对象,然后通过流对象操作其方法。
(6)Java I/O包在java.io包中包括有许多类,它们为用户提供许多有关文件的各个方面操作。
Object类Object类是所有Java类的祖先。
每个类都使用 Object 作为超类。
所有对象(包括数组)都实现这个类的方法。
在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。
可以使用类型为Object的变量指向任意类型的对象。
Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法。
Object类的变量只能用作各种值的通用持有者。
要对他们进行任何专门的操作,都需要知道它们的原始类型并进行类型转换。
例如:Object obj = new MyObject();MyObject x = (MyObject)obj;当创建一个类时,如果没有使用extends关键字继承指定的类,则编译器总是默认直接继承Object类,如果指定了继承其他类,那么也会间接继承Object类。
对自定义的类也继承于Object类。
由于所有类都是Object子类,所以在定义时,省略了extends Object关键字。
如下图。
Object类有11个方法,其中getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些方法为final类型。
而clone()、finalize()、equals()、toString()为可以重写方法,对equals()和toString是常用的方法。
Object的基本方法Object()默认构造方法clone()创建并返回此对象的一个副本。
equals(Object obj)指示某个其他对象是否与此对象“相等”。
finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
getClass()返回一个对象的运行时类。
hashCode()返回该对象的哈希码值。
notify()唤醒在此对象监视器上等待的单个线程。
notifyAll()唤醒在此对象监视器上等待的所有线程。
toString()返回该对象的字符串表示。
wait()导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
wait(long timeout, int nanos)导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
方法使用说明1、equals()方法:用于测试某个对象是否同另一个对象相等。
它在Object类中的实现是判断两个对象是否指向同一块内存区域。
这种测试用处不大,因为即使内容相同的对象,内存区域也是不同的。
如果想测试对象是否相等,就需要覆盖此方法,进行更有意义的比较。
例如:实例化该类并在main方法中运行。
class Employee{public boolean equals(Object otherObj){//快速测试是否是同一个对象if(this == otherObj) return true;//如果显式参数为null,必须返回falseif(otherObj == null) reutrn false;//如果类不匹配,就不可能相等if(getClass() != otherObj.getClass()) return false;//现在已经知道otherObj是个非空的Employee对象Employee other = (Employee)otherObj;//测试所有的字段是否相等return name.equals(otherName)&& salary == other.salary&& hireDay.equals(other.hireDay);}}Java语言规范要求equals方法具有下面的特点:自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
于任何非空引用值 x,x.equals(null) 都应返回 false。
从这里看出,上面的例子是Java规范的equals方法的标准实现,推荐用上面例子的写法实现类的equals方法equals()方法给该方法用于判断是否相同,大部分子类都重写了该方法,用于比较指定类型的对象,如String、Integer等都重写了该方法。
如果没有重写equals()方法,该方法将默认使用“==”运算符判断两个对象。
equals()方法的原始代码如下:练习1:自定义TempClass类,用于测试,在创建Testequals类,在该方法创建String类的两个实例对象s1s2,在创建TempClass类的两个对象v1和v2,分别输出s1、s2、v1、v2的equals()方法调用结果。
执行结果:上例中,自定义的类使用equals()方法进行比较时,返回的是false。
这是因为equals()方法默认实现的是“==”运算符对两个对象引用地址,而不是比较对象的内容。
因此,要比较两个对象的内容,需要在自定义的类中重写equasl()方法。
toString()方法该方法非功能的将一个对象转换为字符串形式,当一个对象与字符串的“+”连接时,也会调用该方法将对象转换为字符串,然后在和另一个字符串连接。
toString()返回一个String实例。
在实际应用中通常重写toString()方法,为对象通过一个特定的输出模式,当这个类转换为字符串或字符连接时将自动调用重写的toString()方法。
练习2:在自定义类中重写Object的toString()方法,并在main方法中输出该类的对象。
执行结果:在本例中重写了父类Object的toString()方法,定义一段输出字符串,当用户打印该类实例时,将自动调用toString()方法。
多态数组多态数组就是使用父类说明,而数组中的的元素都是子类的实例对象,它们有父类同名的方法,但是方法实现却不一样。
练习3:创建Quadragle四边类型的类,作为其他类的父类。
在创建Square正方形类、Rectangle()长方形类和Parallelogram平行四边形类,这些类都继承Quadrangel类,并重写draw()方法。
使用父类定义一个四边形的数组。
数组的元素分别是每个子类的实例对象,在foreach()循环中遍历数组,调用每个数组的元素的draw()方法。
⒈创建Quadrangle父类,为该类定义draw()方法。
创建Square()正方形类,并继承父类,同时重写draw()方法,实现自己的绘图能力。
⒊创建Rectagle类,继承父类,重写draw()方法,实现自己的绘图功能。
⒋创建Parallelogram类,继承父类,重写draw()方法,实现自己的绘图功能。
⒌创建主类Demo,在main方法中演示多态数组的定义和使用。
执行结果:说明:什么是多态:多态是指程序中同一操作,在不同环境中有不同的语义解释。
要理解多态,首先要理解类的继承、向上转型、方法的重载与重写等知识特点。
向上转型就是可以声明父类的引用变量但是赋值为子类的实例对象。
也就是,对象变量的声明与赋值可以不是一个类型。
例如,把子类对象赋值给父类的对象变量。
Quadrangle obj=new Square(); //声明父类对象,初始化为子类声明的变量obj是Quadrangle类型,而赋值时却是Square类型的实例变量。
通过使用父类类型的引用,可以定义多态数组或多态方法等。
练习4:创建一个多态数组,然后后调用数组所以元素的bellow()方法,让动物发出吼叫。
参数多态练习5:问题:主人养了3只爱喝酒的小老鼠,它们分别是白鼠、灰鼠和花鼠。
有一天主人买了两瓶好酒。
主人想让3只小老鼠试一试酒劲有多大。
可是这3只小老鼠酒后反应都不一样,通过下面实例阐述这些小老鼠喝酒以后分别是什么反应。
分别创建主人类、鼠类和3个试酒的鼠类,使用Java的多态性实现主人给3只老鼠喂酒的动作,并分别给出每只老鼠喝酒后的反应。
另外,3个试酒的鼠类都继承Mouse鼠类。
其UML类图如下。
⒈创建Mouse鼠类,并定义drink()饮酒方法。
⒉继承Mouse类,创建小白鼠WhiteMouse类,重写父类drink()方法,实现小白鼠酒后状态输出。
⒊继承Mouse类,创建小灰鼠WhiteMouse类,重写父类drink()方法,实现小灰鼠酒后状态输出。
⒋继承Mouse类,创建小花鼠WhiteMouse类,重写父类drink()方法,实现小花鼠酒后状态输出。
⒌创建主人类Master。
主人将用不同的老鼠试酒。
⒍创建Demo类该类是本例的主类,用于执行程序。
执行结果:从实例运行结果可以看出,feedinVino()方法传递的参数是多态的,不同的参数会有不同的表现。
实现多态实现多态可以通过参数实现多态,例如,定义一个print()方法,该方法定义Quadrangle类型的参数,但是在调用print()方法时可以传递子类对象的实参。
例如:说明:方法返回类型可以是多态的,例如,定义一个getQuadrangle()方法,方法的返回值可以是Quadrangle类,方法体中的return语句可以返回该类的任何增长率子类。
例如:类型7:创建一个Cat类,在Cat类中定义look方法,通过该方法的参数多态性实现输出不同老鼠看到猫的反应。
抽象类在面向对象的程序开发中,子类可以通过继承父类获得父类已经定义的一些方法,还可以在此基础上进行扩充和改造,添加新的属性和方法,或者重写从父类继承过来的方法。
例如,有一个用于描述动物的Animal父类,其中定义了getInfo 方法,用于获取动物的相关信息。
它有三个子类,分别是描述马的子类Horse,描述人的子类Person和描述鱼的子类Fish,如图下所示。
三个子类中都重写了getInfo方法,用于根据具体的动物类型获取相关信息。
在这种情况下,父类的getInfo方法实际上是没有必要确定实现细节。