Java中的抽象、接口、Final修饰类与C++中抽象类和接口区别的概念解析

首先是复习一下基础概念,明白什么是抽象类和接口

一、抽象类:

我们把一类事物抽象出来,类中只声明方法,不实现,这就是抽象类存在的意义;

抽象类: 含有抽象方法的类,被abstract 关键字修饰;
抽象方法:只有方法声明没有方法实体,被abstract关键字修饰;

注意要点:
1、抽象类没有实例对象,只能通过别的类继承实现抽象方法;
2、抽象类可以含有普通方法,但是只要包含一个抽象方法,此类就是抽象类;
3、抽象方法需要通过继承来实现,所以抽象方法不能被private关键字所修饰;
4、继承了抽象类的类必须实现抽象类里面提供的所有抽象方法,不然这个子类依然是一个抽象类,需要被abstract所修饰;
5、一个子类只能继承一个抽象类;

[public] abstract class ClassName{ //定义了一个抽象类
  public abstract void fun(); //声明一个抽象方法
}

C++:
而在c++中的抽象类是特殊的类,只是不能被实例化(将定义了一个或多个纯虚函数的类称为抽象类);除此以外,具有类的其他特性;
重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能包括普通的方法
抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
虽然不能定义抽象类的实例,但是可以定义它的指针,并且指向抽象类的指针实际上在赋值时是指向其继承类的实例化对象的,这样通过统一的使用该指针可以很好的封装不同子类的实现过程,这在模式设计的过程中得到了极大的应用!

二、接口

接口泛指共别人调用的方法或者函数。它是对行为的抽象,比如一些动作:飞,跑、等
对接口的理解:接口就是将某个功能抽象出来,如果某个类需要,调用接口,实现接口中的方法;
interface 关键字: 用于定义接口,
implements 关键字:实现接口;
1、接口中只有方法声明,没有方法实现;
2、接口中定义的变量都默认为public static final;
3、接口中的方法类型默认abstract类型;
4、接口也可以向上转型,相当于多态;
5、接口可以继承,而且也可以多继承,而且不用实现父类接口的方法;
6、类实现多个接口,必须重写接口中所有的方法;
7、接口的出现就是为了解决抽象类只能被单继承的短板;

public interface InterfaceName{
  void fun();  
}

C++中的接口:
接口类应该是只提供方法声明,而自身不提供方法定义的抽象类。接口类自身不能实例化,接口类的方法定义/实现只能由接口类的子类来完成。

而对于C++,其接口类一般具有以下特征:

1.最好不要有成员变量,但可以有静态常量(static const或enum)
2.要有纯虚接口方法
3.要有虚析构函数,并提供默认实现
4.不要声明构造函数

如下就是一个最简单的例子:

class Testable
{
public:
    static const int START = 1;  // #1
    static const int STOP = 2;
 
    virtual void test() = 0;  // #2: 接口方法
 
    virtual ~Testable() {};   // #3: 从C++11开始可以: virtual ~Testable() = default;
}

总结一下C++:

1.接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女 人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人人可以吃东西,狗也可以吃东西, 你可以把“吃 东西”定义成一个接口,然后让这些类去实 现它.所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时 是生物和非生物),但 是可以实现多个接口(吃饭接口、走路接口)。

2.抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。

3.继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。

4.接口可以用于支持回调,而继承并不具备这个特点.(接口回调不理解的可以点我

5.抽象类不能被密封,一个类一次可以实现若干个接口,但是只能扩展一个(抽象类)父类 ;。

6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的.

7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。

8.抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。

9.好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。(如果一个类只是为实现了这个接口的中一个功能,而但是却不得不去实现接口中的其他方法,就叫接口污染。 )

10.尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知.(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用 到了对象组合的方法。比如asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调 用另外的类的方法和属性,这个是非常基本的一个设计原则。

11.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.

接口和抽象类的区别(java版)

抽象类 接口
关键字不同 abstract class ; extends(类继承抽象类) interface ;implements(类实现接口)
属性 实例变量 ; 静态 变量 ; 4个访问修饰符可以用于修饰属性 公开静态常量(public static final)
方法 抽象方法 ; 普通的成员方法 抽象方法(public abstract) ; 静态方法(jdk8.0)(public) ; 默认方法,带方法实现(public) ; 私有方法()
构造方法 有构造方法 没有构造方法
继承关系 单继承 多继承
posted @ 2021-06-18 13:23  hellogiao1  阅读(282)  评论(0)    收藏  举报