Java 抽象类和接口的区别(包含新特性)

 关于Java抽象类和接口的区别,网上早已有各种帖子,但是在实际的运用中,我却发现了许多不同的情况,因此决定自己实验一下,写一份适合于JDK 8新特性的一份总结。

Java 抽象类和接口的区别(包含新特性)

 

 1、定义一个接口,其中包括了static方法和default方法

public interface InterfaceTest {
	int i = 1;//接口中定义的变量默认为 static final

	public static void OrMethod() {//接口中的static方法
		System.out.println("Interface Static Ordinary method");
	}

	public default void dOrMethod() {//接口中的default方法
		System.out.println("Interface default Ordinary method");
	}

	public abstract void InAbstractMethod();//接口的抽象方法,这是最常规的

	public static void main(String[] args) {
		OrMethod();
		System.out.println(i);
	}
}

2、再定义一个除了名称完全相同的接口

public interface InterfaceTest2 {
	int i = 1;//接口中定义的变量默认为 static final

	public static void OrMethod() {//接口中的static方法
		System.out.println("Interface Static Ordinary method");
	}

	public default void dOrMethod() {//接口中的default方法,同InterfaceTest2的default方法是同名的
		System.out.println("Interface default Ordinary method");
	}

	public abstract void InAbstractMethod();//接口的抽象方法,这是最常规的

	public static void main(String[] args) {
		OrMethod();
		System.out.println(i);
	}
}

3、定义一个类实现两个接口

import com.wzq.util.InterfaceTest;
import com.wzq.util.InterfaceTest2;

public class Demo02 implements InterfaceTest, InterfaceTest2 {//实现了两个接口

	@Override
	public void InAbstractMethod() {
		// TODO Auto-generated method stub

	}

	@Override
	public void dOrMethod() {//该类所继承的两个接口中有同名的default方法,因此必须覆写
		// TODO Auto-generated method stub
		InterfaceTest2.super.dOrMethod();
		System.out.println("Override default Method");
	}

	public static void main(String[] args) {
		InterfaceTest.OrMethod();//static方法只能用接口名调用
		Demo02 d = new Demo02();
		d.dOrMethod();//default方法只能用对象来访问
	}

}