JAVA程序设计--抽象类和接口(三)

接口

搬运:

1、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。

  2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)

  3、维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。

         可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。

         如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。

  4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。

接口只包含常量和抽象方法,不能使用new操作符创建接口的实例!!也无构造方法!!!

UML图里,接口名字和方法名字使用斜体!

虚线和空心三角形指向接口!

特性:接口中定义的所有方法都是public。当一个类实现接口时,该方法必须声明为公共的抽象实例方法!!!且所有变量必须是public static final!!

Show the error in the following code:

    interface A {
      void m1();
    }

    class B implements A {
      void m1() {
        System.out.println("m1");
      }
    }
public加在void m1()前面!!



Comparable接口

Java为两个不同类对象可以互相比较,提供了以下方法:

public interface Comparable<E> {
public int compareTo(E o);
}

由于所有Comparable对象都有compareTo方法,如果对象是Comparable接口类型的实例的话,JavaAPI中的java.util.Arrays.sort(Object[])方法就可以使用compareTo方法了对数组中的对象进行比较和排序了。


练习:

下面代码可以被编译么?

 Integer n1 = new Integer(3);
    Object n2 = new Integer(4);
    System.out.println(n1.compareTo(n2));

答:不能,N1是一个Integer对象,其比较方法需要Interger参数,但N2被声明为Object。编译器将引发错误。


下面代码有什么错误?

public class Test {
      public static void main(String[] args) {
        Person[] persons = {new Person(3), new Person(4), new Person(1)};
        java.util.Arrays.sort(persons);
      }
    }

    class Person {
      private int id;

      Person(int id) {
        this.id = id;         
      }
    }

答:Person没实现Comparable接口,person数组不能用sort方法进行比较。


实现Comparable接口的好处是:

通过实现这个接口,类的对象可以直接传递给需要Comparable类型的方法。



Cloneable接口

Cloneable接口给出了一个可克隆的对象。

Cloneable接口定义如下:

public interface Cloneable{
}

这个接口是空的,一个带空体的接口称为标记接口。用来表示拥有特定的属性。实现Cloneable接口的类标记为可克隆的,而且它的对象可以使用在Object类中定义的clone()方法克隆。


实例:

Calendar calendar= new GregorianClaendar(2013,2,1);
Calendar calendar2=(Calendar)calendar.clone();

System.out.println("calendar==calendar2is"+(calendar==calendar2));

System.out.println("calendar.equals(calendar2)is"+calendar.equals(calendar2));

输出:

