logo资料库

合工大Java实验报告.doc

第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
资料共34页,剩余部分请下载后查看
编写程序完成以下功能:
1.设计一个基于GUI的客户-服务器的通信应用程序,如图1,图2所示。
2.图1为Socket通信服务器端界面,点击该界面中的【Start】按钮,启动服务器监听服务(在图1
3.当图1所示的服务器端和图2所示的客户机端建立Socket连接后,编程实现服务端、客户端之间的“单
《Java 技术》实验报告 实验一:Java 开发环境使用和面向对象编程 2018 年 9 月 26 日 学院 计算机与信息学院 专业班级 通信工程 17-2 班 姓名 刘俊贤 成绩 课程 名称 教 师 评 语 Java 技术 实验项目 称 名 实验一 Java 开发环境 使用和面向对象编程 指导 教师 余烨 教师签名: 年 月 日 一、 实验目的 1.掌握 JDK 的安装步骤。 2.理解环境变量 PATH, CLASSPATH 的作用,以及它们的设置方法(Win98 和 Win2000/XP、Win7、 Win8 下的设置方法有所区别)。 3.熟悉记事本(或 JCreator)编辑环境,编写简单的 Application 程序,并编译和解释执 行。 4.记录编译和执行 Java 程序当中的系统错误信息提示,并给出解决办法。 5.复习、理解 OOP 的三大特征——封装、继承和多态。 6.学会使用 Java 编写简单的类。理解类的属性和方法。 7.掌握关键字 private, protected, public 的作用,掌握静态类,内部类的概念。 8.掌握多态的概念。 二、实验原理 1.掌握安装 Jdk10.0.2 的过程。 2. 设置环境变量 PATH, CLASSPATH, 使得 Java 程序能正确编译和执行。 3. 在记事本(或 JCreator)环境下编写一个 HelloWorld.java 程序,在 DOS 提示符下编译 并执行这个程序。 4. 编写一个类 A,它位于包 a 中,保存到 A.java 中,再编写一个类 B,它位于包 b 中,保 存到 B.java 中。在类 B 中实例化类 A 的一个对象。分别编译类 A 和类 B。 5. 分别编写两个类 Point2D,Point3D 来表示二维空间和三维空间的点,使之满足下列要 求: 1) Point2D 有两个整型成员变量 x, y (分别为二维空间的 X,Y 方向坐标),Point2D 的构 造方法要实现对其成员变量 x, y 的初始化。 2) Point2D 有一个 void 型成员方法 offset(int a, int b),它可以实现 Point2D 的平 移。 3) Point3D 是 Point2D 的直接子类,它有有三个整型成员变量 x,y,z (分别为三维空间 的 X,Y,Z 方 向 坐标 ), Point3D 有 两 个构 造 方 法: Point3D(int x, int y, int z)和 Point3D(Point2D p, int z),两者均可实现对 Point3D 的成员变量 x, y, z 的初始化。 4) Point3D 有一个 void 型成员方法 offset(int a, int b, int c),该方法可以实现 Point3D 的平移。 5) 在 Point3D 中的主函数 main()中实例化两个 Point2D 的对象 p2d1,p2d2,打印出它
们之间的距离,再实例化两个 Point3D 的对象 p3d1,p3d2,打印出他们之间的距离。 三、使用硬件、软件环境 PC 计算机一台,配置为 CPU 为 2.8G,内存为 4G,硬盘为 128G,安装 Windows10 操作系统。 另外,使用 JCreator,Eclipse,JDK10.0.2 等软件 四、 实验过程、步骤及原始记录(算法、关键代码、测试结果、分析等) 1.安装 Jdk10.0.2 集成环境,安装成功后,配置 path,classpath 路径,让用户在任何目录下均 可用到 Java 的系统资源。 ①先配置%JAVA_HOME%环境变量,路径为 jdk 的目录; ②配置 path 环境变量,路径为%JAVA_HOME%\bin; ③再配置 classpath 环境变量,路径为%JAVA_HOME%\jre\lib; 2.在记事本编写 helloworld 程序,并在 DOS 命令行下编译运行。 ①在 JCreator 中写出如下代码,并保存为 HelloWorld.java: public class HelloWorld { } public static void main(String[] args) { } System.out.println("HelloWorld!"); ②在命令行中进入到该文件路径,并输入 javac HelloWorld.java 完成编译,再输入 java HelloWorld 完成运行。 3.用记事本编写包 a 包 b 的程序,并用 DOS 命令行运行。 ⑴思路分析: 首先新建一个 ClassA.java,放入包 package1 中,在 ClassA.java 中声明 A 类的方法 methodA()。再创建一个 ClassB.java,放入包 package2 中,在 B 类中导入 A 类的包和方法, 即:import package1.ClassA;在 B 类中声明 B 类的方法 methodB(),在 B 类的方法中调用 A 类的方法最后在 B 类中新建一个对象,调用 B 类的方法并输出。 ⑵执行过程: ①将两个记事本,改名为 ClassA.java 和 ClassB.java,并写出如下程序: ClassA.java 文件的源程序: package package1; public class ClassA { public void methodA() { System.out.println("I am methodA() in ClassA."); } } ClassB.java 文件中的源程序: package package2; import package1.ClassA; public class ClassB { public static void main(String[] args) {
ClassB b = new ClassB(); b.methodB(); } public void methodB(){ new ClassA().methodA(); System.out.println("I am methodB() in ClassB."); } } ②先在 DOS 命令行中编译 ClassA.java 文件,在命令行中输入 javac ClassA.java –d . 再编译 ClassB.java 文件,在命令行中输入 javac ClassB.java -d . ③在命令行中输入 java package2.ClassB 即可完成。 ⑶运行结果: 4. 利用类的继承写一个 point2D 类,其子类是 point3D。子类 Point3D 的构造函数调用了父 类的构造函数;计算平面两点的距离函数和计算空间两点的距离函数写在父类 Point2D 中,并且他们是静态方法,在子类继承后,在其主方法(主方法是静态的)中可以直接 调用(或者通过类名调用);另外平移函数可以对点进行平移。 ⑴代码分析: ①首先创建 Point2D 类,声明变量 x,y 的有参构造方法,便于继承。并声明方法 offset(int a,int b)用于实现点(x,y)的平移: public class Point2D { protected int x,y;//保护类成员主要用于继承 Point2D(int x,int y){//有参构造方法 this.x = x; this.y = y; } public int getX(){//方便在其他类中使用该类中的私有成员变量 return x; } public int getY() {
return y; } public void offset(int a,int b) {//偏移后的横纵坐标值 this.x += a; this.y += b; } public void show() {//show 横纵坐标 System.out.println("平移后坐标为:["+x+","+y+"]"); } } ②创建 Point3D 类,继承父类 Point2D。分别用 super(x,y)和 super(p.getX(),p.getY())调用父类 的有两个参数的构造方法并声明新的有参构造方法 z。用 super.offset(a, b)调用父类的偏移方 法。具体代码如下: class Point3D extends Point2D {//类的继承 private int z;//第三点 z Point3D(int x,int y,int z){//有参构造方法三点分别初始化 super(x,y);//调用父类的有两个参数的构造方法 this.z = z; } public int getZ() { return z; } Point3D(Point2D p,int z){//有参构造方法,以对象作形参.用 p 对象调用 get 方法 以初始化继承的私有成员变量 super(p.getX(),p.getY()); this.z = z; } public void offset(int a,int b,int c) {//3D 的偏移量 super.offset(a, b);//方法同上,调用父类的偏移方法 z += c; } public void show() {//show3D 坐标值 System.out.println("平移后坐标为:["+x+","+y+","+z+"]"); } } ③创建 Test 类,分别实例化 Point2D 的两个对象 p2d1,p2d2 和 Point3D 的两个对象 p3d1, p3d2,打印出他们之间的距离。 class Test{ public static void main(String[] args) { Point2D p2d1 = new Point2D(0,0); Point2D p2d2 = new Point2D(1,1);//初始化2D两点p2d1,p2d2
double retDistance2D=distance2D(p2d1,p2d2); System.out.println("二维点p2d1,p2d2的距离为"+retDistance2D);//输出2D两点之间 Point3D p3d1 = new Point3D(0,0,0); Point3D p3d2 = new Point3D(1,1,1); double retDistance3D = distance3D(p3d1,p3d2); System.out.println("三维点p3d1,p3d2,p3d3的距离为"+retDistance3D);//同上面的 距离 2D } public static double distance2D(Point2D p2d1,Point2D p2d2) {//对象作形参 double distance; double distanceX; double distanceY; distanceX = Math.pow((p2d1.getX()-p2d2.getX()),2); distanceY = Math.pow((p2d1.getY()-p2d2.getY()),2); distance = Math.sqrt(distanceX + distanceY);//X+Y再开方 return distance; } public static double distance3D(Point3D p3d1,Point3D p3d2) {//同2D方法一致 double distance; double distanceX; double distanceY; double distanceZ; distanceX = Math.pow((p3d1.getX()-p3d2.getX()),2); distanceY = Math.pow((p3d1.getY()-p3d2.getY()),2); distanceZ = Math.pow((p3d1.getZ()-p3d2.getZ()),2); distance = Math.sqrt(distanceX + distanceY + distanceZ); return distance; } } ⑵运行结果: 五、实验结论、分析、思考与心得体会 通过本次实验,我有以下几方面的收获、认识和体会: 1、学会了在记事本和命令行,JCreator,等环境下编写程序及运行程序的方法; 2、学会了如何安装JDK,以及如何配置%JAVA_HOME%,path,classpath等环境变量; 3、加深了Java中相关语法的认识: ①文件名必须与public类的类名相同,并且一个文件中只允许有一个public类。 ②Java对大小写敏感,如String 中的S就严格区分大小写;对中文标点符号和英文标点符号 敏感,java只能识别英文标点符号。 ③在用记事本编写package1包package2的程序,并用DOS命令行运行时。要将两个类分别放
在两个文件中,要先编译ClassA.java再编译ClassB.java,在编译时一定要在命令行中输入 javac ClassA.java –d .和javac ClassB.java –d . 才能自动打包;两个文件都编译完成以后, 在命令行的父目录中输入java package2.ClassB 来执行,输入java package2.ClassB.java 。 4、学会了类的继承、封装、多态的基本应用,学会了两个方法sqrt()和pow()在程序中的运 用。 5、加深了Java中相关语法的认识: ①子类继承父类的非私有成员,但是不能继承构造方法,必须用super()来调用父类的构 造方法。 ②构造方法可以通过形参的个数、类型、排列不同来重载。 ③Math类属于java.lang包,并且pow()和sqrt()都是static静态方法,可以直接过Math.pow() 和Math.sqrt()来调用。 ④Static静态方法只能直接调用静态成员,不能直接调用非静态成员。 思考题: 1、什么是JVM,它的作用是什么? JVM就是java虚拟机的英文简写,java虚拟机就是为任何的平台提供一个编译java程序的接 口。就是将编译的java程序翻译,以供不同的平台去识别。 2、如何理解PATH和CLASSPATH,,如何设置它们。 PATH和CLASSPATH分别是Java JDK和JRE的路径。设置是在计算机属性中的高级系统设置 的环境变量,配置方法如下: 先配置%JAVA_HOME%环境变量,路径为jdk的目录; 配置path环境变量,路径为%JAVA_HOME%\bin; 再配置classpath环境变量,路径为%JAVA_HOME%\jre\lib; 3、创建子类对象的各步骤是什么? ①初始化父类 static 成员; ②初始化子类 static 成员; ③初始化父类非 static 成员; ④初始化子类非 static 成员; ⑤调用父类 构造器; ⑥调用子类 构造器。 什么是面向对象的多态性,在程序中如何体现的? 所谓多态:就是父类的引用指向new 子类();多态的前提:必须要有extends 或者implements。 多态主要是体现在接口和重载,接口能够让一个类有多种不同的实现方式,便于代码的重 构。
《Java 技术》实验报告 实验二:基于 GUI 的网络通信程序设计 2018 年 10 月 13 日 学院 计算机与信息学院 专业班级 通信工程 17-2 班 姓名 刘俊贤 成绩 课程 名称 教 师 评 语 Java 技术 实验项目 称 名 基于 GUI 的网络通信程 序设计 指导 教师 教师签名: 年 月 日 一、实验目的 1.掌握 Java 中 GUI 程序的编写,包括事件监听机制。 2.掌握 Java 的网络通信编程,ServerSocket,Socket 类的使用。 3.掌握 Java 中多线程的编程,Thread 类,Runnable 接口的使用。 4.掌握用面向对象的方法分析和解决复杂问题。 二、实验原理 编写程序完成以下功能: 1.设计一个基于 GUI 的客户-服务器的通信应用程序,如图 1,图 2 所示。 图 1 Socket 通信服务器端界面
图 2 Socket 通信客户端界面 2.图 1 为 Socket 通信服务器端界面,点击该界面中的【Start】按钮,启动服务器监听服 务(在图 1 界面中间的多行文本区域显示“Server starting…”字样)。图 2 为 Socket 通 信客户端界面,点击该界面中的【Connect】按钮与服务器建立链接,并在图 2 所示界面中 间的多行文本区域显示“Connect to server…”字样,当服务器端监听到客户端的连接后, 在图 1 界面中间的多行文本区域追加一行“Client connected…”字样,并与客户端建立 Socket 连接。 3.当图 1 所示的服务器端和图 2 所示的客户机端建立 Socket 连接后,编程实现服务端、客 户端之间的“单向通信”:在客户端的输入界面发送消息,在服务端接收该消息,并将接收 到对方的数据追加显示在多行文本框中。 三、使用硬件、软件环境 PC 计算机一台,配置为 CPU 为 2.8G,内存为 4G,硬盘为 128G,安装 Windows10 操作系统。 另外,使用 JDK10.0.2, Eclipse 等软件。 四、实验过程、步骤及原始记录(算法、原程序、测试结果,分析等) 1、实验思路分析: 分别编写两个类:Client.java 和 Server.java;其中 Client.java 实现了客户端的代码, Server.java 实现了服务器端的代码。两者结构十分相似,都是先写一个主类,再写另一个 实现类,主类通过创建实现类的对象来调用其构造方法来实现功能。实现类中写了很多方 法,也写了很多内部类,方法层层调用。实现类在构造方法中写了调用了实现 GUI 的函数, 也为按钮注册了监听器。在服务器中创建 ServerSocket 对象来接受客户端的连接请求,并 指定端口号,客户端通过 Socket 对象来向服务器的 ip 和端口发送连接请求。服务器在接 到连接请求后,服务器会创建一个新的 Socket 对象与客户端的 Socket 对象连接。连接成 功后通过 IO 流来通信,服务器的输入流是客户端的输出流,服务器的输出流时客户端的输 入流。
分享到:
收藏