200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 虚函数 抽象函数 抽象类 接口

虚函数 抽象函数 抽象类 接口

时间:2022-05-20 09:46:16

相关推荐

虚函数 抽象函数 抽象类 接口

1. Java虚函数

虚函数的存在是为了多态。

C++中普通成员函数加上virtual关键字就成为虚函数

Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为。如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数

PS:其实C++和Java在虚函数的观点大同小异,异曲同工罢了。

2. Java抽象函数(纯虚函数)

抽象函数或者说是纯虚函数的存在是为了定义接口。

C++中纯虚函数形式为:virtual void print() = 0;

Java中纯虚函数形式为:abstract void print();

PS:在抽象函数方面C++和Java还是换汤不换药。

3. Java抽象类

抽象类的存在是因为父类中既包括子类共性函数的具体定义,也包括需要子类各自实现的函数接口。抽象类中可以有数据成员和非抽象方法。

C++中抽象类只需要包括纯虚函数,既是一个抽象类。如果仅仅包括虚函数,不能定义为抽象类,因为类中其实没有抽象的概念。

Java抽象类是用abstract修饰声明的类。

PS:抽象类其实是一个半虚半实的东西,可以全部为虚,这时候变成接口。

4. Java接口

接口的存在是为了形成一种规约。接口中不能有普通成员变量,也不能具有非纯虚函数。

C++中接口其实就是全纯虚的抽象类(虚基类)。

Java中接口是用interface修饰的类。

PS:接口就是虚到极点的抽象类。

5.小结

C++虚函数==Java普通函数

C++纯虚函数==Java抽象函数

C++抽象类==Java抽象类

C++虚基类==Java接口

抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象。

比如:我们要描述“水果”,它就是一个抽象,它有质量、体积等一些共性(水果有质量),但又缺乏特性(苹果、橘子都是水果,它们有自己的特性),我们拿不出唯一一种能代表水果的东西(因为苹果、橘子都不能代表水果),可用抽象类来描述它,所以抽象类是不能够实例化的。当我们用某个类来具体描述“苹果”时,这个类就可以继承描述“水果”的抽象类,我们都知道“苹果”是一种“水果”。

抽象类(abstract class)的定义方式如下:

public abstract class AbstractClass //里面至少有一个抽象方法

{

public int t; //普通数据成员

public abstract void method1(); //抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法

public abstract void method2();

public void method3(); //非抽象方法

public int method4();

publi int method4 (){

……//抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现

}

public void method3(){

……//抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现

}

}

接口(interface)的定义方式如下:

public interface Interface

{

static final int i; //接口中不能有普通数据成员,只能够有静态的不能被修改的数据成员,static表示全局,final表示不可修改,可以不用static final修饰,会隐式的声明为static和final

public void method1(); //接口中的方法一定是抽象方法,所以不用abstract修饰

public void method2();//接口中不能赋予方法的默认行为,即不能有方法的具体实现

}

抽象类是一种功能不全的类,接口只是一个抽象方法声明和静态不能被修改的数据的集合,两者都不能被实例化。

接口是一种特殊形式的抽象类,在java语言中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,却可以实现多个接口。在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。

抽象类与接口的区别:

1.

接口是公开(public)的,里面不能有私有的方法或变量,是用于让别人使用的,实现接口的一定要实现接口里定义的所有方法。

而抽象类是可以有私有方法或私有变量的,实现抽象类可以有选择地重写需要用到的方法,但是必须实现里面所有的抽象方法。

2.

抽象类在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。

但是,一个类却可以实现多个interface(java中实现多重继承的方法之一)。

3.

抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法。

而在接口中,只能够有静态的不能被修改的数据成员(也就是必须是staticfinal的,不过在interface中一般不定义数据成员),而且所有的成员方法都是抽象的。

4.

抽象类和接口所反映出的设计理念不同。

其实abstractclass表示的是"is-a"关系,interface表示的是"like-a"关系。(组合是"hasa"关系)

5.

接口中定义的变量默认是publicstaticfinal型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

抽象类中的变量默认是friendly型,其值可以在子类中重新定义,也可以重新赋值。

一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。不是很建议具体类直接实现接口的。还有一种设计模式是面向接口编程,而非面向实现编程。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。