接口和抽象类
- 格式:docx
- 大小:12.98 KB
- 文档页数:1


抽象方法和接口的区别
抽象方法和接口是面向对象编程中的两个重要概念,它们之间存在以下区别:
1. 定义方式:抽象方法是在抽象类中定义的方法,使用关键字abstract修饰,没有方法体;接口是由方法签名组成的集合,使用关键字interface进行定义。
2. 继承关系:抽象方法通过继承的方式实现子类对该方法的重写,一个类只能继承一个抽象类;接口通过实现的方式实现对接口中方法的定义,一个类可以实现多个接口。
3. 状态:抽象方法可以有非抽象方法和属性,并可以包含构造函数,一个抽象类可以有自己的状态;接口只能包含抽象方法和常量,没有自己的状态。
4. 实例化:抽象方法不能直接被实例化,需要通过子类继承和重写来实现;接口不能被实例化,但可以通过实现类实例化,使用接口引用来调用实现类的方法。
5. 使用场景:抽象方法适用于需要有默认实现和状态的情况,可以用作基类从而提供一些共享的实现;接口适用于需要强制与不同类之间进行某种逻辑上的约束的情况。
总结来说,抽象方法提供了一种非强制性的基类实现,而接口则是一种强制性的实现规范。
抽象方法更强调类的继承和共享实现,接口更强调类的多态和实现规范。
实验6抽象类与接口一、实验目的:1、学习掌握抽象类的概念与使用方法。
2、学习掌握接口的概念与定义接口的方法。
3、学习使用Cloneable接口与clone方法进行对象内容的复制。
4、理解浅复制与深复制的概念,掌握覆盖clone方法进行对象内容深复制的技术。
二、实验任务:1、学习掌握抽象类的概念与使用方法。
程序要求:(1)首先创建一个类家族,其中抽象类几何图形类GeometricObject为父类,圆类Circle与矩形类Rectangle为子类。
几何图形类GeometricObject中定义保护型字符串变量color,表示图形的颜色;该类要具备构造方法与两个抽象方法findArea与findPerimeter,抽象方法findArea求图形面积,抽象方法findPerimeter求图形周长。
(2)Circle类与Rectangle类就是GeometricObject类的子类,其中应实现父类的抽象方法。
(3)程序主方法中创建两个几何对象,一个圆与一个矩形,并用GeometricObject类的引用变量引用它们,调用抽象方法。
2、学习接口的概念与利用接口实现多态的方法。
程序要求如下:(1)首先创建圆类Circle与圆柱体类Cylinder,其中Circle类就是父类,Cylinder类就是子类;(2)创建接口Comparable,其中包含一个抽象方法compareTo,用来比较对象的大小。
抽象方法compareTo的形式如下:public int compareTo(Object o);(3)创建类ComparableCircle,该类为Circle类的子类,并实现Comparable接口。
(4)创建类ComparableCylinder,该类为Cylinder类的子类,并实现Comparable接口。
(5)创建通用类Max,其中包含通用方法max,只要类实现了Comparable 接口,就可以使用max方法返回两个对象中较大的一个。
C++中抽象类和接⼝的区别抽象类(abstract class)和接⼝(interface)的概念是⾯向对象设计中常⽤的概念, 也是⽐较容易混淆的概念. 在这⾥, 我提出⼀种区分它们的思路:1. 如果⼀个类B在语法上继承(extend)了类A, 那么在语义上类B是⼀个类A.2. 如果⼀个类B在语法上实现了(implement)接⼝I, 那么类B遵从接⼝I制定的协议.------------------------------------------------------------------------------------------------使⽤abstract class的根本原因在于, ⼈们希望通过这样的⽅式, 表现不同层次的抽象.⽽interface的本质是⼀套协议. 在程序设计的发展中, ⼈们⼜发现接⼝可以⽤来表⽰对⾏为的抽象, 不过, 这只是interface的⼀种⽤法不是其本质. ------------------------------------------------------------------------------------------------理论结合实际才是最好的学习⽅式, 不过在这⾥, 我只想举⼀些我见到过关于接⼝使⽤的反⾯教材:1. 在接⼝中包含数据成员. 这⼏乎肯定是错的, 因为协议是规范是标准, 不应该跟具体实现有任何牵连, 也不应该给具体实现造成任何负担.2. C++中 delete 掉⼀个接⼝. 例如:class IInterface(){Public:Virtual ~IInterface(){};…}Class ClassImpl : public IInterface{…}Int main(){IInterface* pInterface = new ClassImpl();…delete pInterface;}从语法的⾓度和语⾔⾃⾝的⾓度来看, 这是可⾏的, ⽽且只要将接⼝的析构函数设置为virtual, 就能避免内存泄漏.但我要说, 这不是语法和语⾔的问题, ⽽是从根本上就错了.因为接⼝是⼀套协议, ⼀套规范, 并不是实现.Delete ⼀个接⼝的代码, 到底想要表达什么样的语义? 如果⼀段代码从语义上都说不通, 就不应该出现在程序中.------------------------------------------------------------------------------------------------------------------------要在C++中表现接⼝的概念, ⼀种做法是这样:class IInterface{public:virtual void DoSomething() = 0;// 不应当有析构函数, 因为从语义上说, 接⼝是不能delete的.}如果要delete, 只能delete⼀个类的实例:Class A{Public:Virtual ~A();Public:Virtual void DoSomething() = 0;}Class B : public A{…}Int main(){A* pA = new B();…Delete pA;}我们可以这样做, 因为pA对应的是⼀个实例, 我们可以在A这⼀层将其销毁.先举个例⼦,⽅便⼤家理解,然后从例⼦中抽象概括出结理论。
实验13 接口一、实验目的(1)熟悉接口的定义方法。
(2)了解Java语言实现多继承的途径。
二、实验内容第一题:学校中有老师和学生两类人,而在职研究生既是老师又是学生,对学生的被管理和对于教师的责任管理在他们身上都有体现。
(1)设计两个信息管理接口StudentManageInterface和TeacherManageInterface。
其中,StudentInterface接口包括setFee( )方法和getFee( )方法,分别用于设置和获取学生的学费:TeacherInterface接口包括setPay( ) 方法和getPay( ) 方法,分别用于设置和获取老师的工资。
(2)定义一个研究生类Graduate,实现StudentInterface接口和TeacherInterface接口,它定义的成员变量有name(姓名)、sex(性别)、age(年龄)、fee(每学期学费)、pay(月工资)。
(3)创建一个姓名为“zhangsan"的研究生,统计他的年收入和学费,如果收入减去学费不足2000元,则输出“provide a loan”(需要贷款)信息。
要求:(1)在Graduate中实现各个接口定义的抽象方法。
(2)对年学费和年收入进行统计,用收入减去学费,如果小于2000元则显示“providea loan”信息。
第二题:定义一个抽象类Bank,它包含有oneyearRate(定期利率)、oneyearNationaldebt(国债利率)和interestRate(活期利率)常数和count()方法及show()方法。
Count()方法用语对本息合计(存款本金+利息)进行计算,而show()方法用于对本息合计进行显示。
由于对不同的存款方式,利率是不同的,因此此程序分别定义多个子类实现对抽象类的继承,实现对利率的计算和显示。
注意:本程序定义了定期利率、活期利率、国债利率三种利率,按照一万元钱位存款单位进行统计,计算每种利率下存款一年后的本息合计。