类的多态性

一、实验目的:

理解类的多态性,掌握方法的继承、重载和覆盖,掌握如何从键盘输入数据以及多重循环的使用。

二、实验环境:

eclipse

三、实验内容:

(一)类的多态性练习

1.    理解类的多态性

类的继承发生在多个类之间,而类的多态只发生在同一个类上。在一个类中,可以定义多个同名的方法,只要确定它们的参数个数和类型不同。这种现象称为类的多态。多态使程序简洁,为程序员带来很大便利。在OOP 中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。

类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。

2.    方法的重载

方法的重载是指对同名方法的不同使用方式。

1)       程序功能:对不同的数进行排序输出。在IntSort 类中定义2 个同名的方法sort。

2)       编写KY5_1.java 文件,源代码如下。

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;

        }

        if (b<c) {

            swap=b;

            b=c;

            c=swap;

        }

        return a+" "+b+" "+c;

    }

}



public class KY5_1 {

    public static void main(String args[]) {

        int a=30, b=12, c=40;

        IntSort s=new IntSort();

        System.out.println("两个数的排序结果:"+s.sort(a,b));

        System.out.println("三个数的排序结果:"+s.sort(a,b,c));

    }

}

3)       编译KY5_1.java并运行程序

4)       将程序的输出结果记录在实验报告中。

输出结果:

 

5)       请在实验报告中说明在IntSort 类中出现的下面两个同名的方法各自的功能?

I.         public String sort (int a, intb) 

II.       public String sort (int a, intb, int c)

答:public String sort (int a, int b)的功能是对两个数a,b进行由大到小排序。

public Stringsort (int a, int b, int c)的功能是对a,b,c三个数进行由大到小的排序。

6) 请在实验报告中指出程序中是哪条语句调用了方法I,哪条语句调用了方法II?

语句:System.out.println("两个数的排序结果:"+s.sort(a,b));调用了方法I。

语句:System.out.println("三个数的排序结果:"+s.sort(a,b,c));调用了方法II。

(二)构造方法的重载

构造方法的名称和类同名,没有返回类型。尽管构造方法看起来和一般的成员方法没有差别,但它不是方法,也不是类的成员。因此,构造方法不能直接调用,只能由new 操作符调用。

构造方法对于类是十分重要的,对象的初始化任务要靠构造方法来完成。重载构造方法的目的是提供多种初始化对象的能力,使程序员可以根据实际需要选用合适的构造方法来初始化对象。

1)       编写程序KY5_2.java,将其中的类RunDemo的构造方法进行重载。源代码如下。

class RunDemo {

    private String userName, password;

    RunDemo(String name) {

        userName=name;

    }

    RunDemo(String name, String pwd) {

        this(name);

        password=pwd;

    }

    void check() {   //检验用户名和密码

        String s=null;

        if (userName!=null)

            s="用户名:"+userName;

        else

            s="用户名不能为空!";

        if (password!="123456")

            s=s+" 口令无效!";

        else

            s=s+" 口令:******";

        System.out.println(s);

    }

}

public class KY5_2 {

    public static void main(String[] args) {

        RunDemo r1=new RunDemo("刘新宇");

        r1.check();

        RunDemo r2=new RunDemo(null, "654321");

        r2.check();

        RunDemo r3=new RunDemo("张驰","123456");

        r3.check();

    }

}

2)       编译程序KY5_2.java并运行程序

3)       将程序的输出结果记录在实验报告中。

输出结果:

 

4)       指出程序中的下面三条语句分别调用了类RunDemo中的哪个构造方法?

I.         new RunDemo("刘新宇");

II.       new RunDemo(null,"654321");

III.    new RunDemo("张驰","12345678");

答:new RunDemo("刘新宇");调用了构造方法RunDemo(String name) {userName=name; }

new RunDemo(null, "654321"); 调用了构造方法RunDemo(String name, Stringpwd) {

        this(name);

        password=pwd;}

        new RunDemo("张驰","12345678");调用了构造方法unDemo(String name, String pwd) {

        this(name);

        password=pwd;}

5)       类RunDemo中有两个构造方法,其中第一个构造方法RunDemo(String) 只有一个参数,用来对成员变量userName 赋初值。第二个构造方法RunDemo(String, String) 有两个参数,并有更多的内容,首先调用this(name),其实际作用就是调用当前类的构造方法RunDemo(String name)然后对成员变量password 赋值;最后调用check 方法来检查userName 和password,类似于一般程序的口令验证。重载构造方法的执行由对象根据实际参数的个数、类型和顺序确定。

(三)使用键盘输入

1.        程序功能:运行程序后,从键盘输入数字 1、2或者3 ,可显示抽奖得到的奖品;如果输入其它数字或字符则显示“对不起,没有奖品给你!”。

2.        程序源代码如下。     

import java.io.*;

      class KY5_3 {

          public static voidmain(String args[]) throws IOException {

            char ch;

           System.out.println("抽奖游戏,祝您好运!");

            System.out.println("按 1、2、3 数字键后回车,可得大奖!");

           System.out.println("按空格键后回车,可退出本游戏.");

            while((ch=(char)System.in.read())!=' ')

            {

              System.in.skip(2);     // 跳过回车键

               switch (ch) {

               case '1':

                System.out.println("恭喜您得大奖,一辆汽车!");

                 break;

               case '2':

                System.out.println("不错呀,您得到一台笔记本电脑!");

                 break;

               case '3':

                 System.out.println("没有白来,您得到一台冰箱!");

                 break;

               default:

                System.out.println("对不起,没有奖品给您!欢迎下次光临。");

             }

          } 

        }

       }

