《Java语言程序设计》实验报告
实验一: 2021年09月 日
学院 |
软件学院 |
专业班级 |
姓名 |
成绩 |
||||||
课程 名称 |
Java语言程序设计 |
实验项目 名 称 |
Java开发环境使用与面向对象编程 |
指导 教师 |
路强 |
|||||
教师评语 |
教师签名: 年 月 日 |
|||||||||
一、实验目的
二、实验原理 1.掌握安装 2. 学会配置环境 3. 掌握基本的编写Java的方法 三、使用硬件、软件环境 PC 计算机一台 处理器 Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz 2.59 GHz 机带 RAM 16.0 GB (15.8 GB 可用) 系统类型 64 位操作系统, 基于 x64 的处理器 安装Win10操作系统。另外,使用JCreator,JDK1.6.0等软件 四、实验过程、步骤及原始记录(算法、原程序、测试结果,分析等) 1.安装jdk,配置环境,在cmd中编译Java文件,打印hellow world 2.编写一个类A,它位于包a中,保存到A.java中,再编写一个类B,它位于包b中,保存到B.java中。在类B中实例化类A的一个对象。分别编译类A和类B。 A.java 1. package a; 2. 3. public class A { 4. 5. public A() { 6. } 7. } B.java 1. package b; 2. import a.A; 3. 4. public class B { 5. 6. public static void main(String[] args) { 7. A first = new A(); 8. } 9. 10. } 3. 分别编写两个类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,打印出他们之间的距离。
1. import java.math.*; 2. 3. class Point2D { 4. protected int x; 5. protected int y; 6. 7. public Point2D() { 8. } 9. 10. public Point2D(int x, int y) { 11. this.x = x; 12. this.y = y; 13. } 14. 15. public int getX() { 16. return x; 17. } 18. 19. public void setX(int x) { 20. this.x = x; 21. } 22. 23. public int getY() { 24. return y; 25. } 26. 27. public void setY(int y) { 28. this.y = y; 29. } 30. 31. public void offset(int a, int b) { 32. x += a; 33. y += b; 34. } 35. 36. } 37. 38. class Point3D extends Point2D { 39. private int z; 40. 41. Point3D(){ 42. } 43. 44. Point3D(int x, int y, int z) { 45. super(x, y); 46. this.z = z; 47. } 48. 49. public void setZ(int z) { 50. this.z = z; 51. } 52. 53. public int getZ() { 54. return z; 55. } 56. 57. Point3D(Point2D p, int z) { 58. super(p.getX(), p.getY()); 59. this.z = z; 60. } 61. 62. public void offset(int a, int b, int c) { 63. super.offset(a, b); 64. z = z + c; 65. } 66. } 67. 68. public class point { 69. public static void main(String[] args) { 70. Point2D p2d1 = new Point2D(0, 0); 71. Point2D p2d2 = new Point2D(1, 1); 72. double length2D = distance2D(p2d1, p2d2); 73. System.out.println("两点之间的距离是:" + length2D); 74. Point3D p3d1 = new Point3D(0, 0, 0); 75. Point3D p3d2 = new Point3D(1, 1, 1); 76. double length3D = distance3D(p3d1, p3d2); 77. System.out.println("三点之间的距离是:" + length3D); 78. } 79. 80. static double distance2D(Point2D p2d1, Point2D p2d2) { 81. double distance; 82. double x; 83. double y; 84. x = Math.pow((p2d1.getX() - p2d2.getX()), 2); 85. y = Math.pow((p2d1.getY() - p2d2.getY()), 2); 86. distance = Math.sqrt(y + x); 87. return distance; 88. } 89. 90. static double distance3D(Point3D p3d1, Point3D p3d2) { 91. double distance; 92. double x; 93. double y; 94. double z; 95. x = Math.pow((p3d1.getX() - p3d2.getX()), 2); 96. y = Math.pow((p3d1.getY() - p3d2.getY()), 2); 97. z = Math.pow((p3d1.getZ() - p3d2.getZ()), 2); 98. distance = Math.sqrt(y + x + z); 99. return distance; 100. 101. } 102. 103. }
1.什么是JVM,它的作用是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM高效稳定运行。不同JVM对于内存的划分方式和管理机制存在差异 内存管理: (1)对于Java运行时涉及到的存储区域主要包括程序计数器、Java虚拟机栈、本地方法栈、java堆、方法区以及直接内存等等。对于每个部分,都有其使用的条件。程序计数器主要是取下一条指令,在Java里面主要是取下一条指令的字节码文件;Java虚拟机栈主要是利用栈先进后出的特性存储局部变量表,动态链接等,主要包括堆内存和栈内存,对于程序员内存分析而言是特别重要的。本地方法栈与上边的栈基本作用差不多,只不过这里是为Java方法而服务。Java堆是内存管理中最大的一块,所有的线程共享这一块内容,同时该部分也是垃圾收集器的主要区域。 (2)虚拟机的垃圾回收机制是完善的,动态内存分配和回收是比较成熟的,在内存管理机制中,大部分都不需要我们考虑内存回收,只有Java堆和方法区需要我们考虑处理内存问题。一般的对于内存回收首先就是判断某一个部分是生存还是死亡,主要是通过下面二种算法: 其一是引用计数算法,本算法实现简单,判定的效率也是比较高的,很多的软件都使用了该算法,但是主流的Java并没有选择该算法,核心的问题是该算法难以处理对象之间相互调用的问题。 其二是称可达性分析算法,该算法核心思想是依靠判断对象是否存活来实现的,本算法是通过一系列的GC ROOTS的对象作为起始点,采用搜索的算法遍历引用链,如果搜索过程中没有发现该节点,则认为该节点是不可达的,即可回收的,在Java里面,一般可以使用该算法处理问题。 碎片回收: Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot Java环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。 2如何理解PATH和CLASSPATH,,如何设置它们。 classpath环境变量告诉类装载器到哪里去寻找第三方提供的类和用户定义的类。JVM和其他JDK工具通过依次搜索平台库,扩展库,和类路径来查找类。 path环境变量指定了JDK命令搜索路径,设置path的作用是让操作系统可以找到JDK命令。path环境变量原来Windows里面就有,只需修改一下,使他指向JDK的bin目录,这样在控制台下面编译、执行程序时就不需要再键入一大串路径了。设置方法是保留原来的path的内容,并在其后加上%JAVA_HOME%\bin (注:%%引起来的意思是引用上一步设定好的环境变量JAVA_HOME,写成D:\JDK_1.4.2也是可以的。) 设置Classpath Java执行环境本身就是一个平台,执行这个平台上的程序是已编译完成 的Java程序(Java程序编译完成之后,会以.class文件存在)。如果将Java执行环境比喻为操作系统,如果设置Path变量是为了让操作系统找到指定的工具程序(以Windows来说就是找到了.exe文件),则设置Classpath的目的就是让Java执行环境找到指定的Java程序(也就是.class文件)。 有几个方法可以设置Classpath,最简单的方法是在系统变量中新增Classpath环境变量。在“系统变量”下单击“新建”按钮,在“变量名”文本框中输入Classpath,在“变量值”文本框中输入Java类文件的位置。例如可以输入.;E:\Java9\lib\tools.jar;E:\Java9\lib\rt.jar(jar文件是zip压缩格式,其中包括.class文件和jar中的Classpath设置),每一路径中间必须以“;”作为分隔。第一个用“.;”作为分隔。 总而言之,设置Classpath的目的在于告诉Java执行环境,在哪些目录下可以找到你所要执行的Java程序。一个分辨Path与Classpath的方式就是:“对于Windows”操作系统来说,path是让操作系统可以找到.exe执行程序的存在,而对于Java执行环境来说,Classpath就是让JVM可以找到.class执行程序 的存在“ 设置Path 必须告诉操作系统,应该到哪些目录下尝试找到你所想使用的工具程序。有几个方法可以进行这项设置,最简便的方法就是设置系统变量中的Path的环境变量。在"我的电脑"图标上选择并单击右键选择“属性”后切换到“高级”页面,并单击下方的“环境变量”按钮,在“环境变量”对话框中编辑Path变量。在Path变量的“编辑系统变量”对话框中,在“变量值”文本框的最前方输入JDK bin目录的路径,然后紧跟着一个分号,以作为分隔,单击“确定”按钮即可完成设置。(在Win10系统中有一点点不同,此时是将JDK bin的目录的路径像一个条目一样加在已有路径的下方,路径可以上下移动) 之所以要将JDK的路径设置放置在Path变量设置的最前方,是因为操作系统在搜索Path路径设置时,会从最前方开始读取,如果在路径下找到指定程序,就会直接执行。当你的系统中安装在两个以上的JDK时,在Path路径中的设置顺序,将决定执行哪个JDK下的工具程序。 设置Path变量之后,要重新打开一个命令模式才能重新读入Path变量内容,接着如果执行javac程序,应该可以看到与之前不同的画面。(这个是成功的画面) 如果Path设置是寻找JDK安装目录下的bin目录,则操作系统会搜索JDK安装目录下的工具程序。这样当执行java程序时,就会使用JDK附带的JRE,而不是公用的JRE。这两个JRE的安装路径并不相同。
4.什么是面向对象的多态性,在程序中如何体现的? 理解多态:可以理解为一个事物的多种形态 何为多态性: 对象的多态性: 父类的引用指向子类的对象(或 子类的对象赋给父类的引用) 多态的使用,虚拟方法调用 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期我们实际执行的是子类重写父类的方法 总结: 编译看左边,运行看右边 多态性的使用前提 1.类的继承关系 2.方法重写 五、实验结论、分析、思考题与心得体会 通过本次实验,我有以下几方面的收获、认识和体会: 1.学会了在Java环境下编写程序及运行程序的方法; 2.加深了对继承和多态的理解 3.学到了关于Java虚拟机的知识,初步理解了Java内存管理 |