抽象类和接口<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

一、抽象类

在类层次结构中,类的位置越高,其定义的抽象程度也就越高。在定义类层次结构中的过程中,有一些类确定了子类的通用的行为和属性,而且这些类不能被实例化用限定符abstract来声明。这些类称为抽象类。
l    抽象类可以包含常规类能够包含的任何东西,包括构造方法,因为子类可能需要继承这种方法。
l    抽象类也可以包含抽象方法,也就是没有实现的方法,而这些方法在子类中被实现。不能在非抽象类中声明抽象方法。
l    如果一个抽象类中除了抽象方法外什么都没有,则最好使用接口。

二、接口

     与抽象类和抽象方法一样,接口也是提供了其他类要实现的行为模板。
使用和实现接口
l    要使用接口,可以在类定义中包含关键字implements
l    包含接口后,必须实现该接口中的所有方法,而不能有选择地实现其中的某些。
l    类实现接口后,子类将继承该接口中的所有方法,并可以覆盖或重载它们。
l    若类继承了一个实现了某一接口的超类,则不必在本类中又implements一次。
l    要在类中使用多个接口,只需要将它们的名称用逗号分开。
使用多个接口时如果两个接口定义了相同的方法,则应注意以下规则:
l    如果两个方法的特征标相同,可以在类中实现一个方法,其定义能够满足两个接口。
l    如果方法的参数列表不同,则是一种简单的方法重载:实现两种方法特征标,分别满足两个接口的需要。
l    如果方法的参数列表相同,但返回值不同,则无法创建一个能够满足两个接口的方法。这时,编译会出错。
创建接口的规定:
l    创建接口要用interface,而不是class。
l    如果接口前没有限定符,则自动被转换为abstract和public的,而且不能在接口内将方法声明为私有的或是保护的。
l    除了方法外,接口还可以包含变量,但它们必须是公有、静态和final的(常量)。或者不使用限定符,这样会自动声明为这些限定,而且变量须赋值。
l    如果声明接口时没有使用pulbic,则接口不会自动将方法转换为公有和抽象的,也不会将常量转换为公有的。而非公有接口的方法和常量也是非公有的,这些方法和常量只能被同一个包中的类和其他接口使用。
l    与类一样,接口也可以属于某个包。接口还可以导入其他包中的接口和类,就像类一样。
l    接口可以继承另一个接口,此时‘子接口’将获得‘超接口’中声明的所有方法定义和常量。这时要使用extends扩展。
l    另外,不同于类,接口可以多重继承,新接口将包含其父接口中的方法和常量。(多继承约束参见本话题之上的一个话题)

三、实例

创建一个网上商店,应用程序Storefront使用了包、访问控制、接口和封装。主要处理两项任务:
l    根据库存量计算每种商品的销售价格;
l    按照销售价格对商品排序;
Item类
package com.prefect.ecommerce;
/**
* 本类实现了Comparable接口,这个接口使得对类的对象进行排序更容易。
* 这个接口只有一个方法compareTo(Object),返回一个整数,功能是比较
* 两个对象:
*      若当前对象应排列在另一个之前,返回-1
*      若当前对象应排列在另一个之后,返回1
*      两个对象相等,则返回0
* */
public class Item implements Comparable
{
        private String id;
        private String name;
        private double retail;
        private int quantity;
        private double price;
        
        Item(String id,String name,String retail,String quan)
        {
                this.id = id;
                this.name = name;
                this.retail = Double.parseDouble(retail);
                this.quantity = Integer.parseInt(quan);
                
                if(this.quantity > 400)
                {
                        this.price = this.retail * .5D;                        
                }
                else if(this.quantity > 200)
                {
                        this.price = this.retail * .6D;
                }
                else
                {
                        this.price = this.retail * .7D;
                }
                //对price四舍五入,Math.floor()表示将小数舍入为与之最接近且不大于它的整数
                //并返回double
                price = Math.floor(price * 100 + .5)/100;
        }
        //compareTo()方法需要决定根据哪个实例变量来对对象进行排序,这里根据price
        public int compareTo(Object o)
        {
                Item temp = (Item)o;
                if(this.price < temp.price)
                {
                        return 1;
                }
                else if(this.price > temp.price)
                {
                        return -1;
                }
                return 0;
        }
        public String getId()
        {
                return id;
        }
        public String getName()
        {
                return name;
        }
        public double getPrice()
        {
                return price;
        }
        public int getQuantity()
        {
                return quantity;
        }
        public double getRetail()
        {
                return retail;
        }
Storefont类
/**
*用于管理商店中的商品,每一种商品都是一个Item对象,他们被存储在链表中    
*/
package com.prefect.ecommerce;
import java.util.Collections;
import java.util.LinkedList;
public class Storefont
{
        //创建一个链表
        private LinkedList catalog = new LinkedList();
        //将item加入到链表中
        public void addItem(String id, String name, String price, String quant)
        {
                Item it = new Item(id, name, price, quant);
                //在链表中添加对象的方法
                catalog.add(it);
        }
        
