第08章.抽象类、接口
- 格式:pdf
- 大小:5.26 MB
- 文档页数:57
接⼝和抽象类的区别和作⽤(功能、⽤途、好处)接⼝:抽象类和接⼝亲兄弟,但是有嫡出庶出的区别总结了4点接⼝存在的意义:1、重要性:在Java语⾔中, abstract class 和interface 是⽀持抽象类定义的两种机制。
正是由于这两种机制的存在,才赋予了Java强⼤的⾯向对象能⼒。
2、简单、规范性:如果⼀个项⽬⽐较庞⼤,那么就需要⼀个能理清所有业务的架构师来定义⼀些主要的接⼝,这些接⼝不仅告诉开发⼈员你需要实现那些业务,⽽且也将命名规范限制住了(防⽌⼀些开发⼈员随便命名导致别的程序员⽆法看明⽩ 3、维护、拓展性:⽐如你要做⼀个画板程序,其中⾥⾯有⼀个⾯板类,主要负责绘画功能,然后你就这样定义了这个类。
可是在不久将来,你突然发现这个类满⾜不了你了,然后你⼜要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地⽅可能有引⽤他,这样修改起来很⿇烦。
如果你⼀开始定义⼀个接⼝,把绘制功能放在接⼝⾥,然后定义类时实现这个接⼝,然后你只要⽤这个接⼝去引⽤实现它的类就⾏了,以后要换的话只不过是引⽤另⼀个类⽽已,这样就达到维护、拓展的⽅便性。
4、安全、严密性:接⼝是实现软件松耦合的重要⼿段,它描叙了系统对外的所有服务,⽽不涉及任何具体的实现细节。
这样就⽐较安全、严密⼀些(⼀般软件服务商考虑的⽐较多)。
那么什么是接⼝呢?接⼝是⼀种能⼒1:接⼝的命名规则与类型不同。
如果修饰符是public。
则该接⼝在整个项⽬中可见,如果省略修饰符则该接⼝只能在该包可见2:接⼝中可以定义常量,不能定义变量,接⼝中的属性都会⾃动⽤public static final修饰,即接⼝中的属性都是全局静态常量,接⼝中的常量必须在定义时指定初始值3:接⼝中所有的⽅法抽象⽅法。
接⼝中的⽅法都会⾃动⽤public abstract修饰。
即接⼝中只有全局抽象⽅法,4:和抽象类⼀样,接⼝不能被实例化,接⼝中不能有狗构造⽅法5:接⼝之间可以通过extends 实现继承关系,⼀个接⼝可以继承多个接⼝。
什么是抽象类什么是接⼝两者有什么区别?如何使⽤它⼀、抽象类:抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象⽅法,这是普通类所不能的。
抽象⽅法只能声明于抽象类中,且不包含任何实现,派⽣类必须覆盖它们。
另外,抽象类可以派⽣⾃⼀个抽象类,可以覆盖基类的抽象⽅法也可以不覆盖,如果不覆盖,则其派⽣类必须覆盖它们。
⼆、接⼝:接⼝是引⽤类型的,类似于类,和抽象类的相似之处有三点:1、不能实例化;2、包含未实现的⽅法声明;3、派⽣类必须实现未实现的⽅法,抽象类是抽象⽅法,接⼝则是所有成员(不仅是⽅法包括其他成员);另外,接⼝有如下特性:接⼝除了可以包含⽅法之外,还可以包含属性、索引器、事件,⽽且这些成员都被定义为公有的。
除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。
⼀个类可以直接继承多个接⼝,但只能直接继承⼀个类(包括抽象类)。
三、抽象类和接⼝的区别:1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.⽽接⼝只是⼀个⾏为的规范或规定,微软的⾃定义接⼝总是后带able字段,证明其是表述⼀类类“我能做。
”.抽象类更多的是定义在⼀系列紧密相关的类间,⽽接⼝⼤多数是关系疏松但都实现某⼀功能的类中.2.接⼝基本上不具备继承的任何具体特点,它仅仅承诺了能够调⽤的⽅法;3.⼀个类⼀次可以实现若⼲个接⼝,但是只能扩展⼀个⽗类4.接⼝可以⽤于⽀持回调,⽽继承并不具备这个特点.5.抽象类不能被密封。
6.抽象类实现的具体⽅法默认为虚的,但实现接⼝的类中的接⼝⽅法却默认为⾮虚的,当然您也可以声明为虚的.7.(接⼝)与⾮抽象类类似,抽象类也必须为在该类的基类列表中列出的接⼝的所有成员提供它⾃⼰的实现。
但是,允许抽象类将接⼝⽅法映射到抽象⽅法上。
8.抽象类实现了oop中的⼀个原则,把可变的与不可变的分离。
抽象类和接⼝就是定义为不可变的,⽽把可变的座位⼦类去实现。
类、抽象类、接⼝、继承、实现Java|菜鸟教程类、抽象类、接⼝、继承、实现类的修饰符可以有——访问修饰符:public对所有类可见、 protected对同⼀包内的类和所有⼦类可见、 default(即默认,什么也不写): 在同⼀包内可见,不使⽤任何修饰符。
——⾮访问修饰符:static、 final、 abstract抽象类的定义是: abstract classpublic abstract class 抽象类名称{ ... }抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员⽅法和构造⽅法的访问⽅式和普通类⼀样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使⽤。
如果你想实现⼀个⽅法,这个⽅法能够在不同⼦类中实现不同的⽅法内容。
可以在⽗类定义抽象⽅法,⽤abstract关键字修饰⽅法,⽅法后⾯不添加⼤括号直接⽤分号结束(例如 public abstract double Compute();)。
如果⽗类有抽象⽅法,⼦类必须对这个抽象⽅法进⾏重写,除⾮这个⼦类依然是⼀个抽象类。
注意,构造⽅法和static修饰的⽅法不能定义为抽象⽅法。
抽象类中可以没有抽象⽅法,当时有抽象⽅法的只能是抽象类。
接⼝的修饰符:public和abstract接⼝中的成员变量只能是 public static final 类型的。
接⼝中的⽅法会指定为 public abstractpublic interface 接⼝名称 [extends 其他的接⼝名] { // 声明变量 // 抽象⽅法}顺便⼀提:1、synchronized 和 volatile也是修饰符,⽤于线程。
2、标记接⼝在⽂末提了⼀下抽象类和接⼝的区别1. 抽象类中的⽅法可以有⽅法体,就是能实现⽅法的具体功能,但是接⼝中的⽅法不⾏。
2. 抽象类中的成员变量可以是各种类型的,⽽接⼝中的成员变量只能是 public static final 类型的。
引言一个软件设计的好坏在很大程度上取决于它的设计模式,而任何一个设计模式都是和抽象分不开的。
从面向对象设计思想来看,复用的重点应该是抽象层的复用,而不是具体某个代码块的复用。
Java抽象类和接IEI代表的就是抽象类型,是我们需要提出的抽象层的具体表现。
二者作为实现抽象层定义的两种重要机制具有很大的相似性,但在实际应用中又有本质的区别。
1抽象类与接口的概念l,1什么是抽象类在面向对象的概念中,所有的对象都是通过类来描绘的,但并不是所有的类都是用来描绘对象的。
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类用来表示我对问题领域进行分析后得出的抽象概念,是对一系列看上去不同、但本质上相同的具体概念的抽象。
比如我们要开发一个管理乐器的软件,会发现问题领域存在着笛子、古筝等一些具体概念,它们是不同的,但都属于乐器,这里的乐器就是一个抽象概念。
下面将乐器定义为抽象类:abstract class Instrument{pub1ic abstract void play();public abstract void adjust()}public String what(){return ‘‘Instrument”I}}我们知道,类可以被实例化生成多个对象来使用,但抽象类不能被实例化,因为它包含了没有方法体只有方法声明的抽象方法。
如上例中的play()和adjust(),没有提供任何实现,因为每一种乐器的演奏和调节方式都是不同的,所以这些方法的实现细节只能在具体乐器中体现。
因此抽象类必须被继承,其中的抽象方法是强制子类必须实现的。
1.2什么是接口(J av a编程思想》中认为接口是纯的抽象类,即接口也是抽象的、不能被实例化的,更重要的是接口中的方法都是抽象的,这些方法要到实现这个接口的类中去实现。
接口的本质是在classes之间建立起一个协议,它只负责规定执行这个协议的类要实现哪几个方法,具体如何实现是由各个实现类自己决定的。
抽象类和接⼝等理解简单介绍⼀下抽象类和接⼝?1.抽象类中的抽象⽅法前⾯有默认的abstract修饰,不能⽤其他修饰符去修饰,原因是:抽象⽅法中没有⽅法体,是⽤来被继承的,所以private修饰符没有作⽤,static修饰符可以直接使⽤类名来调⽤访问该⽅法,抽象⽅法⽤static修饰就没有意义,因为可以直接⽤类名来调⽤了;synchronized是为该⽅法添加⼀个锁,如果该关键字修饰的是⼀个static⽅法,则使⽤的锁就是class变量的锁,如果修饰的是类⽅法,则使⽤this变量锁,但是抽象类不能实例化对象,因为该⽅法不是在该抽象类中实现的,锁应该归其⼦类所有,所以抽象类⽅法不能⽤synchronized修饰符修饰。
(为啥不能⽤native修饰抽象⽅法):因为native修饰符和abstract修饰符本⾝就存在⼀种冲突,他们都是⽅法的声明,只不过native是把⽅法实现交给了本地系统,abstract是把⽅法的实现交给了⼦类,如果同时存在,那么就不确定到底是交给了本地还是⼦类,到底是谁来实现这个⽅法。
2.接⼝是⼀个特殊的抽象类,接⼝中的⽅法全部是抽象⽅法abstract,但其前⾯的abstract可以省略,所以抽象类中的抽象⽅法不可以⽤的修饰符这⾥也不可以⽤,(还存在⼀个protected修饰符???)因为定义接⼝就是为了让所有需要的类去实现,不只是其⼦类,但是要⽤public去修饰,接⼝可以去继承⼀个已有的接⼝。
抽象类中抽象⽅法和接⼝的使⽤:1.相同点:都不能被实例化,都包含抽象⽅法2.不同点:(1):接⼝只能包含抽象⽅法,抽象类可以包含普通⽅法(2):接⼝中不能定义静态⽅法,抽象类可以(3):接⼝中不能定义普通属性,只能定义静态常量属性,抽象类可以(4):接⼝中不包含构造器,抽象类可以(不是⽤于创建对象⽽是让⼦类完成初始化)(5):接⼝可以多继承,抽象类只能单继承(只能有⼀个直接⽗类)总结:接⼝中的所有⽅法全是抽象⽅法只能是public abstract修饰,属性默认public static final修饰,抽象类除了包含抽象⽅法外和普通⽅法⽆区别。
实验八:抽象类和接口
【实验目的】
1.熟练掌握类的继承的概念。
2.掌握抽象类abstract的概念。
3.掌握接口interface的概念。
【实验地点】科技楼206
【课时安排】2课时
【实验内容】
1.定义一个抽象类--Shape,该类有求面积getArea和周长getPerimeter两个抽象方法。
该抽象类派生三角形Triangle、矩形Rectangle、圆Circle三个子类,为各个子类实
现抽象类的方法,并为这些子类编写合适的属性和构造方法。
编写程序分别创建三
角形、矩形、圆对象,并输出各个对象的面积和周长。
2.定义一个接口Drawable,该接口如下:
public interface Drawable{
public void draw();
public boolean isVisible();
}
对第一题中的三个派生子类,分别实现Drawable接口,并对创建的对象调用其实
现的接口方法。
(对于方法的实现可以尽量简单,如draw方法可以简单的打印出:“某某类的draw方法”)
【作业】
将第1题实验内容写实验报告。
接口与抽象类的区别与应用场景对比一、接口与抽象类的定义及特点在面向对象编程中,接口(interface)和抽象类(abstract class)是两种常用的抽象概念,它们都能够用来定义一种规范或者约束,但在使用时有着不同的特点和应用场景。
接口(Interface)接口定义了一组方法的签名,但不包含方法的实现。
一个类可以实现一个或多个接口,从而保证了这些方法在该类中都会被实现。
接口中的方法都是抽象的,而且只能包含常量和抽象方法。
接口是一种轻量级的抽象形式,用于描述类的行为,而不关心具体的实现细节。
抽象类(Abstract Class)抽象类本身无法被实例化,它包含了抽象方法以及普通方法。
抽象方法是没有具体实现的方法,必须在子类中被实现;而普通方法则可以有具体的实现。
抽象类可以包含属性、方法、构造函数等,其目的在于为其子类提供一个通用的模板或者骨架,以便于子类进行扩展或者重写。
二、接口与抽象类的区别1. 设计目的不同接口是用来描述类的行为或者能力,强调的是“做什么”的问题;而抽象类则是用来提供一个具体类的模板或者骨架,强调的是“怎么做”的问题。
2. 实现方式不同接口只能包含抽象方法和常量,而抽象类可以包含抽象方法、普通方法以及属性等。
一个类可以实现多个接口,但只能继承一个抽象类。
3. 灵活性不同由于一个类可以实现多个接口,因此接口提供了更大的灵活性;而抽象类在一定程度上限制了类的继承关系,因为Java是单继承的。
4. 扩展性不同抽象类可以包含成员变量和普通方法,可以为子类提供一些通用的方法或者属性;而接口只有抽象方法和常量,无法包含成员变量,因此扩展性相对较弱。
三、接口与抽象类的应用场景对比1. 接口的应用场景•当多个类具有相似的行为,但实现方式不同的时候,可以使用接口来定义这些行为;•当希望强制实现某些方法,但不关心具体实现时,可以使用接口;•当希望一个类实现多个不相关的行为时,可以使用接口来实现多继承的效果。