`

实验 3 面向对象编程练习

阅读更多
一、实验目的
    通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想,了解类的封装方法,以及 如何创建类和对象,了解成员变量和成员方法的特性,掌握 OOP 方式进行程序设计的方法,了解类的继承性和多态性的作用。
二、实验要求
1. 编写一个体现面向对象思想的程序。
2. 编写一个创建对象和使用对象的方法的程序。
3. 编写一个显示当前日期和时间的程序。
4. 编写不同成员变量修饰方法的程序。
5. 编写不同成员方法修饰方法的程序。
6. 编写体现类的继承性(成员变量、成员方法、成员变量隐藏)的程序。
7. 编写体现类的多态性(成员方法重载、构造方法重载)的程序。
三、实验内容
(一)创建 Applet 应用小程序
    1.创建一个 Applet 应用程序 KY3_1.java 文件。
    (1)程序功能:建立一个 Applet 小程序,使其可以进行简单的加法运算。该程序要包含类、接口、属性、方法、事件等面向对象的基本元素。
    (2)程序源代码如下。
        import java.awt.*;
        import java.awt.event.*;
        import java.applet.Applet;
        public class KY3_1 extends Applet implements ActionListener {
          Label label1=new Label("+");
          Label label2=new Label("=");
         TextField field1=new TextField(6);
         TextField field2=new TextField(6);
         TextField field3=new TextField(6);
         Button button1=new Button("相加");
         public void init() { // 初始化
           add(field1);
           add(label1);
           add(field2);
           add(label2);
           add(field3);
           add(button1);
           button1.addActionListener(this);
         }
         public void actionPerformed(ActionEvent e) { // 处理按钮事件
           int x=Integer.parseInt(field1.getText())+Integer.parseInt(field2.getText());
           field3.setText(Integer.toString(x)); // 数值转换为字符串
           }
         }
  2. 编写一个浏览 Applet 应用程序的页面文件 KY3_1.HTML,源代码如。
    <html>
    <applet code="KY3_1.class" height=200  width=400>
    </applet>
    </html>
  3. 将 KY3_1.java 源程序编译为 KY3_1.class 文件
  4. 使用浏览器或使用小程序查看器浏览 KY3_1.HTML 文件(即在命令提示符窗口输入:
appletviewer KY3_1.HTML),运行。
(二)创建对象并使用对象
  1.编写 Applet 程序
• 程序功能:这个 Applet 程序要在页面上输出两个矩形,并伴有文字输出。
• KY3_2.java 程序的源代码如下。
     import java.awt.*;
     import java.applet.Applet;
     public class KY3_2 extends Applet {
        MyBox b1=new MyBox();//创建对象 b1
        MyBox b2=new MyBox(170,20,60,60); //创建对象 b2
        public void paint(Graphics g) {
          b1.setPosition(20,20);
          b1.setSize(60,60);
          b1.draw(g);
          g.drawString("矩形 1 的 X 位置: "+b1.getX(), 20, 100);
          g.drawString("矩形 1 的 Y 位置: "+b1.getY(), 20, 120);
        b2.draw(g);
        g.drawString("矩形 2 的 X 位置: "+b2.getX(), b2.getX(), b2.getY()+80);
        g.drawString("矩形 2 的 Y 位置: "+b2.getY(), b2.getX(), b2.getY()+100);
      }
    }
    class MyBox {
      private int x, y, width, height;
      MyBox() {
        x=0;
        y=0;
        width=0;
        height=0;
      }
      MyBox(int xPos, int yPos, int w, int h) {
        x=xPos;
        y=yPos;
        width=w;
        height=h;
      }
      public void setPosition (int xPos, int yPos) {
        x=xPos;
        y=yPos;
      }
      public void setSize (int w, int h) {
        width=w;
        height=h;
      }
      public int getX() {
        return x;
       }
       public int getY() {
         return y;
       }
       public void draw(Graphics g) {
         g.drawRect(x, y, width, height);
       }
    }
2.编写一个浏览 Applet 应用程序的页面文件 KY3_2.HTML
  <html>
  <applet code=" KY3_2.class" height=200  width=400>
  </applet>
  </html>
3. 将 KY3_2.java 源程序编译为 KY3_2.class 文件
4. 使用浏览器或使用小程序查看器浏览KY3_2.HTML文件(即在命令提示符下输入:appletviewer
    KY3_2.HTML),运行.
思考:程序的结构。类与对象的关系。对象创建、使用、销毁的过程。
(三)编写显示当前日期和时间的程序
1. 编写Applet 类文件KY3_3.java
• 程序功能:该程序通过使用一个自定义类Time,实现显示当前日期和时间的功能
• KY3_3.java 程序源代码如下。
import java.awt.Graphics;
import java.applet.Applet;
import java.util.Calendar;
class Time {
private Calendar t;
private int y, m, d, hh, mm, ss;
Time (){
t=Calendar.getInstance();
y=t.get(t.YEAR);
m=t.get(t.MONTH)+1;
d=t.get(t.DATE);
hh=t.get(t.HOUR_OF_DAY);
mm=t.get(t.MINUTE);
ss=t.get(t.SECOND);
}
public String getDate() {
return y+" 年"+m+"月"+d+"日";
}
public String getTime() {
String s=hh+" 时"+mm+"分"+ss+"秒";
return s;
}
}
public class KY3_3 extends Applet {
Time t=new Time();
public void paint(Graphics g) {
g.drawString("当前日期:"+t.getDate(),50,40);
g.drawString("当前时间:"+t.getTime(),50,80);
}
}
2. 编写浏览KY3_3 类的页面文件KY3_3.html
<html>
<applet codebase=e:/java/程序 code=KY3_3.class width=300 height=120>
</applet >
</html>
3. 在浏览器中浏览程序运行结果。
(四)使用修饰符
有时需要公开一些变量和方法,有时需要禁止其他对象使用变量和方法,这时可以使用修饰符来实现这个目的。常用的修饰符如下。Public,private,protected,package,static,final,transient,volatile
1. 程序功能:通过两个类StaticDemo、KY3_4 说明静态变量/方法与实例变量/方法的区别。
2. 编写类文件KY3_4.java,程序源代码如下。
class StaticDemo {
static int x;
int y;
public static int getX() {
return x;
}
public static void setX(int newX) {
x = newX;
}
public int getY() {
return y;
}
public void setY(int newY) {
y = newY;
}
}
public class KY3_4 {
public static void main(String[] args) {
System.out.println("静态变量x="+StaticDemo.getX());
System.out.println("实例变量y="+StaticDemo.getY()); // 非法,编译时将出错
StaticDemo a= new StaticDemo();
StaticDemo b= new StaticDemo();
a.setX(1);
a.setY(2);
b.setX(3);
b.setY(4);
System.out.println("静态变量a.x="+a.getX());
System.out.println("实例变量a.y="+a.getY());
System.out.println("静态变量b.x="+b.getX());
System.out.println("实例变量b.y="+b.getY());
}
}
3. 对上面的源程序进行编译,排错并运行
(五)方法中参数传递的练习
1. 编写一个传值调用的程序文件KY3_5.java。
• 程序功能:程序首先给整型变量x 和y 赋一个初值10,然后使用传值调用方式调用方法ff1对x 和y 做乘方及输出x 和y 的乘方值,最后再输出x 和y 的乘方值。
• 程序源代码如下。
class KY3_5 {
public static void main(String[] args) {
int x=10, y=10;
ff1(x, y);
System.out.println("x="+x+", y="+y);
}
static void ff1(int passX, int passY) {
passX=passX*passX;
passY=passY*passY;
System.out.println("passX="+passX+", passY="+passY);
}
}
• 编译KY3_5.java
• 分析其运行结果
2. 编写一个调用对象方法的程序文件KY3_6.java。
• 程序功能:通过调用对象的方法在方法调用后修改了成员变量的值。
• KY3_6.java 程序源代码如下。
class KY3_6 {
public static void main(String[] args) {
Power p=new Power();
p.ff2(10,10);
System.out.println("方法调用后 x="+p.x+", y="+p.y);
}
}
class Power{
int x=10, y=10;
void ff2(int passX, int passY) {
System.out.println("初始时 x="+x+", y="+y);
x=passX*passX;
y=passY*passY;
System.out.println("方法调用中 x="+x+", y="+y);
}
}
• 编译KY3_6.java

以上两个实验例子仅仅是为了说明Java 编程中参数传递时要注意的问题,在实际编程中是不可取的,因为完全可以采用其它更好的方法来实现参数的传递。例如,前面还使用过传递对象的方式。
思考:方法的参数传递有哪些方式?区别时什么?
(六)类的继承性练习
    1. 进一步理解继承的含义
    新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。新类 还可添加新的变量和方法。这种现象就称为类的继承。
    当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。
Java 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。
    2. 创建公共类 KY3_7_P
    (1)编写程序文件 KY3_7_P.java,源代码如下。
        public class KY3_7_P
        {
            protected String xm;                     //具有保护修饰符的成员变量
            protected int xh;
            void setdata(String m,int h)        //设置数据的方法
            {
                xm =m;
                xh = h;
            }
            public void print()      //输出数据的方法
            {
                System.out.println(xm+", "+xh);
            }
        }
    (2)编译 KY3_7_P.java,产生类文件 KY3_7_P.class。
    3.创建继承的类
    (1)程序功能:通过 KY3_7_P 类产生子类 KY3_8,其不仅具有父类的成员变量 xm(姓名)、xh(学号),还定义了新成员变量 xy(学院)、xi(系)。在程序中调用了父类的 print 方法,同时可以看出子类也具有该方法。
(2)编写 KY3_8.java 程序,源代码如下。
    class KY3_8 extends KY3_7_P
    {
        protected String xy;
        protected String xi;
        public static void main(String args[])
        {
            KY3_7_P p1 = new KY3_7_P();
            p1.setdata("帅零",12321) ;
            p1.print();
            KY3_8 s1 = new KY3_8() ;
            s1.setdata("郭丽娜",12345); //调用父类的成员方法
            s1.xy="经济管理学院";      //访问本类的成员变量
            s1.xi="信息管理系";     //访问本类的成员变量
            s1.print();
         System.out.print(s1.xm+", "+s1.xy+", "+s1.xi);
        }
    }
    (3)编译并运行程序
注意:公共类 KY3_7_P 与 KY3_8 类要在同一文件夹(路径)内。   
(七)类的多态性练习
1. 理解类的多态性
类的继承发生在多个类之间,而类的多态只发生在同一个类上。在一个类中,可以定义多个同名的方法,只要确定它们的参数个数和类型不同。这种现象称为类的多态。
多态使程序简洁,为程序员带来很大便利。在OOP 中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。
类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。
2. 方法的重载
方法的重载是指对同名方法的不同使用方式。
• 程序功能:对不同的数进行排序输出。在IntSort 类中定义3 个同名的方法sort,在
• 编写KY3_9.java 文件,源代码如下。
import java.awt.Graphics;
import java.applet.Applet;
class IntSort {
public String sort(int a, int b) {
if (a>b)
return a+" "+b;
else
return b+" "+a;
}
public String sort(int a, int b, int c) {
int swap;
if (a<b) {
swap=a;
a=b;
b=swap;
}
if (a<c) {
swap=a;
a=c;
c=swap;
}
54
if (b<c) {
swap=b;
b=c;
c=swap;
}
return a+" "+b+" "+c;
}
public String sort(int arr[]) {
String s=" ";
int swap;
for (int i=0; i<arr.length; i++)
for (int j=0; j<arr.length-1; j++)
if (arr[j]>arr[j+1]) {
swap=arr[j];
arr[j]=arr[j+1];
arr[j+1]=swap;
}
for (int i=0; i<arr.length; i++)
s=s+arr[i]+" ";
return s;
}
}
public class KY3_11 extends Applet {
IntSort s=new IntSort();
public void paint(Graphics g) {
int a=30, b=12, c=40;
int arr[]={34,8,12,67,44,98,52,23,16,16};
g.drawString("两个数的排序结果:"+s.sort(a,b),30,30);
g.drawString("三个数的排序结果:"+s.sort(a,b,c),30,60);
g.drawString("数组的排序结果:"+s.sort(arr),30,90);
}
}
• 编译并运行程序
• 三个同名方法
public String sort (int a, int b)
public String sort (int a, int b, int c)
public String sort (int arr[])
• 编写KY3_10 类文件的页面文件KY3_11.html
<html>
<applet codebase=e:/java/程序 code=KY3_11.class width=420 height=380>
</applet >
</html>

3. 构造方法的重载
构造方法的名称和类同名,没有返回类型。尽管构造方法看起来和一般的成员方法没有差别,但它不是方法,也不是类的成员。因此,构造方法不能直接调用,只能由new 操作符调用。
构造方法对于类是十分重要的,对象的初始化任务要靠构造方法来完成。重载构造方法的目的是提供多种初始化对象的能力,使程序员可以根据实际需要选用合适的构造方法来初始化对象。
• 编写构造方法RunDemo 的重载程序文件KY3_11,源代码如下。
class RunDemo {
private String userName, password;
56
RunDemo() {
System.out.println("全部为空!");
}
RunDemo(String name) {
userName=name;
}
RunDemo(String name, String pwd) {
this(name);
password=pwd;
check();
}
void check() {
String s=null;
if (userName!=null)
s="用户名:"+userName;
else
s="用户名不能为空!";
if (password!="12345678")
s=s+" 口令无效!";
else
s=s+" 口令:********";
System.out.println(s);
}
}
public class KY3_12 {
public static void main(String[] args) {
new RunDemo();
new RunDemo("刘新宇");
new RunDemo(null,"邵丽萍");
new RunDemo("张驰","12345678");
}
}
• 编译并运行程序
• 三个构造方法,其中第一个无参构造方法RunDemo() 的实际作用是对成员变量赋缺省初值,由于userName和password都是String 类,所以它们的缺省初值为null。第二个构造方法RunDemo(String) 只有一个参数,用来对成员变量userName 赋初值。第三个构造方法RunDemo(String, String) 有两个参数,并有更多的内容,首先调用this(name),其实际作用就是调用当前类的构造方法RunDemo(String name);然后对成员变量password 赋值;最后调用check 方法来检查userName 和password,类似于一般程序的口令验证。重载构造方法的执行由对象根据实际参数的个数、类型和顺序确定。
四、思考题
1. 说明使用变量之前是不是都要先声明变量。说明使用变量之前是不是都要先赋值,为什么?
2. 说明什么是构造方法。
3. 说明程序中有多个类时如何确定源程序文件的名称。
4. 说明类的继承和多态有什么作用,在使用上应该注意什么问题。
分享到:
评论

相关推荐

    c++实验报告面向对象编程

    在本篇"C++实验报告面向对象编程"中,我们探讨了C++中的两个核心概念:面向对象编程(Object-Oriented Programming, OOP)和友元(Friend)。实验旨在通过实际编程来帮助学习者深入理解这些概念。 首先,实验一涉及...

    面向对象实验通过编程和上机实验理解 Java 语言是如何体现面向对象

    总的来说,这个实验旨在通过实践让学习者掌握面向对象编程的基本概念,包括如何定义和使用类,创建和操作对象,以及如何通过成员变量和方法实现数据的封装。同时,通过具体的代码实例,加深对Java语言面向对象特性的...

    java面向对象编程练习

    总之,这个面向对象编程练习旨在通过一系列实际的编程任务,帮助学习者掌握Java中的面向对象编程基础,包括类、对象、成员变量和方法的使用,以及继承和多态等高级特性。通过这样的实践,可以更好地理解和运用面向...

    实验三 面向对象程序设计练习

    本实验通过实现简化的活期和定期存款业务功能,练习如何创建类和对象,掌握面向对象编程的基本方法。 读者通过本实验,应达到如下目标: 1) 掌握如何创建类和对象 。 2) 掌握如何为定义的类编写方法。 3) 掌握如何...

    OC面向对象编程基础

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起。相对于面向过程编程,OOP更强调数据和功能的结合,使得代码更加模块化和易于维护...

    面向对象编程实验ssd3

    SSD3(可能指的是软件系统开发课程的第三部分)在这里可能是一个面向对象编程的教学单元,旨在帮助初学者理解并掌握相关知识。 在卡内基梅隆大学的这个实验中,我们可以看到一系列的实验文件,这些文件以rar格式...

    西工大面向对象实验答案代码

    【标题】"西工大面向对象实验答案代码"是一个针对西安工业大学面向对象编程课程的实验解答,主要涉及Java语言。这个资源包含了解决unit2的coffee作业问题和测试2的完整代码,据描述所述,这些代码是经过验证的,确保...

    面向对象程序设计实验报告

    这个实验有助于理解和实践面向对象编程的核心概念,如封装、继承和多态,以及C++中的运算符重载。通过这样的练习,程序员可以更好地掌握面向对象设计的原则,并在实际项目中更有效地编写和维护代码。

    面向对象技术及应用实验指导

    二、面向对象编程实践 实验指导中可能包括以下内容: 1. 类与对象的创建:学习如何定义类,以及如何通过new关键字实例化对象。理解构造函数的作用,它是用来初始化新创建的对象的。 2. 访问控制:理解不同访问...

    《JAVA上机指导》

    实验 3 面向对象编程练习 17 一、实验目的 17 二、实验要求 17 三、实验内容 17 (一)创建 Applet 应用小程序 17 (二)创建对象并使用对象 18 (三)编写显示当前日期和时间的程序 20 (四)使用...

    面向对象排序实验

    这个实验源自山东大学的教学课程,目的是让学生深入理解面向对象编程的核心概念,并通过实现和比较各种排序算法来提升他们的编程技能。 首先,面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它...

    LabVIEW编程:面向对象编程之入门

    面向对象编程(Object-Oriented Programming, OOP)是现代编程的一种重要范式,它将复杂的问题分解为一系列可复用的对象。在LabVIEW中,面向对象编程提供了一种更高效、更易于维护的代码组织方式。 **面向对象编程...

    Java面向对象编程练习[文].pdf

    通过这个练习,你可以深入理解Java中面向对象编程的关键概念,并学习如何在实际编程中应用这些概念,从而提高代码的可读性、可维护性和复用性。在实践中不断练习,将有助于你更好地掌握这些核心技能。

    练习面向对象编程的 JavaScript 练习.zip

    练习面向对象编程的 JavaScript 练习实验室 | JS Vikings学习目标介绍我们已经学习了面向对象编程以及classJavaScript 中的继承工作原理。现在让我们与我们的维京朋友一起应用我们刚刚学到的概念。要求分叉此 repo。...

    20151910042-刘鹏-DSA实验02-高级语言面向对象编程实验1

    总的来说,这次实验旨在通过实际编程练习,让学生掌握Python的面向对象编程核心概念,为后续学习数据结构与算法打下坚实的基础。通过调试和分析代码,学生可以深入理解面向对象编程的原理及其在实际问题解决中的应用...

    面向对象编程 实验报告材料.docx

    此外,还包含了对Java面向对象编程基础知识的练习,如类与对象、继承、重写等概念的实际操作。 实验内容主要分为以下几个部分: 1. **环境配置**: - JDK1.6的下载与安装,这是Java编程的基础。 - 配置环境变量...

    Java语言与面向对象程序设计题解及实验指导

    《Java语言与面向对象程序设计题解及实验指导》是一本深入浅出的教程,旨在帮助读者掌握Java编程语言的核心概念以及面向对象编程的基本原则。本教程覆盖了从基础语法到高级特性的全面内容,通过丰富的题解和实验指导...

    面向对象编程实验报告 (2).docx

    实验通过这样的练习,帮助学生深入理解面向对象编程的基本思想,包括数据封装、继承和多态等核心概念。同时,通过实际操作,学生将学会如何在Eclipse这样的IDE中进行项目开发,提升其编程技能和问题解决能力。 总结...

    面向对象编程实验报告 (2).pdf

    这个实验报告的主题是关于Java开发与语言基础,重点在于理解面向对象编程的基本思想和实践操作。 首先,实验目的是让学生熟悉Java面向对象编程的基础,包括类与对象的概念,以及如何定义和使用它们。此外,实验还...

Global site tag (gtag.js) - Google Analytics