java中接口(interface)和抽象类(abstract)的区别、抽象类的使用场景、和c#之间的区别

java版本:jdk1.8

IDE:idea 18

这部分的东西经常被作为面试题拿来问,这里我们的关注点不是面试,而是它们的实际使用场景。

二者在表现形态上很像,都可以定义抽象方法,都不能直接使用,如下:

java中接口(interface)和抽象类(abstract)的区别、抽象类的使用场景、和c#之间的区别_第1张图片

接口里面的成员,默认是静态常量,里面的方法默认是抽象方法。所以ITest这个接口实现如下:

java中接口(interface)和抽象类(abstract)的区别、抽象类的使用场景、和c#之间的区别_第2张图片

这里的override可加可不加,如果不加,就要保证名称和接口里面的一致。而抽象类除此之外,还可以包含具体的实现。比如上面的截图,我们实现了一个属性property。但是接口只可以定义,并没有包含具体的实现。由此我们可以得出,接口和抽象类使用上的区别:

优先使用接口,当继承类有完全相同的逻辑时,可以考虑使用抽象类,将相同部分写到抽象类里面。抽象类可以继承接口,抽象类可以继承抽象类。所以你可以把抽象类当作一种不能进行实例化的特殊类。另外一个类里面,一旦有一个抽象方法,这个类就会成为抽象类。

由于一个类只能继承一个抽象类,而一个类可以继承多个接口。这就决定了,接口才更符合面向对象编程原则里面的接口隔离原则。才是我们推荐使用的东西,而抽象类,则是在特殊场合下才会使用。

再看一下c#:

c#里面的接口也支持属性,但是c#里面的接口不支持静态成员,不像java里面的接口,支持静态成员。

其他的,则和java没有太多区别。

另外这里多说一句,java继承父类的时候可以直接重写父类的方法,这个时候父类的方法是虚方法。但是在c#里面,必须用virtual来标识,不然不可以在子类里面重写,即使用override关键字覆盖父类方法。但是如果你写了一个方法名完全相同的方法,则会覆盖掉父类的方法,这个时候编译器会建议你在方法前加上new关键字来覆盖父类的方法。

你可能感兴趣的:(java中接口(interface)和抽象类(abstract)的区别、抽象类的使用场景、和c#之间的区别)