        //返回当前的item,使用索引i来读取他们
        public Item getItem(int i)
        {
                //读取链表中的索引
                return (Item) catalog.get(i);
        }
        //返回链表中的对象数
        public int getSize()
        {
                //链表的大小
                return catalog.size();
        }
        public void sort()
        {
                //此方法对链表和其他数据结果中的对象进行排序,期间将调用对象的
                //comparaTo()方法来确定排序
                Collections.sort(catalog);
        }
}
GiftShop类
package com.prefect.ecommerce;
public class GiftShop
{
        public static void main(String[] args)
        {
                Storefont store = new Storefont();
                //添加商品
                store.addItem("C01","MUG","9.99","150");
                store.addItem("C02","LG MUG","12.99","82");
                store.addItem("C03","MOUSEPAD","10.49","800");
                store.addItem("D01","T SHIRT","16.99","90");
                //进行排序
                store.sort();
                
                //输出排序后的结果
                for(int i = 0 ; i < store.getSize() ; i++)
                {
                        Item show = (Item)store.getItem(i);
                        System.out.println("\nItem ID:" + show.getId()
                                        + "\nName:" + show.getName()
                                        + "\nRetail Price:$" + show.getRetail()
                                        + "\nPrice:$" + show.getPrice()
                                        + "\nQuantity:" + show.getQuantity());
                }
        }
}
运行结果
Item ID:D01
Name:T SHIRT
Retail Price:$16.99
Price:$11.89
Quantity:90

Item ID:C02
Name:LG MUG
Retail Price:$12.99
Price:$9.09
Quantity:82

Item ID:C01
Name:MUG
Retail Price:$9.99
Price:$6.99
Quantity:150

Item ID:C03
Name:MOUSEPAD
Retail Price:$10.49
Price:$5.25
Quantity:800

转载于:https://blog.51cto.com/wnight88/141595

[J2SE 基础知识]2、抽象类和接口(上)相关推荐

  1. C++基础篇之抽象类的接口

    C++基础篇之抽象类的接口 接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类 ...

  2. 计算机io接口主要功能,计算机基础知识2:IO接口及电源介绍.ppt

    <计算机基础知识2:IO接口及电源介绍.ppt>由会员分享,可在线阅读,更多相关<计算机基础知识2:IO接口及电源介绍.ppt(18页珍藏版)>请在人人文库网上搜索. 1.I/ ...

  3. java package报错_Java基础知识总结 - 超详细篇(上)

    1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...

  4. 微机原理和计算机硬件基础知识,微机原理与接口技术

    微机原理与接口技术 (2010年清华大学出版社出版的图书) 语音 编辑 锁定 讨论 上传视频 <微机原理与接口技术>是2010年8月1日清华大学出版社出版的图书,作者是姚琳.孙志辉.韩伯涛 ...

  5. Java基础篇:抽象类与接口

    1.抽象类和接口的定义: (1)抽象类主要用来抽取子类的通用特性,作为子类的模板,它不能被实例化,只能被用作为子类的超类. (2)接口是抽象方法的集合,声明了一系列的方法操作,自身并不能做任何事情.如 ...

  6. Android开发之Java基础面试题抽象类和接口的区别

    抽象类和接口的区别? 三个方面说: 1.成员特点: 抽象类:成员变量,可以是变量也可以是常量成员方法:可以是抽象方法,也可以是非抽象方法构造方法:有构造方法接口:成员变量,只有常量没有构造方法成员方法 ...

  7. 【JAVA基础篇】抽象类和接口的区别

    抽象类和接口是定义抽象概念的两种方式,正是由于抽象类和接口,才赋予了Java强大的面向对象的能力.在讨论他们的不同点之前,我们先来了解抽象类和接口. 抽象类 在面向对象的领域一切事物都是对象.对象都是 ...

  8. Java基础---多态、抽象类、接口

    2015-4-4 一.多态 1.定义:某一个事物,在不同时刻表现出来的不同状态. 2.多态的前提与体现: (1)要有继承关系: (2)要进行方法的重写: (3)要父类引用指向子类对象. 3.成员访问特 ...

  9. 【python基础知识】调用C++接口(setup.py运行)出现的各种问题

    1.setup.py文件编写 网上下载的C++程序的Python接口,不会使用,全靠摸索.根据最近出现的问题,写下其中的道道,避免下一次抓狂. setup.py文件内容如下: from distuti ...

最新文章

  1. linux系统目录结构介绍
  2. 阿里巴巴2014校招笔试错误汇总
  3. iOS开发那些事-故事板实现标签导航
  4. Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局...
  5. php 编写mysql,自己写的MySQL类
  6. 前端学习(3135):react-hello-react之函数的柯里化
  7. 重磅!李沐在斯坦福开新课了!
  8. win11为何七代酷睿无法升级 Windows11七代酷睿无法升级的解答
  9. lg-1 x 怎么算_四六级分数怎么算?交白卷都不会得0分|巨微英语
  10. 网络运维超融合服务器,15. 通过 Openfiler 软件:配置 ISCSI 和
  11. .Net 面试题 汇总(二)
  12. rexpathbs4
  13. 2018年6月11日笔记
  14. Linux内核分析——第七章 链接
  15. 云计算平台是什么意思?可以划分为哪三类?
  16. 乞丐一句话感动12亿人
  17. Python字符串日常练习(基础向)
  18. MySQL基础学习(三)————SQL语句的常用操作
  19. CSS 文字两行显示,超出隐藏
  20. 树莓派4B-Python-控制HC_SR501(微型人体红外感应模块)

热门文章

  1. 求高维方阵的绝对值最大特征值的方法:幂法(幂迭代)。
  2. 喻国明:“元宇宙”背后的未来图景
  3. 欧盟「人脑计划」​最新进展:新算法模拟生物进化,为大脑如何工作提供新见解...
  4. 用物理学来为生命技术及制度的演化找出规律-读《为什么世界不会失控》
  5. 222页斯坦福人工智能报告出炉:全球AI投资猛增680亿,北美博士学术机构就业率下降
  6. 业界 | 清华发布《人工智能芯片技术白皮书(2018)》
  7. 量子计算机不会“秒杀”经典计算机
  8. 深度睡眠中,记忆如何被保持?
  9. 硬件巨头正在崛起,中国独占鳌头
  10. 当你使用微信和 QQ 的时候,请不要忘记 ICQ 这个伟大的公司!