【新手求解!】接口和抽象类有什么作用?
接口和抽象类有什么作用?
------解决方案--------------------可以归结为他们的不同点:
1)含义上(也就是作用),抽象类和接口都是我们面向抽象编程时所常选用的“基类”,而抽象类更能表示出对象的所属类别,接口则注重表示对象的特征和功能
2)一个类只能继承自一个抽象类,但可以实现多个接口,接口支持多继承
3)接口中所有的方法都是抽象方法(public),而在抽象类中定义的方法可以不限于抽象方法
4)接口中定义的成员变量默认都是public,final,static类型的,并且对该变量必须设置初值,而抽象类中没有此限制
------解决方案--------------------有很好的拓展性
------解决方案-------------------- 相当于C++的多重继承吧!
不同的类可以使用同种的接口和抽象类,增加自己的功能。
接口和抽象类有好几点不同。教材都有的。
我也是刚学没多久。
------解决方案--------------------首先,我们来看一下抽象类的概念,java编程思想中说“万物皆对象”,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类是表征我们对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。好比,我们都知道三角形是一个形状,世界上有三角形这样具体的东西,但是确没有形状这样具体的东西,我们要描述这个形状的概念就要用到抽象类。因此在java中抽象类是不允许被实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。那什么是类型隐藏呢?我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。好比,动物是一个抽象类,人、猴子、老虎就是具体实现的派生类,我们就可以用动物类型来隐藏人、猴子和老虎的类型。
再来看一下接口,接口是什么呢?Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口是一种特殊形式的抽象类。
抽象类和接口有很大的区别,首先,抽象类在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个接口。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
其次,在抽象类的定义中,我们可以赋予方法的默认行为。但是在接口的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。
已经提到过,抽象类在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在”is a”关系,即父类和派生类在概念本质上应该是相同的。对于接口来说则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已。接口表示的是”like a”关系。
使用抽象类来定义允许多个实现的类型,比使用接口有一个明显的优势:抽象类的演化比接口的演化要容易的多。在后续的发行版中,如果希望在抽象类中增加一个方法,只增加一个默认的合理的实现即可,抽象类的所有实现都自动提供了这个新的方法。对于接口,这是行不通的。虽然可以在骨架实现类中增加一方法的实现来解决部分问题,但这不能解决不从骨架实现类继承的接口实现的问题。由此,设计公有的接口要非常谨慎,一旦一个接口被公开且被广泛实现,对它进行修改将是不可能的。
所以,使用接口还是抽象类,取决于我们对问题的概念的本质理解和设计的意图。
------解决方案--------------------1.可以封装其具体实现。
2.多态的应用
------解决方案--------------------两个字 规范
------解决方案--------------------抽象类侧重于使用基类得体系结构。
接口。则是侧重于良好的扩展性。
------解决方案--------------------个人理解:
举个例子吧
public Class Dog{
public void cry(){
System.out.println("狗在叫");
}
}
public Class Pig{
public void cry(){
System.out.println("猪在叫");
}
}
public Class Test{
public static void main(String[] args) {
Pig pig = new Pig();
pig.cry();//调用猪叫的方法
}
}
//*********************************
public abstract class Animal{
public abstract void cry();
}
public Class Dog extends Animals{
public void cry(){
System.out.println("猪在叫");
}
}
//Dog方法同上
public Class Test{
public static void main(String[] args) {
Animal an = new Dog();//编译时确定调用哪个对象
}
}
除了动态的调用对象外,(父类的引用指向子类的对象)。有时候抽象和接口也是种约束,比如设计模式中有一种设计模式叫做--建造者模式,就比如,让你建造一个人的对象,人有头,身体,和四肢,如果你在抽象类中或者接口中加入了这几个方法,那么谁要建造个人的对象,必须实现建头部,建四肢,建身体的方法,起码你能保证人是完整的,不会因为漏写而出现缺胳膊少腿的情况。。还有哦,java的封装也有这些有关,就像上边的例子,如果你要增加一个猫cat类,你只需要知道Animal接口,而不要管Pig是怎么实现的,这样有助于信息的隐藏和安全性。。。。自己慢慢多理解下,就会理解它的好处了。。一个类只能继承一个父类,但是能实现多个接口,你还要多理解下抽象类和接口的去别等等。。
------解决方案--------------------接口是可插入性的保证。
在一个等级结构中的任何一个类都可以实现一个接口,这个接口会影响到此类的所有子类,但不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方法,而其子类可以从此类自动继承这些方法,当然也可以选择置换掉所有的这些方法,或者其中的某一些方法,这时候,这些子类具有了可插入性(并且可以用这个接口类型装载,传递实现了他的所有子类)。
我们关心的不是那一个具体的类,而是这个类是否实现了我们需要的接口。
接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口使得软件系统的灵活性和可扩展性,可插入性方面得到保证。