java基础知识——接口和抽象类

接口基础知识

接口是抽象方法和常量定义的集合,而没有属性和方法的实现。接口不是类,而是对类的一组需求描述。

接口的定义格式如下:

[public]interface<接口名>[extends<一系列接口>]{
	<常量或者抽象方法的集合>
}

一个例子:
public interface Runner{
	int id = 1;
	public void main();
	public void run();
	public void stop();
}

其中的interface用来定义接口,接口通常都定义为public类型。

接口特性

接口具有如下特性:

  • 接口中的常量默认且只能为public static final
  • 接口绝不能含有实例域,提供实例域和实现方法的任务要由实现接口的那个类来完成
  • 接口中只能定义抽象方法,并且这些方法默认为public abstract, 并且也只能是public abstract类型
  • 接口可以继承其他的接口(只能继承接口),并添加新的属性和抽象方法
  • 在接口声明方法中,不能使用native,static,final,synchronized,private,protected等修饰符,接口的所有方法自动的属于public,所以在接口的声明方法中,不用提供关键字public
  • java中不允许创建接口的实例,但是允许接口类型的引用变量,该变量必须引用实现了该接口的类的实例
  • java中不允许类的多继承,但是可以实现接口的多继承;一个类可以同时实现多个接口,并且重写的方法必须显式地声明为public
  • 实现接口是为了向外界声明自己具有某一项能力,并切实的实现这一能力;继承父类是因为父类之间确实存在着继承关系

抽象类

我们知道类具有继承关系,在类的继承结构中,位于上层的类更具有通用性,更加抽象。如果只将它派生到其他类但是不做为特定的实例类,我们将其称为抽象类

抽象类实例

Student类和Employee类均继承于Person类,我们将Person类作为一个抽象类。
如果在Student和Employee中均需要产生一段对其相应的描述,即需要getDescription方法,在Person类中应该做什么实现呢?
一种好的方法是使用abstract关键字,这样在Person类中完全不需要实现这个方法,而是在相应的子类中自行实现。

public abstract String getDescription();

为了提高程序的清晰度,包含一个或者多个抽象方法的类本身必须被声明为抽象的,即

abstract class Person{
	...
	public abstract String getDescription();
}
/**
*除了抽象方法,抽象类还可以包含具体数据和具体方法
*/
abstract class Person{
	private String name;
	public Person(String name){
		this.name = name;
	}
	public abstract String getDescription();
	public String getName(){
		return name;
	}
}

抽象方法起着占位的角色,具体实现在子类中。扩展抽象类可以有两种选择:

  • 在子类中定义部分抽象方法或者抽象方法也不定义,如果这样就必须将子类也标记为抽象类
  • 定义全部的抽象方法,这样子类就不是抽象类,可以进行实例化

抽象类不可以实例化,但是可以作为引用。

接口和抽象类

看起来,抽象类和接口很相似,那为什么java还要引入接口概念呢?为什么不直接将接口设计为抽象类?例如下面我的例子

abstract class Comparable {
	public abstract int ComparaTo(Object other);
}
Employee类直接扩展这个抽象类,并且提供compareTo方法的实现:
class Employee extends Comparable{
	public int compareTo(Object other){
	.....
	}
}

貌似这样也可以实现相应的功能,但是问题就在java是单继承的,一个类只能继承一个类。如果Employee已经扩展于一个类,就不能再扩展到第二个类了,但是使用接口可以继承多个接口,消除了上面的问题。

接口中的静态、默认方法(java8新特性)

default修饰的非抽象方法

java8中允许给接口添加非抽象的方法实现,只需要添加default关键字即可,称为** 扩展方法 **.实现该接口的子类可以直接使用该扩展方法。
注意: 扩展方法不可以覆写Object中的方法,但是可以重载Object中的方法。
default方法只可以通过实现类的对象来调用。

static声明的静态方法

在软件构造实验中,见到了使用static 修饰的静态方法,但是之前看过的资料都写着接口中不可以有static修饰的方法,查阅资料可知,这一特性是java新增的特性,使用static修饰的方法。静态方法的特征如下:

  • 只能通过接口名进行调用,不可以通过实现类的类名或者对象名来进行调用。

上一个关于java8之后对抽象类中的静态方法和扩展方法的详细说明CSDN博客

发布了13 篇原创文章 · 获赞 2 · 访问量 580

猜你喜欢

转载自blog.csdn.net/qq_43887432/article/details/104952267