calendar == calendar1 is true;
calendar .equals (calendar2) is true;
因为 equals看内容不看引用!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象程序设计与实践 第五章 Java抽象类接口 面向对象程序设计与实践课程组 面向对象程序设计与实践-Java抽象类接口[33页]全文共33页,当前为第1页。 教学目标 教学方式 重点知识 学习目标 1.熟悉抽象类的基本含义以及Java中的语法规则 2.熟悉接口基本含义以及实现规则 3.掌握抽象类定义方法,并能根据需要进行抽象类设计 4.掌握接口定义以及实现方法 1.抽象类的语法规则 2.接口类的定义及实现规则 3.使用接口实现多态 本章以理论讲解、案例演示、代码分析为主。学习本章内容之前,建议同学们先了解"案例描述",带着设计要求学习案例中涉及的知识点,然后动手进行编码实现,需要注意的是: 1.案例5-1的重点在于抽象类的抽象方法的设计 2.案例5-2的重点在于接口的定义及设计 面向对象程序设计与实践-Java抽象类接口[33页]全文共33页,当前为第2页。 目录 CONTENTS 01 5-1 简易公司人事管理 02 5-2 家电产品类设计 面向对象程序设计与实践-Java抽象类接口[33页]全文共33页,当前为第3页。 01 简易公司人事管理 案例描述 案例分析 关联知识 案例实现 案例小结 案例拓展 面向对象程序设计与实践-Java抽象类接口[33页]全文共33页,当前为第4页。 5-1案例描述 现有一软件公司,公司中有开发人员若干、项目经理若干、地区经理若干。已知开发人员有姓名、工号和薪水的属性,并为公司进行工作。项目经理除了有姓名、工号和薪水还有奖金,并为公司进行工作。地区经理除了有姓名、工号和薪水还有奖金和公司的股票分红,也为公司进行工作。现要求根据给出的需求进行公司人员管理。 面向对象程序设计与实践-Java抽象类接口[33页]全文共33页,当前为第5页。 抽象方法 5-1关联知识 抽象方法只有声明没有方法体,不需要具体实现 abstract 返回值数据类型 抽象方法名(); 抽象方法必须用abstract关键字进行修饰,且不能同时使用final或static进行修饰。如果一个类含有抽象方法,则这个类也必须定义为抽象类抽象类必须在类前用abstract关键字修饰。 例如,将Pet类中的两个方法定义为抽象方法 public abstract void enjoy(); //将enjoy定义为抽象方法 public abstract void move(); //将move定义为抽象方法 抽象方法目的就是为了实现一个接口多种方法的原理,即所有的子类对外都呈现一个相同名字的方法,抽象方法必须被重写,且构造方法、类方法不能声明为抽象方法。 面向对象程序设计与实践-Java抽象类接口[33页]全文共33页,当前为第6页。 抽象类 5-1关联知识 抽象类在类层次结构中代表一般性概念,规定必须实现方法的统一接口,子类将基于此概念来定义方法,定义方法如下: abstract class 类名{ 数据成员; //定义抽象方法,没有方法体实现 abstract 返回值数据类型 抽象方法名(); 访问权限 返回值数据类型 成员方法名(形式参数列表){ …方法实现 } } 面向对象程序设计与实践-Java抽象类接口[33页]全文共33页,当前为第7页。 抽象类的特点 5-1关联知识 (1)抽象类中可以有抽象方法,也可以有非抽象方法 (2)抽象类必须被继承 (3)抽象类本身不能实例化,即不能使用new运算创建对象。只有它的非抽象子类可以创建对象,而抽象类定义的对象可以用于指向子类对象。例如, Pet p = new Pet("小白","白色",2,12,2000);//错误,抽象类不能实例化 Pet p = new Cat("咪咪","灰色",1,8,3000,"波斯猫");//正确,可以指向子类对象 (4)由抽象类派生的子类必须实现所有父类的抽象方法,否则,该子类仍然是抽象类。 面向对象程序设计与实践-Java抽象类接口[33页]全文共33页,当前为第8页。 抽象类 5-1关联知识 PupilStu p = new PupilStu(); p.pay(); MiddleStu m = new MiddleStu(); m.pay(); HighStu h = new HighStu();h.pay(); ColgStu c = new ColgStu();c.pay(); 面向对象程序设计与实践-Java抽象类接口[33页]全文共33页,当前为第9页。 5-1案例分析 交流与讨论 结合案例分析,思考一下几个问题: 开发人员——静态属性为姓名、工号、薪水,动态行为为工作 项目经理——静态属性为姓名、工号、薪水,奖金;行为为工作 地区经理——静态属性为姓名、工号、薪水,奖金、股票分红;行为为工作 父类——共性内
学生实训任务单 5-2 【作业 5-4】 物流快递系统程序设计 当人们在购物网站下单后, 订单中的货物就会通过快递送达客户手中,分析快递 系统完成的任务,包含这样几个实体:交通工具、快递任务、货物定位。下面依 次设计相关类和接口,实现:输出送货前、送货、送货后的交通工具、送货人、 快递单号、定位地址等信息。 1. 在物流快递系统中,首先需要定义运输货物的交通工具类 Transportation.java。 (1)由于交通工具可能有很多种,所以,将交通工具类定义为一个抽象类。 (2)Transportation.java 类中需要定义 交通工具编号 number、类型 model、运货负责人 admin 个成员变量,用于存储交通工具的编号、类型和 负责人信息。 (3)定义交通工具抽象类的无参构造和给 3 个成员变量初始化的构造方法。 (4)创建 3 个成员变量的 get/set 方法。 (5)定义一个抽象的运输方法 tarnsport()。 2. 交通工具需要进行保养,定义一个交通工具保养接口 Careable.java,该 接口中包含车辆保养的方法 upKeep()。 (提示:接口中的方法原则上默认为抽 象方法)。 3. 定义一个专用运输车类 Ztransportatin.java。 (1)专用运输车类 Ztransportatin.java,继承交通工具类,并实现保养 接口。 (2)定义专用运输车辆类的无参构造和 3 个参数的构造(这里 3 个参数,是从 父类继承的)。 (3)实现父类的抽象方法 transport(),输出"运输进行中…"语句。 (4) 实现接口Careable.java的抽象方法upKeep(), 输出 "车辆保养完毕! " 信息。 4. 在货物运输中,需要对运输车辆定位,以便随时跟随货物的位置信息。定位 功能可以使用 GPS,而考虑到能够实现定位功能的设备可能有很多,例如手机, 定位仪等,可以定义 GPS 接口,以及实现了该接口的仪器类。 (1) 定义 GPS 接口, 该接口中仅仅包含一个显示定位坐标的方法 showPoint()。 (提示:接口中的方法都是抽象方法)。 5. 定义 GPS 接口实现类 Phone.java,拥有定位功能。 (1)定义 Phone.java 类的无参构造。 (2) 重写定位方法 showPoint(), 返回定位坐标字符串, 例如: "123,456" . 6. 物流快递系统中,快递是一个实体,因此,需要定义快递任务类,包含快递 单号和货物重量的属性,以及货物发送前、发送途中和送到后的方法。 (1)定义快递任务类 SendTask.java,包含快递单号 number、货物重量 goodsWeight 个成员变量。 (2)定义无参构造和给 2 个成员变量初始化的构造方法。 (3)货物在运输前、运输时和运输后,都需要检查和记录,因此,需要定义 3 个方法。 送货前的准备方法: sendBefore(), 无参, 输出文字信息, 以及货物重量、 快递单号等信息。输出如下图所示。 发送货物方法:send(),2 个参数,抽象类 Transportation 变量,接 口 GPS 变量,分别接收交通工具对象和定位坐标;实现输出运货人、交通工 具编号、交通工具类型信息。输出效果如下图所示。 送货后操作方法:sendAfter(),1 个参数,以抽象类 Transportation 变量为参数,接收交通工具对象。输出效果如下图所示。 7. 定义测试类,实例化对象并传入数据,测试运行结果。 (1)创建快递任务类对象,并初始化。 (2)通过快递任务类变量,访问 sendBefore()方法,输出快递送货前准备工 作。 (3)创建专用交通工具类对象,并初始化为: "Z205" "大卡车" "秦承斌"。 (4)创建手机类对象。 (5) 通过快递任务类变量, 访问 send ()方法, 以创建的专用交通工具类对象、 手机类对象为实参,输出快递送货信息。 (6)通过快递任务类变量,访问 sendAfter()方法,输出送货后信息。 输出总效果如下图所示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值