3.编译并运行KY5_3.java

  4.运行程序,从键盘输入一下数字或字符,看看程序的输出结果是什么?把这些结果写在实验报告中。

输出结果:

 

(四) 使用多重循环语句

1.请编写程序 KY5_4.java,要求程序能够输出九九乘法表。

2.程序源代码如下。

public class KY5_4

    {

      public static void main(Stringargs[])

      {

         int i, j, n=9;

          System.out.print("      *  |");

          for (i=1; i<=n; i++)  { System.out.print("    "+i);  }   //第一个for循环

         System.out.print("\n----------|");

          for (i=1; i<=n; i++)  { System.out.print("-----");  }     //第二个for循环

          System.out.println();

          for (i=1; i<=n; i++)                               //第三个for循环

          {

              System.out.print("     "+i+"    |");

              for (j=1; j<=i; j++)  { System.out.print("   "+i*j);  }   //第四个for循环

              System.out.println();

         }

      }

 }

3.编译并运行KY5_4.java      

4.请将程序的运行结果写在实验报告中,并且说明程序中每一个for循环的作用。

输出结果:

 

第一个for循环的作用:输出列号:    1   2    3    4   5    6    7   8    9

第二个for循环的作用:输出分隔符:---------------------------------------------

第三个for循环的作用:输出每一行的行号和分隔符

第四个for循环的作用:输出9*9乘法表每一行的结果

四、心得体会:

通过这次实验,理解了类的多态性,掌握了方法的继承、重载和覆盖,掌握了如何从键盘输入数据以及多重循环的使用。类的继承发生在多个类之间,而类的多态只发生在同一个类上。在一个类中,可以定义多个同名的方法,只要确定它们的参数个数和类型不同。这种现象称为类的多态。多态使程序简洁,为程序员带来很大便利。在OOP 中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。方法的重载是指对同名方法的不同使用方式。构造方法的名称和类同名,没有返回类型。尽管构造方法看起来和一般的成员方法没有差别,但它不是方法,也不是类的成员。因此,构造方法不能直接调用,只能由new 操作符调用。构造方法对于类是十分重要的,对象的初始化任务要靠构造方法来完成。重载构造方法的目的是提供多种初始化对象的能力,使程序员可以根据实际需要选用合适的构造方法来初始化对象。

 

全部评论

相关推荐

03-15 14:55
已编辑
门头沟学院 golang
bg:双非学院本&nbsp;ACM银&nbsp;go选手timeline:3.1号开始暑期投递3.7号第二家公司离职顽岩科技&nbsp;ai服务中台方向&nbsp;笔试➕两轮面试,二面挂(钱真的好多😭)厦门纳克希科技&nbsp;搞AI的,一面OC猎豹移动&nbsp;搞AIGC方向&nbsp;一面OC北京七牛云&nbsp;搞AI接口方向&nbsp;一面OC上海古德猫宁&nbsp;搞AIGC方向&nbsp;二面OC上海简文&nbsp;面试撞了直接拒深圳图灵&nbsp;搞AIGC方向一面后无消息懒得问了,面试官当场反馈不错其他小厂没记,通过率80%,小厂杀手😂北京字节&nbsp;具体业务不方便透露也是AIGC后端方向2.28约面&nbsp;(不知道怎么捞的我,我也没在别的地方投过字节简历哇)3.6一面&nbsp;一小时&nbsp;半小时拷打简历(主要是AIGC部分)剩余半小时两个看代码猜结果(经典go问题)➕合并二叉树(秒a,但是造case造了10分钟哈哈)一天后约二面3.12&nbsp;二面,让我挑简历上两个亮点说,主要说的docker容器生命周期管理和raft协议使用二分法优化新任leader上任后与follower同步时间。跟面试官有共鸣,面试官还问我docker底层cpu隔离原理和是否知道虚拟显存。之后一道easy算法,(o1空间解决&nbsp;给定字符串含有{和}是否合法)秒a,之后进阶版如何用10台机加快构建,想五分钟后a出来。面试官以为45分钟面试时间,留了18分钟让我跟他随便聊,后面考了linux&nbsp;top和free的部分数据说什么意思(专业对口了只能说,但是当时没答很好)。因为当时手里有7牛云offer,跟面试官说能否快点面试,马上另外一家时间到了。10分钟后约hr面3.13,上午hr面,下午走完流程offer到手3.14腾讯技术运营约面,想直接拒😂感受:&nbsp;因为有AIGC经验所以特别受AI初创公司青睐,AIGC后端感觉竞争很小(指今年),全是简历拷打,基本没有人问我八股(八股吟唱被打断.jpeg),学的东西比较广的同时也能纵向深挖学习,也运气比较好了哈哈可能出于性格原因,没有走主流Java路线,也没有去主动跟着课写项目,项目都是自己研究和写的哈哈
烤点老白薯:你根本不是典型学院本的那种人,贵了你这能力
查看7道真题和解析
点赞 评论 收藏
分享
03-16 13:56
湖南大学 C++
牛客872108596号:到现在没消息是挂了吗查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务