一、实验目的

1、理解 Java 语言的继承和多态特性;

2、掌握变量的隐藏、方法的覆盖、重载;

3、掌握抽象类和接口的使用。

二、实验要求

1、根据实验步骤中提出的要求,使用eclipse等开发工具编写相应的Java程序;

2、编译、运行自己所编写的Java程序;

3、根据编译与运行过程中所获得的错误信息修改程序直至获得正确的结果;

4、记录实验中遇到的各类问题并以及解决办法。

三、实验步骤及结果

(1)设计学生类Student。该类包含两个私有成员变量name和no(分别用于存放姓名和学号),以及两个public成员方法,分别为:

void setData(String name,String no) 用于设置姓名和学号;

void print() 用于输出姓名和学号。

(a)编写程序文件 Student.java,源代码如下:

public class Student {
private String name;
private String no;
public void setData(String name,String no){
this.name=name;
this.no=no;
};
public void print(){
System.out.println("姓名:"+name);
System.out.println("学号:"+no);
}
}

   (2)设计继承上述题目(1)的Student 类的子类Undergraduate 。子类Undergraduate不仅具有父类的成员变量name(姓名)、no(学号),还定义新成员变量academy(学院)、department (系);并重载方法void setData(String name,String no, String academy, String department) 用于设置姓名、学号、学院和系;以及重写父类中void print()方法,实现输出姓名、学号、学院和系。在main()方法中创建一个该子类对象s,接着调用相应方法设置一个学生的姓名、学号、学院和系并输出。

(a)编写程序文件 Undergraduate.java,源代码如下:

public class Undergraduate extends Student{
String academy;
String department;
public void setData(String name,String no,String academy,String department){
setData(name,no); //private只能使用方法调用
this.academy=academy;
this.department=department;
}
public void print(){
super.print(); //调用父类的print方法
System.out.println("学院:"+academy+"\n系:"+department);
}
}

(b)编译运行程序,其结果如图所示。

Test主类

public class Test {
public static void main(String[] args) {
Undergraduate s = new Undergraduate();
s.setData("SZer0","123","物联网","GK");
s.print();
}
}

​编辑

(c)使用父类Student声明一个对象变量,使用已创建的子类对象进行赋值,然后使用分类对象调用print()方法,结果跟子类对象调用print()是否有区别?为什么?

Student stu=s;

stu.print();

public class Test {
public static void main(String[] args) {
Undergraduate s = new Undergraduate();
s.setData("SZer0","123","物联网","GK");
s.print();
System.out.println("===================");
Student stu = s; //上转型
stu.print();
}
}

​编辑

(3)设计一个动物声音“模拟器”,希望“模拟器”可以模拟许多动物的叫声,要求如下:

A、编写接口Animal

该接口有2个抽象方法:cry()和getAnimalName(),即要求实现该接口的各种具体动物类给出自己的叫声和种类名称。

public interface Animal {
void cry();
void getAnimalName();
} class Dog implements Animal{
@Override
public void cry() {
System.out.println("汪汪");
} @Override
public void getAnimalName() {
System.out.println("狗狗");
}
} class Cat implements Animal{
@Override
public void cry() {
System.out.println("喵喵");
} @Override
public void getAnimalName() {
System.out.println("猫猫");
}
}

B、编写模拟器类Simulator

该类有一个playSound(Animal an)方法,该方法的参数为Animal类型,则an可以调用实现Animal接口类重写的cry()方法播放具体动物的声音,调用重写的getAnimalName()方法显示具体动物种类的名称。

public class Simulator {
void playSound(Animal an){
an.cry();
an.getAnimalName();
}
}

C、编写实现Animal接口的Dog类和Cat类。

D、编写主类Application(用户程序),在其main()方法中至少包含如下代码:

Simulator sm=new Simulator();

sm. playSound(new Dog());

sm. playSound(new Cat());

public class Test {
public static void main(String[] args){
Simulator sm=new Simulator();
sm. playSound(new Dog());
sm. playSound(new Cat());
}
}

​编辑

(c)在主类Application中使用匿名类的方式实现小鸡的叫声,源代码和执行结果如下。

public class Test {
public static void main(String[] args){
Simulator sm=new Simulator();
sm. playSound(new Dog());
sm. playSound(new Cat()); Simulator.playSound(new Animal() { //接口匿名类
@Override
public void cry() {
System.out.println("咯咯");
} @Override
public void getAnimalName() {
System.out.println("小鸡");
}
});
}
}

​编辑

四、实验小结

通过本次实验,理解 Java 语言的继承和多态特性,掌握变量的隐藏、方法的覆盖、重载,掌握抽象类和接口的使用。

