接口和抽象类

基于面向对象四大特性:抽象、封装、继承、多肽而言,定义类的过程就是抽象和封装的过程,而接口与抽象类则是对实体类进行更高层次的抽象,仅定义类的公共行为和特征。接口和抽象类的共同点是都不能被实例化,但可以定义引用变量指向实例对象。

由于java是单继承,因此抽象类在被继承时体现的时is-a关系,接口在被实现时体现的是can-do关系。由此可见,接口的出现完美的解决了java单继承的问题

与接口相比,抽象类通常是对同类事物相对具体的抽象,通常包含抽象方法、实体方法、属性变量。如果一个抽象类只有一个抽象方法,那它就等同于一个接口。is-a关系需要符合里氏代换原则,例如Eagle is Bird.Bird is an Object。 can-do关系需要符合接口隔离原则,实现类要有能力去实现并执行接口中定义的行为,例如Plane can fly.Bird can fly. 可以将fly定义为一个接口,Plane类和Bird类一起实现fly接口,而不是 把fly()作为一个抽象类的方法,再通过is-a的关系去继承抽象类。

从设计层面来说,抽象类是对类的抽象,是模板式设计,接口是对行为的抽象,是行为的规范,也可以说是一种契约式设计

在jdk1.8之前(不包含1.8),接口中不能有静态方法,而抽象类中因为有普通方法,所以也可以存在静态方法。
在JDK1.8及JDK1.8以后,抽象类中依旧可以有静态方法,同时,接口中也可以定义静态方法。
下面代码在JDK1.8以后是没有问题的!

public interface Demo(){
	public static  void print(){
		system.out.println("Hello World");
	}
}

PS:JDK1.7中,接口只包含抽象方法,用public abstract修饰

public interface Demo(){
	public abstract void method();
}

在JDK1.8中,接口新增默认方法和静态方法:
默认方法:使用default修饰,在接口的实现类中可以直接调用,也可以复写该方法。
静态方法:使用static修饰,通过接口直接调用。

public interface Demo(){
	//默认方法
	public default void method(){
		system.out.println("default method");
	}
	//静态方法
	public static void print(){
		system.out.println("static method");
	}
}

在后面的JDK1.9中,接口新增了私有方法,用private修饰,私有方法可供接口内默认方法和静态方法调用

public interface Demo(){
	private void method(){
		 System.out.println("Hello World!");
	}
}
发布了1 篇原创文章 · 获赞 0 · 访问量 25
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览