快速理解抽象类与接口的区别
抽象类 _接口
二者有如下四点区别
接口 抽象类
接口与抽象类的区别如下
(1)接口支持多继承,而抽象类(具体类)只能继承一个父亲
(2)接口中不能有实例成员变量,接口所声明的成员变量全部都是静态变量,即使变量不加public static final修饰符也是静态常量。抽象类与普通类一样各种形式的成员变量都可以声明
(3)接口中没有包含构造方法,由于没有实例成员变量,也就不需要构造方法了,抽象类中可以有实例成员变量,也需要构造方法。
(4)抽象类中可以声明抽象方法和具体方法,java8之前接口中只有抽象方法,而java8之后接口中也可以声明具体方法,具体方法通过声明默认方法实现。
public interface InterfaceA {
void methodA();//抽象方法 省略public
//void methodB();
String methodB();
//默认方法
default int methodC() {
return 0;
}
//接口中的默认方法类似于类中的具体方法,给出了具体的实现
//只是方法修饰符的default
//接口中的静态方法类似于类中的静态方法
//默认方法
default String methodD() {
return "这是默认方法";
}
//静态方法
static double methodE() {
return 0.0;
}
}
package com.a51work6;
public interface InterfaceB extends InterfaceA {
//接口继承 由于接口中的方法都是抽象方法,所以继承之后也不需要做什么
@Override
default String methodB() {
// TODO Auto-generated method stub
return null;
}
//InterfaceB 继承了InterfaceA InterfaceB中的methodB()方法覆盖了InterfaceA
//事实上在接口中覆盖方法并没有什么实际意义 因为他们都是抽象方法 都是留给子类实现的
@Override
default int methodC() {
// TODO Auto-generated method stub
return InterfaceA.super.methodC();
}
}
package com.a51work6;
public class ABC implements InterfaceB, InterfaceA {
//某个类在实现接口时要声明使用implements 当实现多个接口时,接口之间用逗号隔开
//实现接口要实现接口中声明的全部方法
//java中只允许继承一个类,但可实现多个接口,通过实现多个接口来满足多继承
//实现接口时接口中原有的抽象方法在实现类中必须实现
//默认方法可以根据需要有选择的实现(覆盖)
//静态方法不需要实现,实现类中不能拥有接口中的静态方法
//静态方法
@Override
public void methodA() {
// TODO Auto-generated method stub
}
/*@Override
public void methodB() {
// TODO Auto-generated method stub
InterfaceB.super.methodB();
}*/
@Override
public String methodB() {
// TODO Auto-generated method stub
return "实现了methodB方法";
}
@Override
public int methodC() {
// TODO Auto-generated method stub
return 500;
}
}
package com.a51work6;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//声明接口类型,对象是实现类,发生多态
InterfaceA abc = new ABC();
//访问实现类methodB的方法
System.out.println(abc.methodB());
//访问默认方法methodC
System.out.println(abc.methodC());
//访问默认方法methodD
System.out.println(abc.methodD());
//访问InterfaceA静态方法methodE方法
System.out.println(InterfaceA.methodE());
//不能通过实现类ABC调用 可以这样理解接口中声明的静态方法与其他实现类没有任何关系
}
}