Java实验 继承与接口的更多相关文章

  1. Java的继承与接口

    为什么Java里面只允许单一继承,但允许实现多个接口? 1,为什么不能实现类的多继承?主要是防止多个类有相同的方法名,然而方法体不一样,子类就比较难选择了.所以java和C#不支持类的多继承2,允许具 ...

  2. 对java中继承、接口、组合的思考

    1.在c++中有继承和多重继承,而java中只有单继承.继承的好处在于可以复用一些东西,但缺陷在于后续不好扩展.此外,可读性方面继承也不好. 2.java中多了一个接口的概念,而接口的功能和其名字表达 ...

  3. Java中类继承、接口实现的一些细节(长期更新)

    前言 在Java中,子类继承父类,类实现接口是属于常识性的内容了,作为一个Java程序员应该也比较熟悉.不过子类继承父类,类实现接口中还是有一些小细节值得注意一下,本文就从个人工作.学习中入手,总结一 ...

  4. 关于Java中继承多接口同名方法的问题

    在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...

  5. Java实验案例(接口)

    实验任务 任务一:设计实现发声接口 任务二:动物乐园 实验内容 任务一:设计实现发声接口 任务目的: 理解并掌握如何定义接口 掌握接口的实现方式 任务描述: 设计和实现一个Soundable接口,该接 ...

  6. Java中类继承、接口实现的一些要注意的细节问题

    1.接口A和接口B有相同的方法,只是返回值不同,则实现类不能同时实现这两个接口中的方法. 接口A有void C()方法,接口B有int C()方法,则无法同时实现这两个接口. Java为了弥补类单继承 ...

  7. Java实验--继承与多态

    ---恢复内容开始--- 题目如下: [实验任务一]:面积计算(设计型). 1. 实验要求: 实验报告中要求包括程序设计思想.程序流程图.源代码.运行结果截图.编译错误分析等内容. 2.实验内容: ( ...

  8. Java基础——继承、接口

    一个对象变量(例如,变量e)可以引用多种实际类型的现象被称为多态(polymorphism). 在运行时能够自动地选择调用哪个方法的现象称为动态绑定(dynamic binding). 在Java程序 ...

  9. Java基础-继承 利用接口做参数,写个计算器,能完成+-*/运算

    38.利用接口做参数,写个计算器,能完成+-*/运算 (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 ...

  10. java学习——JDK1.8接口和实现类

    Java 8 新特性:接口的静态方法和默认方法 https://blog.csdn.net/sun_promise/article/details/51220518 接口的默认方法和静态方法 http ...

随机推荐

  1. 51电子-STC89C51开发板:安装驱动

    全部内容请点击目录列表查看: 51电子-STC89C51开发板:<目录> ---------------------------  正文开始  ---------------------- ...

  2. 安防视频监控系统前端摄像机——DSP与SOC摄像机

    一.DSP摄像机 DSP(Digital Signal Processing)即数字信号处理,它是利用数字计算机或专用数字信号处理设备,以数值计算的方法对信号进行采集.变换.综合.估值.识别等加工处理 ...

  3. SCI、SSCI、EI、北大中文核心期刊、CSCD、CSSC、SCD、CSSCI 扩展版、计算机软件著作权

    https://zhidao.baidu.com/question/308484724.html SCI(科学引文索引).EI(工程索引).ISTP(科技会议录索引)是世界著名的三大科技文献检索系统, ...

  4. 从main_phase跳回reset_phase的方式

    在main_phase中调用: phase.jump(uvm_reset_phase::get()); 注意需要防止进入死循环.

  5. Oracle重建索引

    创建表 create table student( student_id number, name varchar2(240) ) tablespace school_data; 创建索引 creat ...

  6. 基于CentOS搭建FTP文件服务实战

    参考教程来自腾讯云开发者实验室:https://cloud.tencent.com/developer/labs/lab/10123 话不多少,进入流程 1. 安装vsftpd 使用 yum 安装 v ...

  7. GrADS CTL文件 VARS字段

    GrADS可以读取GRIB格式的再分析数据,如ERA5,CFSR,CRA40等.对于这些数据,借助grib2ctl/g2ctl程序,生成描述文件(*.ctl文件),再通过gribmap命令,生成索引文 ...

  8. STP协议-基础

    生成树协议 一 .技术背景一个缺乏冗余性设计的网络:任何一个网络节点出现故障,会造成单链路故障.单设备故障,使整个网络瘫痪. 引入冗余性的同时也引入了二层环路:网络的冗余性增强了,但是却出现了二层环路 ...

  9. wpf treeview 选中节点加载数据并绑定

    <TreeView Grid.Row="0" Grid.Column="0" x:Name="FolderView" Canvas.T ...

  10. python中的platform模块

    platform模块给我们提供了很多方法去获取操作系统的信息: import platform print(platform.platform())# 获取操作系统名称和版本号:macOS-10.14 ...