Java抽象类和接口的区别

Java抽象类和接口的区别

在学习Java的时候看到接口的概念,起初以为是函数的接口,学习了才发现它和抽象类十分神似,他们都是抽象的产物
然而从概念上,却十分好区分:

抽象类

抽象类的实现往往是is-a关系:
例如提供Fish抽象类:

abstract class Fish{//鱼
	private boolean isFast;
	public abstract void desrcibe();
	protected void swim() {
		System.out.println("我能游泳");
	}
}

它有自己的字段(isFast),有非抽象方法(swim),也有抽象方法(describe)
在声明它的一个子类时(如:金枪鱼),只需实现它的抽象方法(字段isFast可以留给对象来赋值),这个类就能用了,已实现的方法不用再写出来

class Tuna extends Fish{//金枪鱼
	boolean isFast = true;
	@Override //重写
	void desrcibe() {
		System.out.println("这是一条金枪鱼");
	}
}

从中可以归纳抽象类的特点:

  1. 除了不能被实现,抽象类和其他类没有任何区别
  2. java不支持多继承,所以一个子类只能有一个父类
  3. 抽象类中可以写方法的实现(方法体)
  4. 抽象类的字段和方法都可以用权限修饰符(public、private、protected等),如果不写权限修饰符,则默认是包内的类可访问

接口

接口的实现往往是can-do关系:
例如提供aquatic(水生)接口:

interface aquatic{//水生接口
	boolean isAquatic = true;
	void swim();
	void breath();
}

它也有字段(isAquatic),然而接口里的字段都默认是static final的,也就是常量,意味着在声明接口的时候就必须完成赋值,它的方法都没有权限修饰符,因为接口的方法只能也默认是public的
在实现该接口时,需将它的方法全部实现:

class Carp implements aquatic{//鲤鱼
	@Override
	public void breath() {
		System.out.println("我用鳃呼吸");
	}
	@Override
	public void swim() {
		System.out.println("我游得很慢");
	}
}

从中可以归纳接口的特点:

  1. 接口只能有常量字段
  2. 一个类可以实现多个接口,如这里的Carp还可以再声明一个卵生接口去实现它
  3. 接口中不能写方法的实现(方法体),但在jdk1.8以后可以接口里也可以写方法的默认实现(default标签),说明接口和抽象类的界限的确没那么严格了
  4. 抽象类的方法只能也默认是public的(不用写权限修饰符)
5+
Rhett Peng

软件工程大三在读学生,用个人网站记录学习动态

说点什么

avatar