Java语言实验5 多态性与接口

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
this.name = name;
this.age = age;
}
//getter与setter方法略。
public String toString(){
return "姓名:"+this.name+";年龄:"+this.age;
}
}
public class PersonDemo{
public static void main(String args[]){
1、重写Object类的equals方法
任务一:使用继承自Object类的equals方法进行Person对象的比较操作。
(1)源代码如下:
class Person{
private String name;
private int age;
public Person(String name,int age){
}
returnsalaries;
}
}
packagerenwu2;
abstractclassEmployee {
publicabstractdoubleearnings( );
}
packagerenwu2;
publicclassWeekWorkerextendsEmployee{
publicdoubleearnings(){
returnfalse;
}
if(((Person)obj).name==this.name&&((Person)obj).age==this.age) {
returntrue;
}
returnfalse;
}
运行结果:
2、对象的上转型对象
任务一:对象的上转型对象接收任意子类类型的对象
(1)使用Object接收一切的引用类型对象。
如果程序编译为通过,或运行时有错误提示,请说明原因,并将错误改正。
答:错误:The method getInfo() is undefined for the type Object方法getInfo()没有被定义,需要add cast to Obj,改为System.out.println(((A) obj).getInfo());即可。
packagerenwu1;
classCextendsA {
publicvoidfun1() {
System.out.println("C-->public void fun1(){}");
}
publicvoidfun5() {
System.out.println("C-->public void fun3(){}");
}
};
packagerenwu3;
publicclassPolDemo4{
publicstaticvoidmain(String[]args) {
//TODOAuto-generated method stub
fun(newB());//传递B类实例
fun(newC());//传递C类实例
}
publicstaticvoidfun(Bb) {
}
}
packagerenwu1;
publicclassPolDemo05 {
publicstaticvoidmain(String[]args) {
//TODOAuto-generated method stub
fun(newB());//传递B类实例,产生向上转型
fun(newC());//传递C类实例,产生向上转型
classBextendsA {
publicvoidfun1() {
System.out.println("B-->public void fun1(){}");
}
publicvoidfun3() {
System.out.println("B-->public void fun3(){}");
}
};
public int gearNum; //排档数
public String tiretype; //轮胎型号
public float engine; //引擎排气量
//公用抽象方法声明区
任务二:上转型实现多态性
(1)实例学习
不使用上转型对象实现多态性源代码如下:
源代码:
packagerenwu3;
classA{
publicvoidfun1(){
System.out.println("A-->public void fun1(){}");
}
publicvoidfun2() {
this.fun1();
答:子类可以调用抽象类父类的构造方法。
4、接口案例学习
任务一:学习下面实例,定义一个抽象的汽车类car,再将汽油车设计为接口。该程序代码如下:
import java.awt.Color; //汽车抽象类
public abstract class Car
{
//公用数据字段声明区
public Color color; //车辆颜色
}
};
packagerenwu3;
classBextendsA {
publicvoidfun1() {
System.out.println("B-->public void fun1(){}");
}
publicvoidfun3() {
System.out.println("B-->public void fun3(){}");
使用上转型对象实现多态性:
源代码:
packagerenwu1;
classA {
publicvoidfun1(){
System.out.println("a-->public void fun1(){}");
}
publicvoidfun2() {
this.fun1();
}
};
packagerenwu1;
for(inti=0;i<employee.length;i++){
if(i%3==0)
employee[i]=newWeekWorker();
elseif(i%3==1)
employee[i]=newMonthWorker();
elseif(i%3==2)
employee[i]=newYearWorker();
单元可以是YearWorker对象的上转型对象、MonthWorker对象的上转型对象或WeekWorker对象的上转型对象。
程序能输出Company对象一年需要支付的薪水总额。
(2)代码模板
源代码:
packagerenwu2;
publicclassCompany {
Employee[]employee;
publicdoubleearnings(){
return120000;
}
}
packagerenwu2;
publicclassHardWork {
publicstaticvoidmain(String[]args){
Employee[]employee=newEmployee[20];//公司有20名职员
}
publicstaticvoidfun(Aa) {//接收父类对象
a.fun1();
}
}
运行结果:
(2)阅读上述两个源代码,深刻理解使用上转型对象实现多态性机制。
答:上转型:是子类对象由父类引用。想要上转型的前提必须是由继承关系的两个类,在调用方法的时候,上转型对象只能调用父类中有的方法,如果调用子类方法则会报错。
Person person1 = new Person(“李兴华”,30);
Person person2 = new Person(“李兴华”,30);
System.out.println(person1.equals(person2)?"是同一个人。":"不是同一个人。");
}
}
(2)编译并运行应用程序。
3、抽象类与上转型对象练习
任务源自文库:通过对上述实验内容的实践与学习,根据要求填写代码。
(1)要求:
有一家公司,有不同类型的员工,包括按年领取薪水,按月领取薪水,按周领取薪水,计算该公司一年需支付的薪水总额
有一个abstract类,类名为Employee;
该类有一个abstract方法:
public abstract double earnings( );;
return52*1000;
}
}
packagerenwu2;
publicclassMonthWorkerextendsEmployee{
publicdoubleearnings(){
return12*5000;
}
}
packagerenwu2;
publicclassYearWorkerextendsEmployee {
}
Companycompany=newCompany(employee);
System.out.println("公司年工资总额:"+company.salariesPay()+"元");
}
}
运行结果:
(3)实验报告
将代码1-4写在实验报告中。
在Employee类的子类中合适位置使用super,再运行程序。根据查看的结果,验证在子类中是否可以调用抽象类父类的构造方法,即抽象类是否有构造方法?
Employee的子类有YearWorker、MontthWorker和WeekWorker。
YearWorker对象按年领取薪水,MonthWorker按月领取薪水,WeekWorker按周领取薪水。
子类必须实现父类的earnings()方法,返回各自领取薪水数。
有一个Company类,该类用employee数组作为成员,employee数组的
任务二:修改上述源代码Person类,使PersonDemo应用程序执行结果为“同一个人”。
提示:equals方法的原型是:public boolean equals(Object obj){}
源代码:
publicbooleanequals(Objectobj){
if(obj==null||!(objinstanceofPerson)) {
一、实验目的
1.深入理解类的继承的基本概念及实现。
2.了解Object及对Object类的主要方法equals进行重写。
3.掌握super关键字的作用。
4.掌握抽象类与接口的基本概念及实际应用
5.掌握对象多态性的作用。
6.掌握接口的基本概念及实际应用。
7.掌握接口回调的概念及运行机制。
二、实验内容及步骤
源代码:
class A{
public String getInfo(){
return “Hello World!!!”;
}
}
public class ADemo{
public static void main(String args[]){
Object obj = new A();
System.out.println(obj.getInfo());
b.fun1();//统一调用覆写父类的fun1()方法
}
publicstaticvoidfun(Cc) {
c.fun1();
}
}
运行结果:
以上程序虽然实现了基本的要求,但是可以发现:如果按照以上的方式完成程序,则当产生一个A类的子类时,fun()方法就要重载一次,这样如果功能扩充,则必须要修改类本身,那么如果使用对象多态性完成呢?
System.out.println(obj.toString());
A a = (A)obj;
System.out.println(a.getInfo());
System.out.println(a.toString());
}
}
(2)编译并运行程序。
运行结果:
(3)实验报告
将运行结果写在实验报告中。
}
};
packagerenwu3;
classCextendsA{
publicvoidfun1() {
System.out.println("C-->public void fun1(){}");
}
publicvoidfun5() {
System.out.println("C-->public void fun3(){}");
doublesalaries=0;
Company(Employee[]employee){
this.employee=employee;
}
publicdoublesalariesPay(){
salaries=0;
for(inti=0;i<employee.length;i++){
salaries=salaries+employee[i].earnings();
运行结果:
(3)实验报告
将运行结果写在实验报告中。
思考:应用程序中person1对象调用的equals方法是从哪个类继承的,请查看源代码,说明此equals方法的作用,即比较的内容。
答:person1对象调用的equals方法是从Object类继承的。
此equals方法的目的是通过boolean判断两对象内存地址是否相同。
相关文档
最新文档